Php / Pdo / Sql Detaylı (Çok Kriterli) Arama

Merhaba
Çalıştığım bir projede site sahibi üyelerine reklam ve promosyon bilgilerini mail yoluyla iletmek istediğini ve bu maillerin kendi seçeceği bir çok kritere sahip olan üyelerin özelliklerine göre seçebileceği bir toplu mail sistemi olmasını istedi.
Bir örnekle açıklamak gerekirse ; üyelerin içinden cinsiyeti “bayan”,  kilosu 60 kg üzerinde, şehri “Ankara”, ilçesi “Yenimahalle” ve mesleği “Memur” olan tüm üyelere “bla bla besin takviyesi” ni tanıtacak mail göndermek istiyor. Veri tabanında bu bilgilerin hepsi tutuluyor ama sorun şu bu adam bir başka promosyonu farklı kriterle göre de yapabilir olmalı yani sorgu tamamen dinamik olacak tıpkı emlak sitelerinde ev ararken girdiğiniz kriterler gibi.
Öyle bir kod yazmalıyız ki tamamen dinamik olmalı ve kullanıcının isteği dışında ki özelliklere sahip sonuçları göstermemeli.
Önce veri tablomuzu oluşturalım adı “üyeler” olsun id, cinsiyet, meslek,  il, ilce, kilo gibi bilgileri tutalım tablonun başka sütunları da olabilir ama biz örneği uzatmamak için kısa tutacağız, şimdi kodlarımızı yazalım.
İlk İşimiz iki adet değişken tanımlamak olacak ilk değişkenimiz $where dizisi, bu dizi kullanıcıdan gelen kriterleri tutacak, $sorgu değişekini ise en sonda $where dizimiz ile birleşip dinamik sql sorgumuzu oluşturacak .

$where = [];
$sorgu = "SELECT * FROM uyeler  ";

Şimdi gelelim kullanıcıdan gelen kriterleri yakalamaya, bu senaryoda kriterler post ile geliyor ama siz get ile de yapabilirsiniz önemli olan mantığını oturtmak.

if (isset($_POST['cinsiyet']) && !empty($_POST['cinsiyet']))
{
$where[] = 'cinsiyet like "%' . $_POST['cinsiyet'] . '%"';
}

Burada isset ile cinsiyet diye bir post gelmişmi ve bu post dolumu diye bakıyoruz eğer şartlarımız oluştuysa $where dizisinin içine sql sorgusunu oluşturacak cümleyi yazıyoruz. Burada dikkat edilmesi gereken yer şu, biz veri tabanına cinsiyeti string olarak girdik yani 1 ise erkek  2 ise bayan gibi bir mantık kullanmadık.
Eğer kullanıcı cinsiyet olarak “Erkek” seçmiş olsaydı $where dizisinin çıktısı şöyle olacaktı.

[“0”] => ‘cinsiyet like “%Erkek%”’

Diğer kriterleri de benzer şekilde yazalım.

// meslek seçeneği
if (isset($_POST['meslek']) && !empty($_POST['meslek']))
{
$where[] = 'meslek like "%' . $_POST['meslek'] . '%"';
}
// şehir seçeneğinde like yerine = işaretini  kullandık (amaç yapılabildiğini göstermek siz hangisi lazımsa onu kullanın)
if (isset($_POST['sehir']) && !empty($_POST['sehir']))
{
$where[] = 'sehir = "' . $_POST['sehir'] . '"';
}
// ilçe seçeneği
if (isset($_POST['ilce']) && !empty($_POST['ilce'])) {
$where[] = 'ilce = "' . $_POST['ilce'] . '"';
}

Şimdi geldik biraz daha karışık olan kısma, biz örneğimizde  kilo özelliğini kullandık ama örneğimizi  emlak olarak kurgulamış olsaydık bunu fiyat aralığı olarak yapacaktık
Burada kullanıcıdan minimum ve maksimum kilo bilgilerini alıyoruz ama kullanıcı sadece minimum yada sadece maksimum kilo bilgisi de gönderebilir yani belli bir kilonun üzeri yada belli bir kilonun altı olarak seçmek isteyebilir bu sebeple kodumuzu yazarken bu faktörü de göze almamız lazım.
İlk if koşulumuz da minkilo varsa ve boş değilse    veya   maxkilo varsa ve boş değilse diye sorguladık

if ( (isset($_POST['minkilo']) &&
!empty($_POST['minkilo']))      ||     (isset($_POST['maxkilo'])
&& !empty($_POST['maxkilo']))   )
{
// şartlar oluştuysa bu seferde önce minimum kiloyu sorgulayalım eğer
minimum kilo girilmemişse varsayılan olarak ‘0’ a eşitleyelim
if (empty($_POST['minkilo'])) {
$_POST['minkilo'] = 0;
} else {
$_POST['minkilo'];
// şimdi de
maxkilo yu sorgulayalım eğer maksimum  kilo girilmemişse varsayılan
olarak ‘999’ a eşitleyelim (bir  tonluk bir insan olamaz ama ya olursa
:) )

if (empty($_POST['maxkilo'])) {
$_POST['maxkilo'] = 999;
} else {
$_POST['maxkilo'];
}
$where[] = 'kilo BETWEEN ' . $_POST['minkilo'] . ' and ' . $_POST['maxkilo'] . ' ';
}
Sıra bu bilgileri bir arraya getirip sql sorgumuzu oluşturmaya geldi
if (count($where) > 0)  // dizi eleman sayısı 0 sıfırdan büyükse yani bir sorgu gönderilmişse
{
// bu diziyi başına WHERE ekleyip, her dizi elamanından sonra  and
anlamına gelen  “ && ” işareti ekleyerek birleştiriyoruz oluşan
bu yapıyı da ilk başta yazdığımız $sorgu değişkenine birleştiriyoruz
$sorgu .= 'WHERE ' . implode(' && ', $where);
}
Artık sorgu cümlemiz hazır bu cümleyi yukarda belirttiğimiz örnek şartlardaki gibi veriler gönderildiğiniz varsayarak echo ile yazdıralım ve çıktısına bakalım
cinsiyeti “bayan”,
kilosu 60 kg üzerinde,
şehri “Ankara”,
ilçesi “Yenimahalle”
mesleği “Memur” olan tüm üyeler
echo $sorgu;
//çıktısı
SELECT * FROM uyeler WHERE kilo BETWEEN 60 and 999 && cinsiyet like “% bayan %” && meslek like “% Memur %” && il  = “ANKARA” && ilce = “YENİMAHALLE”
Tüm bunları aşağıdaki gibi kullanarak veri tabanını tarayabiliriz.
$sor = $db->prepare("$sorgu");
$sor->execute(array());
Hepsini bir araya getirdiğimizde aşağıdaki gibi bir sonuç elde ederiz.
<?php


$where = [];
$sorgu = "SELECT * FROM uyeler  ";

// cinsiyet seçeneği
if (isset($_POST['cinsiyet']) && !empty($_POST['cinsiyet']))
{
$where[] = 'cinsiyet like "%' . $_POST['cinsiyet'] . '%"';
}

// meslek seçeneği
if (isset($_POST['meslek']) && !empty($_POST['meslek']))
{
$where[] = 'meslek like "%' . $_POST['meslek'] . '%"';
}

// şehir seçeneğinde like yerine = işaretini  kullandık (amaç yapılabildiğini göstermek siz hangisi lazımsa onu kullanın)
if (isset($_POST['sehir']) && !empty($_POST['sehir']))
{
$where[] = 'sehir = "' . $_POST['sehir'] . '"';
}

// ilçe seçeneği
if (isset($_POST['ilce']) && !empty($_POST['ilce'])) {
$where[] = 'ilce = "' . $_POST['ilce'] . '"';
}



if ( (isset($_POST['minkilo']) && !empty($_POST['minkilo']))    
  ||     (isset($_POST['maxkilo']) && !empty($_POST['maxkilo']))
   )
{
// şartlar oluştuysa bu seferde önce minimum kiloyu sorgulayalım eğer
minimum kilo girilmemişse varsayılan olarak ‘0’ a eşitleyelim
if (empty($_POST['minkilo'])) {
$_POST['minkilo'] = 0;
} else {
$_POST['minkilo'];
}
// şimdi de maxkilo yu sorgulayalım eğer maksimum  kilo girilmemişse
varsayılan olarak ‘999’ a eşitleyelim (bir  tonluk bir insan olamaz ama
ya olursa :) )

if (empty($_POST['maxkilo'])) {
$_POST['maxkilo'] = 999;
} else {
$_POST['maxkilo'];
}
$where[] = 'kilo BETWEEN ' . $_POST['minkilo'] . ' and ' . $_POST['maxkilo'] . ' ';
}
if (count($where) > 0)  // dizi eleman sayısı 0 sıfırdan büyükse yani bir sorgu gönderilmişse
{
// bu diziyi başına WHERE ekleyip, her dizi elamanından sonra  and
anlamına gelen  “ && ” işareti ekleyerek birleştiriyoruz oluşan
bu yapıyı da ilk başta yazdığımız $sorgu değişkenine birleştiriyoruz
$sorgu .= 'WHERE ' . implode(' && ', $where);
}

$sor = $db->prepare("$sorgu");
$sor->execute(array());





?>
Hepsi bu kadar bu mantıkla ister E-Posta sihirbazı yapın İster emlak Sitesi sorgusu yapın o kısmı size kalmış

Bir cevap yazın

Your email address will not be published.