LIKE deyimiyle PDO parametreleştirilmiş bir sorguyu nasıl oluşturabilirim?


108

İşte benim denemem:

$query = $database->prepare('SELECT * FROM table WHERE column LIKE "?%"');

$query->execute(array('value'));

while ($results = $query->fetch()) 
{
    echo $results['column'];
}

Yanıtlar:


124

Yayınladıktan hemen sonra anladım:

$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->execute(array('value%'));

while ($results = $query->fetch())
{
    echo $results['column'];
}

1
@Andrew: Ya çoklu likekullanılıyorsa? yürütme dizisi sırayla nasıl yürütülmelidir?
logan

Teşekkürler. csharp + Mysql + ODBC ile "%?%" gibi sütunun bulunduğu tablodan seç * kullanarak herhangi bir satır döndürmeyecekmiş gibi benzer bir sorun yaşadı; " ama eğer senden hoşlanırsam "sütun gibi olan tablodan * seçin?" ve parametre dizesini şu şekilde ayarlayın: string frag = $ "% {searchFragment}%"; daha sonra parametre değeri için frag kullanın. Tuhaf
sdjuan

2
PDO, yürütme çağrısında bu% 'den kaçıyor olmalıdır. Kaqai'nin cevabı daha iyi
Peter Bagnall

O değerinde üst belirterek görünüyor kullanıcı katkısıyla notu üzerinde PDOStatement :: BindParam dokümantasyon sayfasından bağlamadan önce değişkene yüzde işareti (ler) ekleyin: teklifler farklı bir yaklaşım.
Dan Robinson

Bu ileti dizisinin altına yakın, Sağduyu'nuzun sayfasından alınan gavin'in çözümüne bir göz atın. Basit. Mantıklı.
RationalRabbit

85

Adlandırılmış parametreleri kullanarak olanlar için, buraya nasıl kullanacağınız LIKEile %kısmi eşleştirme MySQL veritabanlarının :

Sütun_adı BİRLEŞTİRME GİBİ NEREDE ('%',: tehlikelistring, '%')

adlandırılmış parametrenin olduğu yer :dangerousstring.

Başka bir deyişle, %kendi sorgunuzda kesinlikle kullanıcı girişi olmayan ve ayrılmış olan açıkça çıkış karaktersiz işaretler kullanın .

Düzenleme: Oracle veritabanları için birleştirme sözdizimi , birleştirme operatörünü kullanır:, ||bu nedenle basitçe şu hale gelir:

Sütun_adı GİBİ '%' || : tehlikelistring || '%'

Ancak @bobince'nin burada bahsettiği gibi uyarılar var:

Zorluk Değişmez bir izin istediğinizde gelir %ya _da joker olarak hareket kalmadan arama dizesinde karakter.

Bu, beğenmeyi ve parametreleştirmeyi birleştirirken dikkat edilmesi gereken başka bir şey.


6
+1 - bu bana iyi bir yaklaşım gibi görünüyor, çünkü tüm birleştirme, yer tutucu değiştirildikten sonra veritabanında gerçekleşir ve bu, adlandırılmış yer tutucular kullanılabilir anlamına gelir. Yukarıdaki sözdiziminin Oracle için olduğunu belirtmek gerekir - MySQL'de sözdizimi böyledir LIKE CONCAT('%', :something, '%'). Referans: stackoverflow.com/a/661207/201648
Aaron Newton

1
Bu benim için tam olarak işe yaramadı, ancak beni doğru yola soktu. Çalışması için "%" GİBİ yapmak zorunda kaldım: "%" bir şey.
Christopher Smit

Bunun konu dışı olduğunu biliyorum, ancak bu deyimi kullanarak sql enjeksiyonunu gerçekleştirebildim, neden?
Thiago Dias

Bu benim için işe yaramadı, SQL komutuyla da test ettim SELECT * FROM calculation WHERE ( email LIKE '%' || luza || '%' OR siteLocation LIKE '%'|| luza ||'%' OR company LIKE '%' ||luza ||'%' )bu bana hata verirdi.
Luzan Baral

@AaronNewton and it means named placeholders can be used. PHP'de birleştirme yaptığınızda adlandırılmış yer tutucularla ilgili bir sorun nasıl oluyor? Açıktır ki PHP'de birleştirme, hem adlandırılmış hem konumsal desteği destekler ve herhangi bir veritabanı için aynı sorguyu kullanabileceğinizden daha taşınabilirdir. Neden bu kadar çok insanın adlandırılmış ve konumsal yer tutucular arasında herhangi bir fark olduğunu düşündüğünü gerçekten anlamıyorum .
Sağduyu

18
$query = $database->prepare('SELECT * FROM table WHERE column LIKE ?');
$query->bindValue(1, "%$value%", PDO::PARAM_STR);
$query->execute();

if (!$query->rowCount() == 0) 
{
    while ($results = $query->fetch()) 
    {
        echo $results['column'] . "<br />\n";
    }       
} 
else 
{
    echo 'Nothing found';
}

1
Kabul edilen cevaba göre bunu kullanmanın herhangi bir avantajı var mı? Kullanmak bindValueenjeksiyon saldırılarına karşı koruma sağlar mı ? Kabul edilen yanıt ?, arama dizesini %eski günlerde beğenecek şekilde birleştirerek yer tutucuları kullanmanın değerini temelde geçersiz kılar.
felwithe

$ Query-> rowCount () == 0'dan önce olumsuzlama kullanmanın anlamı nedir? Bu gerçekten mantıklı mı?
ssi-anik

15

Bunu da deneyebilirsiniz. Benzer bir problemle karşılaşıyorum ama araştırmadan sonra sonuç aldım.

$query = $pdo_connection->prepare('SELECT * FROM table WHERE column LIKE :search');

$stmt= $pdo_connection->prepare($query);

$stmt->execute(array(':search' => '%'.$search_term.'%'));

$result = $stmt->fetchAll(PDO::FETCH_ASSOC);

print_r($result);

Kodu bir kod bloğuna yerleştirmek için gönderinizi düzenledim - post biçimlendirme hakkında daha fazla bilgiyi stackoverflow.com/help/formatting adresinde okuyabilirsiniz . Başka bir kullanıcı yorum bırakmadan cevabınızı olumsuz oylamayı seçti, bu yüzden olumsuz oylamanın nedeninden emin değilim.
josliber

2
Tekrarlamak gerekirse, sorunuza oy vermedim; başka biri olumsuz oy verdi.
josliber

3

Bu çalışıyor:

search `table` where `column` like concat('%', :column, '%')

2

Bunu php sanrılarından aldım

$search = "%$search%";
$stmt  = $pdo->prepare("SELECT * FROM table WHERE name LIKE ?");
$stmt->execute([$search]);
$data = $stmt->fetchAll();

Ve benim için çalışıyor, çok basit. Onun dediği gibi, sorguya göndermeden önce "ilk önce tam anlamımızı hazırlamanız gerekir"


0

PDO "%" (sql enjeksiyon yol açabilir) kaçar önceki kodun kullanımı kısmi dizeleri eşleştirmek istiyor arzu sonuçlar verecektir: ANCAK 'don bile bir ziyaretçinin türleri ise karakter "%" Hala sonuçlar alırsınız Veri tabanında depolanan herhangi bir şey yok (sql enjeksiyonlarına neden olabilir)

Pek çok varyasyon denedim, hepsi aynı sonuçla PDO'dan "%" kaçarak istenmeyen / beklenmedik arama sonuçlarına yol açıyor.

Paylaşmaya değeceğini düşündüm, eğer biri etrafında bir kelime bulmuşsa lütfen paylaşın


1
Bu Kılavuzdan: us3.php.net/manual/en/pdo.prepared-statements.php Bu, konuyla ilgili başka bir gönderi: stackoverflow.com/questions/22030451/… Hakkındaki fikrinizi gerçekten bilmek isterim bu sorun.
Ozkar R

1
Olası çözüm (No test) Kullanım CONCAT gibi: $ sql = “öğesi GELEN ITEM_TITLE SEÇ NEREDE ITEM_TITLE GİBİ CONCAT ( '%', '%'?)”; Referans: blog.mclaughlinsoftware.com/2010/02/21/php-binding-a-wildcard
R

3
PDO% kaçmaz. Yanlış yapan sizin kodunuz. Çözüm için burada zaten verilmiş olan cevapları okumanız
Ortak

Önerileriniz için teşekkürler. Her neyse, test edilen kod kılavuzdaki koddu, SQL enjeksiyonunu önlemek için yer tutucu kullanarak yine aynı sonucu alıyorum Örnek # 6 Yer tutucu PDO'nun geçersiz kullanımı yukarıdaki kodu kullanarak% kaçışını kodumu değil. Forumda yeniyim ve burada yorum, gönderi ve itibar sürecinin nasıl işlediğini anlayamayabilirim, bunu bir sonraki yorumum için aklımda tutacağım çünkü önceki yoruma göre başkalarına yardım etmek veya yorum yapmak için itibara ihtiyacınız var. Teşekkürler.
Özkar R
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.