Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal, estou desenvolvendo um CRUD com PHP e PDO. Criei um método para insert que recebe como parâmetro um array de objetos do tipo (telefone, usuario, login, endereço). Ao tentar inserir recebo o seguinte erro: Strict standards: Only variables should be passed by reference in... Segue abaixo o código:
Classe UsuarioDAO
<?php
include_once '../Config/Config.php';
include_once '../Conexao/ConnectionPDO.php';
/**
* Description of UsuarioDAO
*
* @author L.B.O
* @version 1.0
*/
class UsuarioDAO{
/**
*Armazena a instância de conexão com o banco de dados
* @var type
*/
private static $conn;
/**
*Armazena a sql que será executada no commit
* @var type
*/
private $sql;
/**
*Statement, responsável por executar os
* códigos sql no banco de dados
* @var type
*/
private $stmt;
/**
*Armazena o id do último registro adicionado
* ao banco de dados.
* @var type
*/
private $ultimoIdInserido;
/**
* Construtora da classe
*/
public function __construct() {
}
/**
* Método para inserir dados no banco
* @param type $arrayObjeto: Contém objetos do tipo telefone, usuário, login...
*/
public function save($arrayObjeto){
try {
#Variável local para armazenar o objeto usuário vindo do formulario
$usuario = $arrayObjeto[0];
#Variável local para armazenar o objeto endereço vindo do formulario
$endereco = $arrayObjeto[1];
#Obtém uma instância de conexão com o banco de dados
self::$conn = ConnectionPDO::getInstance();
#Inicia o transação
self::$conn->beginTransaction();
$this->sql = "INSERT INTO ".TB_USU."(".CAMPOS_USU.")
VALUES(:IDLOG,
:IDTIP_USU,
:IDDOC,
:IDEND,
:NOMUSU,
:EMAUSU,
:STATUSUSU,
:DATCADUSU,
:ANUNCIOGRATIS,
:ANUNCIOPAGO)";
#Preparando a query
$this->stmt = self::$conn->prepare($this->sql);
$this->stmt->bindParam(":IDLOG",$usuario->getIdLoginUsu(),PDO::PARAM_INT);
$this->stmt->bindParam(":IDTIP_USU",$usuario->getIdTipoUsuarioUsu(),PDO::PARAM_INT);
$this->stmt->bindParam(":IDDOC",$usuario->getIdDocumentoUsu(),PDO::PARAM_INT);
$this->stmt->bindParam(":IDEND",$usuario->getIdEnderecoUsu(),PDO::PARAM_INT);
$this->stmt->bindParam(":NOMUSU",$usuario->getNomeUsu(),PDO::PARAM_STR);
$this->stmt->bindParam(":EMAUSU",$usuario->getEmailUsu(),PDO::PARAM_STR);
$this->stmt->bindParam(":STATUSUSU",$usuario->getStatusUsu(),PDO::PARAM_STR);
$this->stmt->bindParam(":DATCADUSU",$usuario->getDataCadastroUsu(),PDO::PARAM_STR);
$this->stmt->bindParam(":ANUNCIOGRATIS",$usuario->getAnuncioGratisUsu(),PDO::PARAM_STR);
$this->stmt->bindParam(":ANUNCIOPAGO",$usuario->getAnuncioPagoUsu(),PDO::PARAM_STR);
$this->stmt->execute();
#obtem o ID do último usuario cadastrado
$this->ultimoIdInserido = self::$conn->lastInsertId();
#Executa o commit
self::$conn->commit();
} catch (PDOException $e) {
#Executa o rollBack em caso de erro
self::$conn->rollBack();
echo "Erro de exceção: " . $e->getMessage() . " Código: " . $e->getCode();
}
}
}
?>
O erro acontece neste trecho do código:
$this->stmt->bindParam(":IDLOG",$usuario->getIdLoginUsu(),PDO::PARAM_INT);
$this->stmt->bindParam(":IDTIP_USU",$usuario->getIdTipoUsuarioUsu(),PDO::PARAM_INT);
$this->stmt->bindParam(":IDDOC",$usuario->getIdDocumentoUsu(),PDO::PARAM_INT);
$this->stmt->bindParam(":IDEND",$usuario->getIdEnderecoUsu(),PDO::PARAM_INT);
$this->stmt->bindParam(":NOMUSU",$usuario->getNomeUsu(),PDO::PARAM_STR);
$this->stmt->bindParam(":EMAUSU",$usuario->getEmailUsu(),PDO::PARAM_STR);
$this->stmt->bindParam(":STATUSUSU",$usuario->getStatusUsu(),PDO::PARAM_STR);
$this->stmt->bindParam(":DATCADUSU",$usuario->getDataCadastroUsu(),PDO::PARAM_STR);
$this->stmt->bindParam(":ANUNCIOGRATIS",$usuario->getAnuncioGratisUsu(),PDO::PARAM_STR);
$this->stmt->bindParam(":ANUNCIOPAGO",$usuario->getAnuncioPagoUsu(),PDO::PARAM_STR);
Poderiam me ajudar????
Grato
http://stackoverflow.com/questions/6770850/pdo-pass-by-reference-notice
Antes de mais nada quero agradecer a ajuda.
No meu caso, passo como parâmetro um array de objetos, tenho que declarar uma variável para cada campo do meu objeto?
por exemplo: $nome = $objeto->getNome(), $email = $objeto->getEmail()... e assim por diante. Ou tem um jeito mais prático e rápido para se fazer isso?
vc pode trocar bindParam() por bindValue()
vc pode trocar bindParam() por bindValue()
Em relação a ataques sql injection, surte o mesmo efeito? ou terei que tratar isso separadamente?
sim o preparedStatement evita isso.
sim o preparedStatement evita isso.
OK. Agradeço sua ajuda, foi de grande valia. Usarei o bindValue.
Grato
http://stackoverflow.com/questions/6770850/pdo-pass-by-reference-notice