PDO WHERE "ile ...

2 Cevap php

Ben veritabanı erişimi için PDO kullanmak için bazı PHP kodu elden geçirilmesi, ama ben bir "WHERE ... IN" sorgusu ile bir sorun haline çalıştırıyorum.

Ben bir formda ürün kontrol edilir, hangi dayalı bir veritabanından bazı şeyleri silmek çalışıyorum. Listenin içeriği ve uzunluğu değişebilir, ancak bu örnek için, bu olduğunu hayal olacaktır:

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

Sonra sorgu şöyle:

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

Bunu yaptığınızda, sadece ilk kimliği silinir. (Ben ondan sonra virgül ve her şeyi dışarı atar varsayıyorum.)

Ben de $idlist bir dizi yapmak denedim, ama sonra bir şey silmez.

What's the proper way to use a list of items in a PDO prepared statement?

Solution

edorian 'cevabı benim için çalıştı, ama ben biraz ayrıntılı düşündüm.

İlk olarak, onay kutusu adları her bir dizinin parçası olduğunu gösterir:

<input type="checkbox" name="foos[]" value="bar">

Yani sunulması, ben tüm kontrol kutularının değerler dizisi $_POST['foos'] adlı bir değişken olsun.

Sonra bunu yapabilirsiniz:

//As many question marks as array entries; the last one needs no comma
$questionmarks = str_repeat("?,", count($_POST['foos'])-1) . "?";    
$query = "DELETE from `employee_customeraccount` WHERE `id` IN ($questionmarks)";
$st = $db->prepare($query);
//Each question mark is filled in with the next item in the array
$st->execute($_POST['foos']);

İşe yarıyor!

2 Cevap

Eğer hazırlanmış tablolar ile kontrol akış mantığı (virgül) ile Değerler (Sayılar) karştramazsnz beri Değer başına bir yer tutucu gerekir.

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

ve parametreleri bağlamak için döngü.

Ben belirli bir öğe silmek için kullanarak foreach dizi üzerinden $ idlist ve dizi, daha sonra sadece döngü yapmak istiyorum.

$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();
}