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.

È stato utile?

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:

  • typecast : (int)$_GET['yourval']
  • intval() funzione, che permette di specifica alla base di tale per essere utilizzato

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top