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.

¿Fue útil?

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 .


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:

  • typecast : (int)$_GET['yourval']
  • El intval() función, que le permite a uno específico de la base que de para ser utilizado

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top