Я пытаюсь построить логику для создания многословного оператора LIKE для использования с PDO.Создание многословного слова LIKE Подготовленный оператор для запроса PDO
Это берет строку поиска $ ул построить несколько частей LIKE секции:
$str = $_POST['str'];
$keywords = preg_split('/[\s]+/', $str);
$totalKeywords = count($keywords);
$search = "%$str%";
$sql_str = " AND post_content LIKE :search0 ";
for($i=1 ; $i < $totalKeywords; $i++){
$search_bit = ":search" . $i;
$sql_str .= " AND post_content LIKE $search_bit ";
}
Это SQL заявление - с $ sql_str прорезями в правильную точку:
$sql = "SELECT d.ID
, d.post_date
, d.post_content
, d.post_cat_id
, d.post_label
, c.fld_cat
FROM tbl_log_days d
, tbl_log_cats c
WHERE d.post_cat_id = c.fld_id " . $sql_str . "
ORDER BY post_date";
Тогда для связывания переменных, я попытался два подхода:
$stmt = $pdo->prepare($sql);
if (!empty($sql_str)) {
foreach ($keywords as $key => &$keyword){
$foo = '%'.$keyword.'%';
$stmt->bindParam(':search' . $key, $foo);
}
}
А также Тхи с (без амперсанда до ключевого слова $ в линии foreach):
$stmt = $pdo->prepare($sql);
if (!empty($sql_str)) {
foreach ($keywords as $key => $keyword){
$foo = '%'.$keyword.'%';
$stmt->bindParam(':search' . $key, $foo);
}
}
Однако, когда я ищу, например, «Прошлое холм» и проверить результат SQL, который на самом деле работать (я активировал ведение журнала запросов в MySQL), он занимает последнее слово в строке поиска:
SELECT d.ID
, d.post_date
, d.post_content
, d.post_cat_id
, d.post_label
, c.fld_cat
FROM tbl_log_days d
, tbl_log_cats c
WHERE d.post_cat_id = c.fld_id AND post_content LIKE '%past%' AND post_content LIKE '%past%'
ORDER BY post_date
Я сделал var_dump переменного $ ключевого слова при запуске поиска и возвращается:
string(4) "hill"
string(4) "past"
Я не могу работать с этим. Можно ли делать то, что я пытаюсь сделать?