2012-06-20 6 views
27

Я бег проблем в реализации LIKE в PDOреализовать LIKE запроса в PDO

У меня есть этот запрос:

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

Я проверил $var1 и $var2 они содержат оба слова, которые я хочу искать, мой PDO работает нормально, так как некоторые из моих запросов SELECTINSERT они работают, это просто, что я не знаком в LIKE здесь, в PDO.

Результат не возвращается. Действительно ли мой $query синтаксически правильный?

ответ

61

Вы должны включить % знаки в $params, а не в запросе:

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

Если вы хотите посмотреть на сгенерированный запрос в ваш предыдущий код, вы увидите что-то вроде SELECT * FROM tbl WHERE address LIKE '%"foo"%' OR address LIKE '%"bar"%', потому что подготовленный оператор цитирует ваши значения внутри уже указанной строки.

+0

+1 для объяснения .. Но я не думаю, что есть способ взглянуть на сгенерированный запрос .. есть ли что-нибудь подобное? – Vignesh

+0

Не мог понять это из-за жизни меня, и я все это забыл. Удивительный ответ. Благодаря! – b3tac0d3

5

Нет, вам не нужно указывать готовые заполнители. Кроме того, включите% меток внутри ваших переменных.

LIKE ? 

И в переменной: %string%

+0

Хм, прощения, но я не совсем уверен, как реализовать то, что вы только что предложили. –

+0

Я нахожусь на мобильном телефоне, но я постараюсь объяснить все, что могу. См. Мое редактирование. –

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

Вы можете увидеть ниже примере

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

Надеется, что это будет работать.

1

Просто используйте следующее:

$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

Это медленнее, чем добавление% непосредственно к связанным переменным. – CristiC

Смежные вопросы