PHP PDO bindValue () funktionieren nicht
Frage
<?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");
}
Das Problem ist auf dieser Linie: $stmt->bindValue(":index", $_GET['index'], PDO::PARAM_INT);
Und die spezifischen Parameter ist die zweite.
Der Code, wie er oben ist nicht funktioniert, es gibt nichts zurück, so dass die while-Schleife nicht ausgeführt wird. Wenn ich $ _GET [ ‚index‘] mit einer Reihe ersetzen, wie 10, es funktioniert ganz gut, es 10 Zeilen zurückgibt. Hallte $ _GET [ ‚index‘] zeigt eine Zahl, so sollte es eine Zahl übergeben. Ich habe auch bindParam versucht, aber das Ergebnis ist das gleiche.
Warum ist das nicht funktioniert?
EDIT:
Interessante ... Wenn ich $_GET['index'] with (int)$_GET['index']
ersetzen es funktioniert.
Lösung
Wenn Sie die Option $ stmt-> errorinfo () Sie tatsächlich feststellen, dass Ihre Abfrage ist fehlgeschlagen.
PDO :: PARAM_INT sagt PDO, dass Sie es für eine ganze Zahl geben. Wenn Sie nicht geben PDO eine ganze Zahl, PDO wird der Wert in der SQL-Zeichenfolge angeben.
SELECT id, name FROM testdb ORDER BY time DESC LIMIT "1", 10
Alle Werte in $ _GET sind entweder ein Array oder ein String. Sie haben die richtige Sache von $ _GET Nötigung [ ‚index‘] auf eine ganze Zahl, bevor sie als Wert verbindlich. Auf diese Weise wird PDO eine ganze Zahl, wurde eine ganze Zahl von PDO :: PARAM_INT erwarten, und daher wird der Wert in der SQL-Zeichenfolge nicht zitieren.
SELECT id, name FROM testdb ORDER BY time DESC LIMIT 1, 10
Andere Tipps
Werte in den $_GET
super-globalen Array sind Strings: PHP erraten nicht, was iin den Abfragezeichenfolgeflag übergeben wird
Wenn Sie einen Wert von $_GET
wollen als eine ganze Zahl in Betracht gezogen werden - das ist, was Sie wollen, hier -. Sie werden es auf eine ganze Zahl selbst konvertieren
Um das zu tun, können Sie:
-
typecast
:(int)$_GET['yourval']
- Die
intval()
-Funktion, die die Basis einer spezifischen ermöglicht, dass die verwendet werden
Sounds wie $ _GET [ 'index'] ist nicht das, was Sie erwarten, dass es sein. Verwenden Sie var_dump () näher der Wert zu überprüfen. Achten Sie auf die Länge der Zeichenfolge, die var_dump Berichte, da einige Zeichen sind visuell nicht sichtbar, aber die Länge der Saite wird die verborgene Geschichte erzählen.