2012-07-10 30 views
5

Recientemente, pasé al uso de PDO en PHP/MySQL y transformé algunas docenas de consultas. La mayoría de ellos trabajaron, sin embargo esto muy fácil uno lanza una excepción en $sql->execute()PDO - Número de parámetro inválido

$sql=$pdo->prepare("SELECT id FROM user WHERE username = :username LIMIT 1"); 
$sql->execute(array(':username',$username)); 

PDOStatement :: execute() pdostatement.execute SQLSTATE [HY093]: número de parámetro no válido: número de variables ligadas no coincide con el número de fichas en ...

Después de la investigación, he encontrado este enlace: https://bugs.php.net/bug.php?id=60515

... y por lo tanto trataron de cambiar la consulta a

$sql=$pdo->prepare("SELECT `id` FROM `user` WHERE `username` = :username LIMIT 1"); 
$sql->execute(array(':username',$username)); 

Pero sigue con el mismo resultado. ¿Alguien ve lo que obviamente está mal o por qué esta consulta no funciona cuando todos los demás lo hicieron?

¡Muchas gracias de antemano!

+0

"* PDO - Número de parámetro no válido ** aunque es correcto ***". No, es incorrecto – Lion

+0

@Lion: sí, tienes razón ... ya cambió el título ... ¡Estaba como ciego, gracias por tu ayuda! – Chris

Respuesta

5

Los ':username',$username sólo funciona en bindParam() Método:

$sql->bindParam(':username', $username, PDO::PARAM_STR); 

Echa un vistazo aquí: http://www.php.net/manual/de/pdostatement.bindparam.php

Para ejecutar lo necesario para pasar una arreglo correcto de valores de solo entrada:

$sql->execute(array(':username' => $username)); 

marcador de posición:

También puede utilizar esto:

$sql->execute(array($username)); 

Pero para ello es necesario para cambiar la consulta a este:

$sql=$pdo->prepare("SELECT `id` FROM `user` WHERE `username` = ? LIMIT 1");  

El? funciona como palceholder y toma las variables de la matriz. Cuando usa más marcador de posición en su declaración de SQL, la función elimina todas las variables de la matriz en su orden.

11

Esto no es un error, usted proporciona dos parámetros para un solo marcador de posición.

$sql->execute(array(':username',$username)); 

debe ser

$sql->execute(array(':username' => $username)); 
+0

¡Dios mío ... gracias! ¡qué lástima! – Chris

Cuestiones relacionadas