2011-07-21 13 views
8

:PDO pasar por aviso de referencia? Este

$stmt = $dbh->prepare("SELECT thing FROM table WHERE color = :color"); 
$stmt->bindParam(':color', $someClass->getColor()); 
$stmt->execute(); 

produce esto:

notificación en tiempo de ejecución
Sólo las variables deben ser pasados ​​por referencia

aunque todavía se ejecuta.

Este:

$stmt = $dbh->prepare("SELECT thing FROM table WHERE color = :color"); 
$tempColor = $someClass->getColor(); 
$stmt->bindParam(':color',$tempColor); 
$stmt->execute(); 

carreras sin queja.

No entiendo la diferencia?

Respuesta

6

El segundo parámetro de bindParam es una variable reference. Como no se puede hacer referencia a un retorno de función, no cumple estrictamente con las necesidades del parámetro bindParam (PHP trabajará con usted y solo emitirá una advertencia aquí).

Para tener una mejor idea, aquí está y el ejemplo: el código producirá los mismos resultados que el segundo ejemplo:

$stmt = $dbh->prepare("SELECT thing FROM table WHERE color = :color"); 
$tempColor = NULL; // assigned here 
$stmt->bindParam(':color',$tempColor); 
$tempColor = $someClass->getColor(); // but reassigned here 
$stmt->execute(); 

Eso no será posible con un retorno de la función.

9

La descripción de PDOStatement::bindParam() afirma que se une a una variable de PHP a un quesitonmark o llamado marcador de posición. Como intentas pasar el método de una clase (aunque ese método devuelve un valor) todavía no es un nombre de variable, de ahí la advertencia. Es posible que desee consultar PDOStatement::bindValue() para proteger su código a futuro.

2

Si se quiere evitar asignar el valor a una variable, puede ser mejor tratar:

$stmt = $dbh->prepare("SELECT thing FROM table WHERE color = ?"); 
$stmt->execute(array($someClass->getColor())); 

Como otros han mencionado, el error se produce porque PDO::statement->bindParam espera parámetro 2 sea una variable pasada por referencia.

-1

Si realmente desea enlazar un valor en lugar de una referencia, puede utilizar la PDOStatement::bindValue y luego código sería algo como esto:

$stmt = $dbh->prepare("SELECT thing FROM table WHERE color = :color"); 
$stmt->bindValue('color', $someObject->getColor()); 
$stmt->execute(); 
Cuestiones relacionadas