PHP DOP bindValue () non funzionano
Domanda
<?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");
}
Il problema è su questa linea: $stmt->bindValue(":index", $_GET['index'], PDO::PARAM_INT);
E il parametro specifico è la seconda.
Il codice così com'è di cui sopra non funziona, non restituisce nulla in modo che il ciclo while non viene eseguito. Se sostituisco $ _GET [ 'indice'] con un numero, come 10, funziona bene, restituisce 10 righe. Facendo eco $ _GET [ 'indice'] visualizza un numero, quindi dovrebbe passare un numero. Ho anche provato BindParam, ma il risultato è lo stesso.
Perché non è questo lavoro?
EDIT:
Interessante ... Se sostituisco $_GET['index'] with (int)$_GET['index']
funziona.
Soluzione
Se si controlla $ stmt-> errorInfo () si sarà effettivamente trovare che la query non è riuscita.
PDO :: PARAM_INT dice DOP che si stanno dando è un numero intero. Se non si danno DOP un numero intero, DOP citerà il valore nella stringa sql.
SELECT id, name FROM testdb ORDER BY time DESC LIMIT "1", 10
Tutti i valori in $ _GET sono o un array o una stringa. Hai fatto la cosa giusta da costringere $ _GET [ 'indice'] per un intero prima di binding come valore. In questo modo, DOP ottiene un numero intero, si aspettava un numero intero da DOP :: PARAM_INT, e quindi non citare il valore nella stringa sql.
SELECT id, name FROM testdb ORDER BY time DESC LIMIT 1, 10
Altri suggerimenti
I valori nel $_GET
serie super-global sono stringhe: PHP non indovinate un po 'è passato iin querystring
Se si desidera un valore da $_GET
da considerarsi come un intero - che è ciò che si vuole, qui -. È necessario convertirlo in un numero intero da soli
Per fare ciò, è possibile utilizzare:
Suoni come $ _GET [ 'indice'] non è quello che ci si aspetta che sia. Utilizzare var_dump () per ispezionare il valore più vicino. Prestare attenzione alla lunghezza della stringa che rapporti var_dump, perché alcuni personaggi non sono visivamente rilevabili, ma la lunghezza della stringa racconteranno la storia nascosta.