2010-03-03 16 views
19

Przebudowuję jakiś kod PHP, aby używać PDO do dostępu do bazy danych, ale mam problem z zapytaniem "WHERE ... IN".CHNP z zapytaniami "GDZIE ... NA"

Próbuję usunąć niektóre rzeczy z bazy danych, w oparciu o które elementy w formularzu są sprawdzane. Długość i zawartość listy będą się różnić, ale na ten przykład, wyobraźmy sobie, że jest to:

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

Następnie kwerenda wygląda następująco:

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

Kiedy to zrobić, tylko pierwszy ID jest usunięty. (Zakładam, że wyrzuca przecinek i wszystko po nim.)

Próbowałem także uczynić $idlist tablicą, ale potem nic nie usunęło.

Jaki jest właściwy sposób korzystania z listy pozycji w przygotowanym oświadczeniu PDO?

+0

Nie możesz dodać rozwiązania do swojego pytania. Jeśli uważasz, że jest lepszą odpowiedzią, odpowiedz na własne pytanie lub zasugeruj edycję oryginalnej odpowiedzi. – PhoneixS

+0

@PhoneixS Dobra rada, ale ostatnio dotknąłem tego pytania w 2010 roku i od tego roku tak naprawdę nie pracowałem z PHP. Jeśli chcesz, możesz edytować. –

Odpowiedz

24

Ponieważ nie można mieszać wartości (numery) z logiki przepływu sterowania (przecinkami) z przygotowanych sprawozdań potrzebny jest jeden zastępczy za Value.

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

i pętla do wiązania parametrów.

+0

Bardzo pomocne - dziękuję! –

+2

Miło, dzięki. Używam go jednak tak: 'implode (',', str_split (str_repeat ('?', Count ($ idList)));' – Alec

+6

Lub: 'implode (',', array_fill (0, count ($ idList), '?')); '(jeśli liczba> 0, która jest obowiązkowa również dla odpowiedzi), zobacz [' array_fill'] (http://php.net/array_fill), ['str_repeat'] (http: //php.net/str_repeat) – hakre

-3

Utworzę $ idlist i tablicę, po prostu przechodzę przez tablicę za pomocą foreach, aby usunąć konkretny element.

$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

Wykonalne podejście, ale drogie! Utrzymanie go w jednym zapytaniu byłoby * znacznie * ładniejsze. –

Powiązane problemy