2013-02-20 6 views
0

У меня есть googled и много читал о том, как создать поиск в mysql с PDO, но я все еще не увенчался успехом в создании одного для себя.PHP PDO LIKE заявление неуспешно

Im, поиск в двух полях в моей таблице для одного и того же набора ключевых слов.

$str = explode(' ','app ban'); 
$p_id = 5; 
$search_term = ''; 
$stmt = $db->prepare('SELECT id from the_table WHERE p_id=:p_id AND (name LIKE :search_term1 OR text LIKE :search_term2)'); 
$stmt->bindValue(':p_id',$p_id, PDO::PARAM_INT); 
$stmt->bindValue(':search_term1',$search_term, PDO::PARAM_STR); 
$stmt->bindValue(':search_term2',$search_term, PDO::PARAM_STR); 
foreach($str as $key => $value) 
{ 
    $search_term = '%'.$value.'%'; 
    $stmt->execute(); 
    while($row = $stmt->fetchObject()) 
    { 
     if(!isset($res[$row->id])) 
      $res[$row->id] = 0; 
     $res[$row->id] = $res[$row->id] + 1*strlen($value); 
    } 
} 
print_r($res); 

Это дает пустой результат, даже если у меня есть строки «приложения» и «» запрет в ряде областей как в названии и тексте. Когда я делаю тот же поиск в phpmyadmin, я получаю много результатов.

Я попытался добавить некоторые цитаты вокруг ключевого слова: «%». $ Value '%' '; безуспешно. Я чувствую, что у меня нет вариантов. Пожалуйста помоги!

+0

Вы знаете, что можете использовать именованные параметры, верно? – Phil

ответ

2

Два ответных ответа верны относительно bindValue - он решает значение только один раз в момент его выполнения. Вы можете использовать bindParam, который разрешается при выполнении -> execute().

согласно PHP bindParam manual page

Связывает переменную PHP с соответствующим именем или вопросительным знаком заполнителя в операторе SQL, который был использован для подготовки отчета. В отличие от PDOStatement :: bindValue() переменная привязана как ссылка и будет оцениваться только в момент вызова PDOStatement :: execute().

+0

Aha! Таким образом, это разница между bindValue и bindParam. Большой! Это понимание помогает мне много. Благодаря! – Juniperus

1

ну вы определили $ search_term = '';, чтобы удалить строку, тогда вы использовали bindValue и использовали ту же переменную, которая имеет значение пустой строки.

Внутри цикла вы пытались присвоить

$search_term = '%' . $value . '%'; 

, но его уже были связаны таким образом, вы не можете изменить его. переместить

$stmt->bindValue(':search_term1',$search_term, PDO::PARAM_STR); 
$stmt->bindValue(':search_term2',$search_term, PDO::PARAM_STR); 

внутри цикла Еогеасп после

$search_term = '%' . $value . '%'; 
+0

Спасибо за ваш ответ. Это был bindParam, которого я искал. – Juniperus

0
  1. Вы устанавливаете $search_term в пустую строку
  2. Вы связать оба термина поиска как пустую строку
  3. Вы затем ввести цикл, повторно устанавливает значение $search_term, но не связывается повторно.
  4. Затем по какой-то причине вы выполняете запрос и извлекаете результаты, пока все еще находитесь в цикле из # 3.
+0

Спасибо за ваш комментарий. Я искал привязку параметра к запросу, так что мне не нужно связывать значение каждый раз, когда я изменяю значение параметра. Я делаю это, потому что я хочу искать каждое отдельное слово в строке поиска отдельно и читать результат внутри цикла. Я установил $ search_term в пустую, потому что я думал, что вам нужно объявить параметр перед его привязкой, что кажется ненужным. Еще раз спасибо! – Juniperus

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