Подтвердить что ты не робот

Готовый отчет PHP PDO - запрос MySQL LIKE

Я пытаюсь выполнить поиск через php PDO-класс (драйвер mysql). У меня есть следующий запрос, работающий с клиентом MySQL (имена таблиц изменены для защиты невинных):

SELECT    hs.hs_pk, 
          hs.hs_text, 
          hs.hs_did, 
          hd.hd_did, 
          hd.hd_text, 
          hv.hv_text, 
          hc.hc_text 
FROM      hs 
LEFT JOIN hd 
 ON       hs.hs_did = hd.hd_did 
LEFT JOIN hd 
 ON       hd.hd_vid = hv.hv_id 
LEFT JOIN hc 
 ON       hd.hd_pclass = hc.hc_id
WHERE     hs.hs_text LIKE "%searchTerm%"
LIMIT 25;

Это работает как шарм независимо от используемого вами поискового запроса. Однако, когда я перехожу к php, я не могу заставить его что-либо вернуть. Я пробовал несколько разных синтаксисов, которые кажутся логичными для работы, но я ничего не пробовал. здесь мой существующий код:

$handle = fopen('/foo/bar/test.log', 'w+');
fwrite($handle, "doSearch, with search term: $searchTerm\n");
$sql = 
'SELECT   hs.hs_pk, 
          hs.hs_text, 
          hs.hs_did, 
          hd.hd_did, 
          hd.hd_text, 
          hv.hv_text, 
          hc.hc_text 
FROM      hs 
LEFT JOIN hd 
 ON       hs.hs_did = hd.hd_did 
LEFT JOIN hd 
 ON       hd.hd_vid = hv.hv_id 
LEFT JOIN hc 
 ON       hd.hd_pclass = hc.hc_id
WHERE     hs.hs_text LIKE :searchTerm
LIMIT 25';

try {
 $dbh = new PDO('mysql:host=localhost;dbname=awdb', "user", "password");
 fwrite($handle, "connected to DB\n");
 $prep = $dbh->prepare($sql);
 $ret = $prep->execute(array(':searchTerm' => '"%'.$searchTerm.'%"'));

 while ($row = $prep->fetch(PDO::FETCH_ASSOC)) {
  $i++;
  $result[$i]['subText'] = $row['hs_pk'];
  $result[$i]['subText'] = $row['hs_text'];
  $result[$i]['subDid'] = $row['hs_did'];
  $result[$i]['devDid'] = $row['hd_did'];
  $result[$i]['devText'] = $row['hd_text'];
  $result[$i]['vendorText'] = $row['hv_text'];
  $result[$i]['classText'] = $row['hc_text'];
 }
    $dbh = null;
}   
catch (PDOException $e) {
  print "Error!: " . $e->getMessage() . "<br/>";
  die();
}

Я также пробовал следующее (предложение SQL WHERE и строки prep- > execute все это изменяется):

WHERE hs.hs_text LIKE CONCAT(\'%\', ?, \'%\') 
$ret = $prep->execute(array($searchTerm));

WHERE hs.hs_text LIKE "%:searchTerm%" 
$ret = $prep->execute(array(':searchTerm' => $searchTerm));

WHERE hs.hs_text LIKE ":searchTerm" 
$ret = $prep->execute(array(':searchTerm' => '%'.$searchTerm.'%'));

и т.д...

4b9b3361

Ответ 1

$ret = $prep->execute(array(':searchTerm' => '"%'.$searchTerm.'%"'));

Это неправильно. Вам не нужны двойные кавычки.

WHERE hs.hs_text LIKE ":searchTerm" 
$ret = $prep->execute(array(':searchTerm' => '%'.$searchTerm.'%'));

Это тоже неправильно. Попробуйте:

$prep = $dbh->prepare($sql);
$ret = $prep->execute(array(':searchTerm' => '%'.$searchTerm.'%'));

Объяснение: Подготовленные утверждения не просто заменяют строку. Они переносят данные, полностью отделенные от запроса. Цитаты нужны только при вложении значений в запрос.

Ответ 2

$prep = $dbh->prepare($sql);
$ret = $prep->execute(array('searchTerm' => $searchTerm));

Ответ 3

Ну, я решил это. И, честно говоря, я идиот... Спасибо всем за то, что вы заметили это и дали хорошие отзывы. Проблема была опечаткой в ​​имени таблицы (которую я изменил, поэтому никто здесь не сможет увидеть мою проблему, чтобы начать с...). Предложения действительно заставили меня найти проблему, однако, так что спасибо adam, jkndrkn и troelskn.

Для записи следующая комбинация работает хорошо:

WHERE aw_hcl_subdevices.hs_text LIKE CONCAT(\'%\', ?, \'%\')
$ret = $prep->execute(array($searchTerm));