PHP PDO bindValue () ne fonctionnent pas
Question
<?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");
}
Le problème est sur cette ligne: $stmt->bindValue(":index", $_GET['index'], PDO::PARAM_INT);
Et le paramètre spécifique est le second.
Le code tel qu'il précède ne fonctionne pas, il ne retourne rien si la boucle while n'est pas exécutée. Si je remplace $ _GET [ « index »] avec un certain nombre, comme 10, il fonctionne très bien, il retourne 10 lignes. Faisant écho $ _GET [ « index »] affiche un numéro, il devrait donc passer un certain nombre. J'ai aussi essayé bindParam, mais le résultat est le même.
Pourquoi est-ce pas de travail?
EDIT:
Intéressant ... Si je remplace $_GET['index'] with (int)$_GET['index']
cela fonctionne.
La solution
Si vous cochez $ stmt-> errorInfo () vous fait constater que votre requête a échoué.
PDO :: PARAM_INT indique PDO que vous lui donnez un entier. Si vous ne donnez pas un entier AOP, PDO la valeur de citer la chaîne SQL.
SELECT id, name FROM testdb ORDER BY time DESC LIMIT "1", 10
Toutes les valeurs de $ _GET sont soit un tableau ou une chaîne. Vous avez fait la bonne chose $ en forçant _GET [ « index »] à un nombre entier avant de se lier comme une valeur. En faisant cela, AOP obtient un entier, attendait un entier de PDO :: PARAM_INT, et donc ne citerons pas la valeur dans la chaîne SQL.
SELECT id, name FROM testdb ORDER BY time DESC LIMIT 1, 10
Autres conseils
Les valeurs dans le tableau super-global $_GET
sont des chaînes: PHP ne devine pas ce passé IIN le querystring
Si vous voulez une valeur de $_GET
être considéré comme un entier - qui est ce que vous voulez, ici -. Vous aurez besoin de le convertir en un entier vous
Pour ce faire, vous pouvez utiliser:
Sons comme $ _GET [ « indice »] est pas ce que vous attendez qu'il soit. Utilisez var_dump () pour inspecter la valeur plus proche. Faites attention à la longueur de la chaîne que les rapports de var_dump, parce que certains personnages ne sont pas détectables visuellement, mais la longueur de la chaîne racontera l'histoire cachée.