2012-05-16 13 views
5

Si tratta di un problema relativo alla parte LIMIT di una query SQL. Questo perché la query viene passata come una stringa. Ho visto another Q qui che si occupa di parametri di associazione, niente che si occupa di segnaposto con nome in un array.Impostazione LIMIT DOP/MySQL con segnaposto con nome

Ecco il mio codice:

public function getLatestWork($numberOfSlides, $type = 0) { 

$params = array(); 
$params["numberOfSlides"] = (int) trim($numberOfSlides); 
$params["type"] = $type; 

$STH = $this->_db->prepare("SELECT slideID 
    FROM slides 
    WHERE visible = 'true' 
     AND type = :type 
    ORDER BY order 
    LIMIT :numberOfSlides;"); 

$STH->execute($params); 

$result = $STH->fetchAll(PDO::FETCH_COLUMN); 

return $result;   
} 

L'errore che sto ottenendo è: Syntax error or access violation near ''20'' (20 è il valore della $numberOfSlides).

Come posso risolvere questo?

+0

provare a utilizzare $ params [ ""] = numberOfSlides (intval (trim ($ numberOfSlides)); –

+1

esatto DUP http://stackoverflow.com/questions/10437423/how-can-i-pass-an -array-of-pdo-parameters-yet-still-specific-their-types/10438026 # 10438026 – goat

risposta

9

Il problema è che execute() quotes the numbers e tratta come stringhe:

Dal manuale - Un array di valori con il maggior numero di elementi come ci sono parametri associati nell'istruzione SQL in esecuzione. Tutti i valori sono trattati come PDO :: PARAM_STR.

<?php 
public function getLatestWork($numberOfSlides=10, $type=0) { 

    $numberOfSlides = intval(trim($numberOfSlides)); 

    $STH = $this->_db->prepare("SELECT slideID 
           FROM slides 
           WHERE visible = 'true' 
           AND type = :type 
           ORDER BY order 
           LIMIT :numberOfSlides;"); 

    $STH->bindParam(':numberOfSlides', $numberOfSlides, PDO::PARAM_INT); 
    $STH->bindParam(':type', $type, PDO::PARAM_INT); 

    $STH->execute(); 
    $result = $STH->fetchAll(PDO::FETCH_COLUMN); 

    return $result; 
} 
?> 
+0

http://www.php.net/manual/en/pdostatement.execute.php#76966 –

+0

Grazie per la spiegazione dettagliata , ma ora ho un altro problema: 'Standard rigorosi: solo le variabili devono essere passate per riferimento' –

+0

Ho dovuto prendere' intval (trim ($ numberOfSlides)) 'fuori da bindParam, ora funziona :) –

3

Io suggerirei di legare i params e costringendo loro tipo:

$STH->bindParam(':numberOfSlides', $numberOfSlides, PDO::PARAM_INT); 
$STH->execute();