PHP DOP bindValue () no funcionan
Pregunta
<?php
try
{
$db = new PDO("mysql:host=localhost;dbname=DBNAME", "USER", "PASSWD");
$stmt = $db->prepare("SELECT id, name FROM testdb ORDER BY time DESC LIMIT :index, 10");
$stmt->bindValue(":index", $_GET['index'], PDO::PARAM_INT);
$stmt->execute();
while( $r = $stmt->fetch(PDO::FETCH_ASSOC) )
{
echo var_dump($r);
}
}
catch( PDOException $e )
{
die("Exception");
}
El problema es en esta línea: $stmt->bindValue(":index", $_GET['index'], PDO::PARAM_INT);
Y el parámetro específico es la segunda.
El código ya que es anterior no funciona, no devuelve nada por lo que no se ejecuta el bucle while. Si sustituyo $ _GET [ 'índice'] con un número, como 10, funciona muy bien, devuelve 10 filas. Haciendo eco de $ _GET [ 'índice'] muestra un número, por lo que debe pasar un número. También he intentado bindParam, pero el resultado es el mismo.
¿Por qué no está funcionando?
EDIT:
Interesante ... Si sustituyo $_GET['index'] with (int)$_GET['index']
funciona.
Solución
Si marca $ stmt-> errorInfo () en realidad se va encontrar que su consulta falló.
PDO :: PARAM_INT dice DOP que se está dando un entero. Si usted no da un número entero DOP, DOP a citar el valor en la cadena SQL.
SELECT id, name FROM testdb ORDER BY time DESC LIMIT "1", 10
Todos los valores de $ _GET son o bien una matriz o una cadena. Usted hizo lo correcto al coaccionar $ _GET [ 'índice'] a un entero antes de la unión como un valor. Al hacer esto, DOP recibe un número entero, que estaba esperando un número entero de PDO :: PARAM_INT, y por lo tanto no va a citar el valor en la cadena SQL.
SELECT id, name FROM testdb ORDER BY time DESC LIMIT 1, 10
Otros consejos
Los valores de la matriz $_GET
super-global son cadenas: PHP no adivina lo que pasa IIN la cadena de consulta ??p>.
Si desea un valor de $_GET
para ser considerado como un entero - que es lo que desea, aquí -. Que necesita para convertirlo en un entero a sí mismo
Con el fin de hacer eso, usted puede usar:
Sonidos como $ _GET [ 'índice'] no es lo que usted espera que sea. Utilice var_dump () para inspeccionar el valor más próximo. prestar atención a la longitud de la cadena que los informes var_dump, debido a que algunos caracteres no son detectables visualmente, pero la longitud de la cadena contarán la historia oculta.