PHP PDO'da in Koşuluna Array Bind Etmek

Bir kaç gündür, üniversitelerin çeşitli sınav sonuçları için yayınladıkları kontenjanlarını içeren bir uygulama yazmakla meşgulüm. Kulağa basit gelse de beklediğimden daha çok iş gücü gerektiren bir proje oldu. Bu uygulama geliştirme sürecinde iki temel sorunu aşmam gerekti:

  1. Veritabanını performanslı ve maintainable bir şekilde kurgulamak.
  2. Karmaşık sorguları PDO ile hazırlayabilmek.

Veritabanı meselesini Louis Davidson abimizin ilham verici yazısı eşliğinde, 2-3 saatlik kalem-kağıt bir hesaplama ve kafa yorma süreciyle çözdüm.

Meraklısına: https://www.simple-talk.com/sql/database-administration/ten-common-database-design-mistakes/

PHP’de 2 yıla yakın bir süredir veritabanı bağlantıları ve işlemleri için PDO kullanıyorum. Nedenleri ise şurada:

http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/

pdo-to-db

Gel gelelim ki PDO bir extension olması sebebiyle bazı kompleks durumlar için her zaman açık çözümler sunmuyor ve insana saç baş yoldurtabiliyor. Yaşadığım durum, 4 grup altında toplanmış toplamda 20 checkbox’tan gelen verileri çeşit çeşit olasılıklarda sorguya dahil edebilmeye çalışmaktı. Örneğin 3 değer POST edebilen bir checkbox grubundan yalnızca biri seçilmiş olsaydı “=” veya “like” clause’u yeterli olabilirdi ancak seçim sayılarının arttığı durumlarda bir “array” gönderilecek ve bunları sorguya like veya = ile dahil etmek mümkün olmayacaktı ki akabinde clause’u “in” olarak değiştirmek gerekliydi. Fakat gelen array’i implode ettiğimde ise, PDO her zaman buna string veya float muamelesi yaparak yalnızca ilk değeri işleme alıyor, diğerlerini ise görmezden geliyordu. Örnekleyerek anlatayım:

Şöyle bir array gelsin ve bunu virgüller ile ayrıştıralım ki veritabanı sorgusuna uyumlu olsun:

Böylece elimizde $degerler adında ve temsili olarak ‘a,b,c,d’ yapısına sahip bir “string” oldu. Bunu sorguya bind etmek istersek:

gibi bir şey olacak. Sorgu bu şekildeyken “bind” temelde şöyle çalışıyor:

Burada ihtiyacım olan ise sorgunun şu şekilde çalışması:

Yani bir nevi dizi elemanlarını parçalamak. Ancak belirtmem gerekir ki, dizi elemanlarının sayısı kesin değil! Devamlı değişebiliyor ve post işlemi sonrasında bir döngüden geliyor! Bu yüzden statik çözümler ile bunu çözmek zor.

PDO’nun bu konu için bir çözümü veya yeteneği yok. Bu yüzden çözüm yolunu MySQL’in “find_in_set” fonksiyonu ile sağlayacağız:

ve hepsi bu kadar! Stackoverflow’dan görebileceğiniz üzere, bu sorun baya bir kişiye sıkınt yaratmış. Çözümler ve süper tartışma-örnekleri için:

http://stackoverflow.com/questions/920353/php-pdo-can-i-bind-an-array-to-an-in-condition

http://stackoverflow.com/questions/1586587/pdo-binding-values-for-mysql-in-statement?lq=1

2 thoughts on “PHP PDO'da in Koşuluna Array Bind Etmek”

Leave a Reply