2010-04-27 13 views
18

W tym zapytaniumysql PDO jak związać LIKE

select wrd from tablename WHERE wrd LIKE '$partial%' 

Próbuję powiązać zmienną '$partial%' z PDO. Nie wiesz, jak to działa na końcu pod %.

byłoby

select wrd from tablename WHERE wrd LIKE ':partial%' 

gdzie :partial jest zobowiązany do $partial="somet"

lub byłoby

select wrd from tablename WHERE wrd LIKE ':partial' 

gdzie :partial jest zobowiązany do $partial="somet%"

lub byłoby coś mi bardzo różne?

+3

Ostatnia opcja powinna działać – Cfreak

+1

... minus cytaty – bobince

Odpowiedz

27

+1 Karim obejmuje go. Można również powiedzieć:

"SELECT wrd FROM tablename WHERE wrd LIKE CONCAT(:partial, '%')" 

, aby utworzyć ciąg łączący się z końcem MySQL, ale nie ma żadnego konkretnego powodu w tym przypadku.

Rzeczy stają się nieco bardziej skomplikowane, jeśli poszukiwany częściowy kod wrd może zawierać znak procentu lub podkreślenia (ponieważ mają one specjalne znaczenie dla operatora LIKE) lub ukośnik odwrotny (który MySQL używa jako kolejną warstwę operator LIKE - niepoprawnie, zgodnie ze standardem ANSI SQL).

Mam nadzieję, że nie wpływa na ciebie, ale jeśli trzeba zrobić, aby dostać takim przypadku prawo, tutaj jest brudny rozwiązanie:

$stmt= $db->prepare("SELECT wrd FROM tablename WHERE wrd LIKE :term ESCAPE '+'"); 
$escaped= str_replace(array('+', '%', '_'), array('++', '+%', '+_'), $var); 
$stmt->bindParam(':term', $escaped); 
+2

+1 Teraz czytam to zdaję sobie sprawę, że to ty objęła ją, a nie mnie. – karim79

+1

Aby uciec lub nie uciec ... To zależy od intencji postaci. Czy miał zamiar być symbolem wieloznacznym lub dosłownym? Nie spodziewałbym się, że przygotowane oświadczenie zdecyduje o tym dla mnie. Jego zadaniem jest unikanie znaków w wartości, która spowodowałaby przerwanie klauzuli "LIKE" i wstrzyknięcie niechcianego sql. – Stoutie

+0

+1 za "niechlujne" rozwiązanie. Jedyne, czego nie użyłbym, to to, że chciałem dać moim użytkownikom możliwość umieszczania symboli wieloznacznych w ich własnych ciągach wyszukiwania. –

13
$var = "partial%"; 
$stmt = $dbh->prepare("select wrd from tablename WHERE wrd LIKE :partial"); 
$stmt->bindParam(":partial", $var); 
$stmt->execute(); // or $stmt->execute(array(':partial' => $var)); without 
        // first calling bindParam() 
$rs = $stmt->fetchAll(); 

pomocą parametrów znak zapytania: odpowiedź

$stmt = $dbh->prepare('select wrd from tablename WHERE wrd LIKE ?'); 
$stmt->execute(array('partial%')); 
$rs = $stmt->fetchAll(); 

http://www.php.net/manual/en/pdo.prepare.php

-4

Kto napisał answare (może być karim79):

$var ="partial%" 
$stmt =$dbh->prepare("select wrd from tablename WHERE wrd LIKE :partial") 
$stmt->bindParam(":partial",$var) 
$stmt->execute(); //or$stmt->execute(array(':partial'=>$var)); without 
        // first calling bindParam() 
$rs =$stmt->fetchAll(); 

pomocą parametrów znak zapytania:

$stmt =$dbh->prepare('select wrd from tablename WHERE wrd LIKE ?'); 
$stmt->execute(array('partial%')); 
$rs =$stmt->fetchAll(); 

Wielkie dzięki dla niego. Szukałem kodu & widziałem wiele przykładów, ale nie mogłem rozwiązać mojego problemu. Tym razem udało mi się to zrobić. Użyłem sekcji "Używanie parametrów znaku zapytania:" kodu.

Dla innych pomocy, jeśli chcesz pobrać wartość ze zmiennej można zmienić kod do

$stmt->execute(array($variable.'%')); 

zamiast

$stmt->execute(array('partial%')); 

Ponieważ słowo „częściowe” jest określony w odpowiedź i nie można go zmienić. Wielkie dzięki.

+0

To głównie podziękowania, a nie odpowiedzi. – ScottR

+0

to także nie jest twoje pytanie * lol !! * –

-1

ten sposób należy zrobić to

bindValue(':partial', '%' . $_GET['partial'] . '%'); 

Dzięki

Qwerty

-1

Poniższy kod pokazuje tylko pierwsze słowo w bazie danych!

"SELECT wrd FROM tablename WHERE wrd LIKE CONCAT(:partial, '%')" 

Spróbuj tego, jeśli chcesz wyszukać wszystkie słowa kluczowe z bazy

"SELECT wrd FROM tablename WHERE wrd LIKE :partial"; 
$stmt->execute(array(':partial'=>'%'.$YourVarHere.'%')); 
0

Można użyć addcslashes wcześniej przygotowanym oświadczeniu. Testowałem na mysql.

$value = addcslashes($value, '%'); 
$stmt = $db->prepare('select * from products where description like ?'); 
$stmt->execute(["$value%"]);