query extension php pdo

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.