PDO’da IN (...) için dizi bağlamak neden çalışmıyor?

0 Yanıt 3 Görüntülenme
Puanlayanlar
Katılımcılar
Konuyu Açan #1
PDO kullanırken sorgudaki tek bir parametreye PHP dizisi verip IN (:ids) kısmını halletmesini bekleyen çok kişi görüyorum. Parametre bağlama, bir değeri SQL ifadesine güvenli biçimde yerleştirir; birden fazla placeholder üretmez. Bu yüzden dizi için placeholder’ları kendimiz oluşturmalıyız:

KOD
1234567891011
$ids = [4, 9, 15];

if ($ids === []) {
    $rows = [];
} else {
    $marks = implode(',', array_fill(0, count($ids), '?'));
    $stmt = $pdo->prepare("SELECT id, name FROM users WHERE id IN ($marks)");
    $stmt->execute($ids);
    $rows = $stmt->fetchAll();
}


Buradaki sorgu metnine eklenen tek dinamik parça, uygulamanın ürettiği ? işaretleri; kullanıcı girdisi değil. Boş dizi durumunu da ayrıca ele almak gerekiyor: IN () bazı veritabanlarında sözdizimi hatası verir. Alternatif olarak boş listeyi “eşleşme yok” diye yorumlayıp sorguyu hiç çalıştırmamak genelde daha açık.

Bir başka karışıklık da her dinamik SQL parçasının parametre yapılabileceğini sanmak. Tablo adı veya ORDER BY sütunu placeholder ile bağlanamaz; bunlar için izin verilen değerlerden oluşan bir eşleme kullanmak gerekir.

Siz bu işi küçük bir yardımcı fonksiyonla mı çözüyorsunuz, yoksa sorgu katmanında başka bir yaklaşım mı tercih ediyorsunuz?

Yanıt vermek için giriş yapmış olmalısınız.

0 alıntı seçildi