2012-05-07 7 views
7

Utilizo el siguiente sql para obtener el valor del campo que_id de una línea específica de mi tabla y está funcionando bien. Tenga en cuenta que que_id (auto-incrementado) y los números de línea no son lo mismo.PHP PDO -> Error de devolución de consulta preparada (la misma consulta no está preparada para funcionar correctamente)

$qry_que_getid = $connexion->query('SELECT somefield FROM table ORDER BY somefield ASC LIMIT '.$lineNumberSeeked.', 1'); 

$row = $qry_que_getid->fetch(PDO::FETCH_ASSOC); 
echo $row['que_id']; 

Cuando intento de transformar esa consulta en una consulta preparada de la siguiente manera Tengo un error y yo no lo entiendo:

$qry_que_getid = $connexion->prepare('SELECT somefield FROM table ORDER BY somefield ASC LIMIT ?, 1'); 

$qry_que_getid->execute(array(4)); 

$row = $qry_que_getid->fetch(PDO::FETCH_ASSOC); 
echo $row['que_id']; 

me sale el siguiente error SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''3', 1' at line 1

somene Esperanza puede ayudarme a entender Gracias de antemano. Aclamaciones. Bagazo.

+1

No está ejecutando la misma consulta. La primera termina con 'LIMIT 3, 1' pero la segunda termina con 'LIMIT' 3 ', 1', así que no escribas que es la misma * query * cuando no lo es. – hakre

+0

Hola hakre. ¿De qué estás hablando? – Marc

+0

¿Ves las comillas simples alrededor del '3' en tu segunda consulta? Y Pradator tiene la solución para ti. – hakre

Respuesta

4

Desde el manual de PHP en http://www.php.net/manual/en/pdostatement.execute.php:

An array of values with as many elements as there are bound parameters in the SQL statement being executed. All values are treated as PDO::PARAM_STR.

La cláusula LIMIT está esperando un entero Creo que lo que debe utilizar el método bindParam() en su lugar.

$limit = 4; 
$qry_que_getid->bindParam(1, $limit, PDO::PARAM_INT); 
$qry_que_getid->execute(); 

De lo contrario, el parámetro se pasa como tipo PDO :: PARAM_STR en lugar de la esperada PDO :: PARAM_INT.

+0

Hola Pradador. Gracias por la entrada. Dame un segundo para probarlo. Voy a Revert ... – Marc

+0

intenté eso y tengo la siguiente error-> Fatal error: No se puede pasar el parámetro 2 por referencia en /myFilePath/myFile.php – Marc

+0

En cuanto a la firma del método en http: //www.php. net/manual/es/pdostatement.bindparam.php 'bindParam ($ parameter, & $ variable [, $ data_type [, $ length [, $ opciones_del_operador]]])' parece que bindParam() espera una referencia de variable para el argumento # 2. Trate de almacenar ese 4 en una variable $ limit y pasar la variable $ limit en su lugar. – Cowlby

Cuestiones relacionadas