extension - Error al sobrescribir bindParam en PHP
php pdo postgresql select (2)
Esto es un poco extraño, y bien podría estar codificando esto completamente mal - de ahí por qué he golpeado el mismo error dos veces en dos días, en partes completamente diferentes de un guión. El código que estoy usando está a continuación:
public function findAll( $constraints = array() ) {
// Select all records
$SQL = ''SELECT * FROM '' . $this->tableName;
// See if there''s any constraints
if( count( $constraints ) > 0 ) {
$SQL .= '' WHERE '';
foreach( $constraints as $field => $value ) {
$SQL .= $field . '' = :'' . $field . '' AND '';
}
}
// Remove the final AND and prepare the statement
$SQL = substr( $SQL, 0, -5 );
$PDOStatement = $this->PDO->prepare( $SQL );
// Loop through constraints and bind parameters
foreach( $constraints as $field => $value ) {
print ''Binding '' . $field . '' to '' . $value . ''
'';
$PDOStatement->bindParam( $field, $value );
}
$PDOStatement->execute();
var_dump($PDOStatement);
while ( $results = $PDOStatement->fetch( PDO::FETCH_ASSOC ) ) {
var_dump($results);
}
}
Soy bastante nuevo en el uso de PDO, pero básicamente estoy tratando de pasar una serie de restricciones, por ejemplo
array( ''active'' => 1, ''name'' => ''James'' )
y devolver todas las filas de la mesa
WHERE active = 1 AND name = ''James''
Si utilizo esta matriz, el SQL se ejecutó desde la primera
var_dump( )
es
SELECT * FROM {table} WHERE active = :active AND name = ''James''
exactamente como espero Los parámetros vinculados imprimen ''Vinculando activo a 1'' y ''Nombre de enlace a James'' - exactamente como se esperaba. Las filas existen en la base de datos, y sin embargo, el segundo
var_dump()
call for $ results no genera nada, es decir, no se devuelven las filas.
Si paso una matriz de una sola restricción, por ejemplo
array( ''active'' => 1 )
, esto funciona perfectamente bien Parece que cada vez que se pasan múltiples restricciones deja de funcionar.
Esto se debe a que bindParam
funciona vinculando a una variable, y usted está reutilizando la variable ( $value
) para múltiples valores. Pruebe con bindValue
en bindValue
lugar.
O mejor aún; Pase los valores como una matriz para execute
lugar. Esto hace que la declaración sea sin estado, lo que generalmente es algo bueno en la programación.
Como se mencionó, usar bindValue
lugar de bindParam
ciertamente lo logrará. Sin embargo, después de pasar un tiempo considerable solucionando este problema recientemente, descubrí una solución alternativa. Aquí se muestra cómo lograr el enlace de variable PDO en un bucle foreach utilizando bindParam:
Reemplace la siguiente línea de la publicación original:
$PDOStatement->bindParam( $field, $value );
...con este:
$PDOStatement->bindParam( $field, $constraints[$field] );
En lugar de vincular $value
, use $array_name[$array_key]
. Esto funciona porque ahora está vinculando a una variable única en lugar de una que se reutiliza en cada pasada del ciclo.
Sin embargo, la variable $field
utilizada como marcador de posición no necesita ser una variable única. Todavía no he investigado esto a fondo, pero una variable utilizada como marcador de posición parece procesarse inmediatamente (en lugar de asignarse como referencia de variable) incluso cuando se utiliza bindParam.
Además, como ya no necesitaría acceder $value
directamente, también podría reemplazar esto:
foreach( $constraints as $field => $value ) {
... con este:
foreach (array_keys($constraints) as $field) {
Esto es opcional, ya que funcionará bien sin este cambio. En mi opinión, se ve más limpio, ya que podría confundir más tarde por qué se asigna $value
pero nunca se usa.