2010-03-03 10 views
19

Sto rielaborando del codice PHP per utilizzare PDO per l'accesso al database, ma sto incontrando un problema con una query "DOVE ... IN".PDO con query "DOVE ... IN"

Sto tentando di eliminare alcune cose da un database, in base a quali elementi di un modulo vengono controllati. La lunghezza e il contenuto della lista variano, ma per questo esempio, immaginare che si tratta di questo:

$idlist = '260,201,221,216,217,169,210,212,213'; 

Poi la query si presenta così:

$query = "DELETE from `foo` WHERE `id` IN (:idlist)"; 
$st = $db->prepare($query); 
$st->execute(array(':idlist' => $idlist)); 

Quando faccio questo, solo il primo ID è cancellato. (Presumo che butta fuori la virgola e tutto quello che segue.)

Ho anche provato a fare una matrice $idlist, ma poi non cancella nulla.

Qual è il modo corretto di utilizzare un elenco di elementi in un estratto preparato PDO?

+0

Non è necessario aggiungere una soluzione alla domanda. Se pensi sia una risposta migliore, rispondi alla tua domanda o suggerisci la modifica alla risposta originale. – PhoneixS

+0

@PhoneixS Consiglio eccellente, ma l'ultima volta ho toccato questa domanda nel 2010 e da quel anno non ho più lavorato con PHP. Sentiti libero di modificare se vuoi. –

risposta

24

Dal momento che non è possibile combinare i valori (i numeri) con logica di flusso di controllo (le virgole) con le istruzioni preparate è necessario un segnaposto per valore.

$idlist = array('260','201','221','216','217','169','210','212','213'); 

$questionmarks = str_repeat("?,", count($idlist)-1) . "?"; 

$stmt = $dbh->prepare("DELETE FROM `foo` WHERE `id` IN ($questionmarks)"); 

e loop per associare i parametri.

+0

Molto utile - grazie! –

+2

Bello, grazie. Lo uso in questo modo però: 'implode (',', str_split (str_repeat ('?', Count ($ idList))))' – Alec

+6

Oppure: 'implode (',', array_fill (0, count ($ idList), '?')); '(se conta> 0 che è obbligatorio anche per la risposta), vedi [' array_fill'] (http://php.net/array_fill), ['str_repeat'] (http: //php.net/str_repeat) – hakre

-3

Vorrei creare $ idlist e array, quindi semplicemente scorrere l'array utilizzando foreach per eliminare l'elemento specifico.

$idlist = array('260','201','221','216','217','169','210','212','213'); 

$stmt = $dbh->prepare("DELETE FROM `foo` WHERE `id` = ?"); 
$stmt->bindParam(1, $id); 

foreach ($idlist as $item){ 
    $id = $item; 
    $stmt->execute(); 
} 
+7

Approccio pratico, ma costoso! Mantenerlo in una query sarebbe * molto * più bello. –