2012-06-20 10 views
27

Używam problemy we wdrażaniu jak w PDOwdrożyć LIKE kwerendy w PDO

mam tej kwerendy:

$query = "SELECT * FROM tbl WHERE address LIKE '%?%' OR address LIKE '%?%'"; 
$params = array($var1, $var2); 
$stmt = $handle->prepare($query); 
$stmt->execute($params); 

Sprawdziłem zawierają $var1 i $var2 zarówno słowa, które chcesz wyszukać, mój PDO działa dobrze, ponieważ niektóre z moich zapytań działają, po prostu nie jestem zaznajomiony z LIKE tutaj w ChNP.

Wynik nie jest zwracany. Czy mój $query jest poprawny pod względem składniowym?

Odpowiedz

61

Musisz zawierać % znaki na $params nie w zapytaniu:

$query = "SELECT * FROM tbl WHERE address LIKE ? OR address LIKE ?"; 
$params = array("%$var1%", "%$var2%"); 
$stmt = $handle->prepare($query); 
$stmt->execute($params); 

Jeśli chcesz spojrzeć na wygenerowanym w zapytaniu twój poprzedni kod, zobaczysz coś takiego jak SELECT * FROM tbl WHERE address LIKE '%"foo"%' OR address LIKE '%"bar"%', ponieważ przygotowana instrukcja zacytuje twoje wartości wewnątrz już cytowanego ciągu.

+0

+1 dla wyjaśnienia .. Ale nie sądzę, istnieje sposób, aby spojrzeć na wygenerowane zapytanie .. czy jest coś takiego? – Vignesh

+0

Nie mogłem tego zrozumieć przez całe moje życie i zapomniałem o tym wszystkim. Niesamowita odpowiedź. Dzięki! – b3tac0d3

5

Nie, nie musisz podawać zacytowania elementów zastępczych. Uwzględnij także% znaków wewnątrz zmiennych.

LIKE ? 

A w zmiennej: %string%

+0

Hmm, przepraszam, ale nie jestem pewien, jak wdrożyć to, co właśnie zaproponował. –

+0

Jestem na komórce, ale postaram się wytłumaczyć najlepiej jak potrafię. Zobacz moją edycję. –

4
$query = "SELECT * FROM tbl WHERE address LIKE ? OR address LIKE ?"; 
$params = array("%$var1%", "%$var2%"); 
$stmt = $handle->prepare($query); 
$stmt->execute($params); 
2

można zobaczyć poniżej przykład

$title = 'PHP%'; 
$author = 'Bobi%'; 
// query 
$sql = "SELECT * FROM books WHERE title like ? AND author like ? "; 
$q = $conn->prepare($sql); 
$q->execute(array($title,$author)); 

nadzieję, że będzie działać.

1

Wystarczy użyć następujących:

$query = "SELECT * FROM tbl WHERE address LIKE CONCAT('%', :var1, '%') 
      OR address LIKE CONCAT('%', :var2, '%')"; 

$ar_val = array(':var1'=>$var1, ':var2'=>$var2); 
if($sqlprep->execute($ar_val)) { ... } 
+0

Jest to wolniejsze niż dodanie% bezpośrednio do powiązanych zmiennych. – CristiC