2016-05-11 2 views
0

Я пытаюсь построить логику для создания многословного оператора 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" 

Я не могу работать с этим. Можно ли делать то, что я пытаюсь сделать?

ответ

0

я задал тот же вопрос о Sitepoint: https://www.sitepoint.com/community/t/multi-word-like-prepared-statement-for-pdo-query/223738/5

И получил решение там:

$stmt = $pdo->prepare($sql); 
if (!empty($sql_str)) { 
    for ($x = 0; $x<$totalKeywords; $x++) { 
    // add the percent signs, or make a new copy of the array first if you want to keep the parameters 
    $keywords[$x] = "%" . $keywords[$x] . "%"; 
    $stmt->bindParam(':search' . $x, $keywords[$x]); 
    } 
} 
0

Я хотел бы сделать что-то вроде этого

for($i=1 ; $i < $totalKeywords; $i++){ 
    $search_num = "search" . $i; 
    $search_bit = ":" . $search_num; 
    $sql_str .= " AND post_content LIKE $search_bit "; 
    $foo = '%'.$keyword.'%'; 
    $V[$search_bit] = $foo; 
} 

$query = $pdo->prepare($sql); 
$query->execute($V); 

(я не проверял этот код, поэтому, пожалуйста, простите опечатки.)

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