v2.5.2
Giriş yap

SQL birden fazla kelimeyi bağımsız aratmak [ÇÖZÜLDÜ]

pcmemo
799 defa görüntülendi

Merhaba,

 $ara  = $_GET['ara'];
 $parcala = explode("+",$ara);
 
$sorgu=$db->prepare("SELECT * from tbl_urun_stok WHERE Keywords LIKE :ara");
$sorgu->execute(array(':ara' => '%'.$ara.'%'));

Yukarıdaki sorguda arama alanın ayazdığım 2 veya daha fazla kelimeyi (hangi biri veya hangileri varsa) sonuc gösterecek şekilde nasıl düzenlerim.

Bulduğum bir kod örneğinde GET parametresindeki kelimeleri + ayıracı ile parçalayıp kelime sayısınca LIKE 'ın sonuna or (veya and) ile ekliyor. Ama kendi kodlarıma uyarlayamadım.

Saygılar.

Sözüne ettiğim örnek kodların ekran görünütüsü : https://prnt.sc/rw59w0

Cevap yaz
Cevaplar (5)
pcmemo
1479 gün önce

GET parametresi boşlukları + olarak gönderdiği için input alanımı aşağıdaki gibi düzenleyip senin düzenlediğin kodlar sayesine amacıma ulaştım. Çok teşekkür ederim.

<input type="text" class="form-control" name="ara" onchange="this.value = this.value.replace(/ /g, ',')" placeholder="<?php echo $ara ?>" >`,
makifgokce
1480 gün önce
$ara = ltrim($ara, ',');
$ara = rtrim($ara, ',');
$parcala = explode(",",$ara);
    $sor = "SELECT * from tbl_urun_stok WHERE SatisTipi = 1 and UrunDurum = 1 AND (";
    for ($i=0; $i < count($parcala)-1 ; $i++) {
        $sor .="Keywords LIKE '%$parcala[$i]%' OR ";
    }
    $sor .= "Keywords LIKE '%$parcala[$i]%')";
    echo $sor;
    
$sorgu=$db->prepare($sor);
$sorgu->execute();

+ ile olduğunda explode nedense çalışmıyor.+ yerine , veya başka bişey kullanın.
$_GET ile gelen değerin başında veya sonunda , olursa sorguyu bozmaması için ltrim ve rtrim ile temizleyin.$sorgu->execute(); bu kısımda tekrar $ara değişkenini kullanmanıza gerek yok.

pcmemo
1480 gün önce

Kodlar sanki aslında istediğimi vermesi gerekiyor doğru gibi ama sonu aynen yazdığım gibi yani %kelime1 kelime2%

Aşağıya tüm kodlarımı koyuyorum belki gözümden kaçana başka engel bir durum vardır?

<?php 
if (isset($_GET['ara'])) {
 $ara  = $_GET['ara'];

 $parcala = explode("+",$ara);
    $sor = "SELECT * from tbl_urun_stok WHERE SatisTipi = 1 and UrunDurum = 1 and ";
    for ($i=0; $i < count($parcala)-1 ; $i++) {
        $sor .="Keywords LIKE '%$parcala[$i]%' or ";
    }
    $sor .= "Keywords LIKE '%$parcala[$i]%'";
    echo $sor;

$sorgu=$db->prepare($sor);
$sorgu->execute(array(':ara' => '%'.$ara.'%'));

} else {

$sorgu=$db->query("SELECT * from tbl_urun_stok WHERE SatisTipi = 1 and UrunDurum = 1");
$sorgu->execute();
}
?>


<?php 
if($sorgu->rowCount()){  foreach ($sorgu as $row2) { ?>

Aranan kritere göre ıkan sonuçların listenmesi..
            
            <?php } ?>
            <?php } else { ?>

Aradıüınız kriterde ürün bulunamadı!..

         <?php   } ?>
pcmemo
1480 gün önce

@makifgokce yanıt için telekkür ederim.

bu hali ile arama satırına kelime1 kelime2 aradıımızı düşünürsek

SELECT * from tbl_urun_stok WHERE Keywords LIKE '%kelime1 kelime2%'

olarak çıktı veriyor.

Ama bana şu tip çıktı verecek şekilde lazım.

SELECT * from tbl_urun_stok WHERE Keywords LIKE '%kelime1%' or Keywords LIKE '%kelime2%'
makifgokce
1480 gün önce
$parcala = explode("+",$ara);
    $sor = "SELECT * from tbl_urun_stok WHERE ";
    for ($i=0; $i < count($parcala)-1 ; $i++) {
        $sor .="Keywords LIKE '%$parcala[$i]%' or ";
    }
    $sor .= "Keywords LIKE '%$parcala[$i]%'";
    echo $sor;

bu şekilde dene