2010-03-03 17 views
19

Ich bin etwas PHP-Code um PDO für den Datenbankzugriff zu verwenden, aber ich habe ein Problem mit einer "WHERE ... IN" Abfrage.PDO mit "WHERE ... IN" Abfragen

Ich versuche, einige Dinge aus einer Datenbank zu löschen, basierend darauf, welche Elemente in einem Formular überprüft werden. Die Länge und der Inhalt der Liste wird variieren, aber für dieses Beispiel vorstellen, dass es das ist:

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

Dann sieht die Abfrage wie folgt:

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

Wenn ich dies tun, nur die erste ID ist gelöscht. (Ich nehme an, es wirft das Komma und alles danach hinaus.)

Ich habe auch versucht, $idlist ein Array zu machen, aber dann löscht es nichts.

Was ist der richtige Weg, um eine Liste von Elementen in einer PDO-Prepared-Anweisung zu verwenden?

+0

Sie müssen keine Lösung in Ihrer Frage hinzufügen. Wenn Sie denken, dass es eine bessere Antwort ist, beantworten Sie Ihre eigene Frage oder schlagen Sie die Bearbeitung der ursprünglichen Antwort vor. – PhoneixS

+0

@PhoneixS Feine Ratschläge, aber ich habe diese Frage zum letzten Mal im Jahr 2010 berührt und seither nicht wirklich mit PHP gearbeitet. Fühlen Sie sich frei zu bearbeiten, wenn Sie möchten. –

Antwort

24

Da Sie nicht Werte mischen (die Zahlen) mit Steuerablauflogik (das Komma) mit vorbereiteten Anweisungen benötigen Sie einen Platzhalter pro Wert.

$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)"); 

und Schleife, um die Parameter zu binden.

+0

Sehr hilfreich - danke! –

+2

Schön, danke. Ich benutze es so: 'implode (',', str_split (str_repeat ('?', Zaehler ($ idList))));' – Alec

+6

Oder: 'implode (',', array_fill (0, count ($ idList), '?')); '(wenn count> 0, was auch für die Antwort verpflichtend ist), siehe [' array_fill'] (http://php.net/array_fill), ['str_repeat'] (http: //php.net/str_repeat) – hakre

-3

Ich würde $ IDLISTE und Array machen, dann einfach durch das Array mit foreach Schleife das spezifische Element zu löschen.

$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

Bearbeitbarer Ansatz, aber teuer! Es in einer Abfrage zu halten wäre * viel * schöner. –

Verwandte Themen