2016-04-29 3 views
3

Я использую PDO в php. Но когда мой запрос имеет какое-либо ключевое слово, например «», означает дефис, он ломается и через ошибку. Я готов через Интернет и найти решение для связывания параметров с запросом, и он отлично работает. Но проблема в том, что я строю запрос в цикле, и я не могу привязывать параметры в цикле. Вот код, в котором я разделяю массив с пробелом и запускаю запрос по каждому ключевому слову. Первые 3 слова будут иметь только как запрос и более 3 слов. Я использую цикл, чтобы объединить все элементы массива и то же самое с более чем 6 словами. Я использую запрос MATCH. Есть ли способ избежать этого дефиса или как мы можем привязать параметры с помощью цикла в моем случае?Параметры привязки с PDO в PHP

 $keyword = ($_POST['keyword']); 
     $keyword_array = split(' ',$keyword); 

     /* Query For first Three Words */ 
     if(count($keyword_array)<=3){ 
        $sql = "SELECT * FROM faq WHERE question LIKE '%$keyword%' limit 14"; 
     } 
     /* Query through all array when words are greater then 3 */ 
     if(count($keyword_array)< 6){ 
      $sql = "SELECT * FROM faq WHERE question "; 
       for($i = 0 ; $i<count($keyword_array); $i++){ 

       if($i==0){ 
           $sql.=" LIKE '%$keyword_array[$i]%'"; 
       }else{ 
           $sql.=" or question LIKE '%$keyword_array[$i]%' "; 
       } 
      } 
         $sql .= " ORDER BY question ASC LIMIT 0, 8"; 
     } 
     /* Appl FULL TEXT in natual language mode once we have enough phrase */ 
     else if(count($keyword_array)>=6){ 
       $sql = "SELECT * FROM faq WHERE "; 
        for($i = 0 ; $i<count($keyword_array); $i++){ 

        if($i==0){ 
            $sql.=" MATCH (answer) AGAINST ('$keyword_array[$i]' in natural language mode) "; 
        }else{ 
            $sql.=" or MATCH(answer) AGAINST('$keyword_array[$i]' in natural language mode) "; 
        } 
      } 
       $sql .= " limit 0,5"; 
     } 


      $execute_faq_query = $conn->query($sql); 
      $execute_faq_query->setFetchMode(PDO::FETCH_ASSOC); 

      while ($list = $execute_faq_query->fetch()){ 
} 
+0

Цикл должен построить инструкцию SQL, а затем выполнить один SQL-запрос. –

+0

Да, я попробовал это, но у меня проблема, потому что я новичок в PDO, вы можете помочь с любым циклом, тогда я буду использовать все остальные. – Bilal

+0

PDO поддерживает именованные заполнители, такие как ': keyword', которые вы можете ссылаться во время' execute (array (': keyword' => $ keyword)) '. Добавление вещей в строку легко, и если вы добавите вещи в свой массив, они будут синхронизироваться. – tadman

ответ

2

При создании динамического запроса необходимо отделить те части запроса, которые являются статическими из динамических.

Вы можете видеть, что следующий код является статическим.

"SELECT * FROM faq "; 

Остальная часть кода является динамической. При фильтрации записей используется предложение WHERE, и операторы AND & OR используются для фильтрации записей на основе более чем одного условия. Оператор AND отображает запись, если и первое условие И второе условие являются истинными. Оператор OR отображает запись, если либо первое условие ИЛИ второе условие истинно. поэтому для первого условия WHERE используется, но после этого И или ИЛИ должны быть использованы (с помощью или в вашем примере)

// Static code 
sql = "SELECT * FROM `faq`" 
// Set initial condition to WHERE  
clause = "WHERE";  
if(!empty(filter)){ 
    Add clause to sql 
    Add condition to sql 
    change clause to OR or AND as required 
} 

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

Я использовал случай переключателя для применения фильтров и неназванных параметров?.

Используйте «ленивую» привязку, когда это возможно - передача данных в исполнение значительно сократит ваш код. См. PDO info.

//Test $POST[] remove after testing 
$_POST['keyword'] ="one two three four five six"; 
$keyword = ($_POST['keyword']); 
$keyword_array = split(' ',$keyword); 
$words = count($keyword_array); 
echo $words; 
//You need an array to store parameters 
$paramArray =array(); 
//Initial clause 
$clause = "WHERE"; 
//Start with a basic stub 
$sql = "SELECT * FROM faq "; 
switch (true) { 
    case $words <= 3: 
     $sql .= " $clause question LIKE ?"; 
     $keyword = "%$keyword%"; 
     array_push($paramArray,$keyword); 
     $limit = " LIMIT 14"; 
     break; 

    case $words < 6: 
     for($i = 0 ; $i<count($keyword_array); $i++){ 
      $sql .= " $clause question LIKE ?"; 
      $keyword = "%$keyword_array[$i]%"; 
      array_push($paramArray,$keyword); 
      $clause = "OR"; 
      $limit = " ORDER BY question ASC LIMIT 0, 8"; 
     } 
     break; 

    case $words >=6: 
     $clause = ""; 
     for($i = 0 ; $i<count($keyword_array); $i++){ 
      $sql.=" $clause MATCH (answer) AGAINST (? in natural language mode) "; 
      array_push($paramArray,$keyword_array[$i]); 
      $clause = "OR"; 
      $limit = " limit 0,5"; 
     } 
     break; 
} 
//echo query and parameter array remove after testing 
echo $sql; 
echo "<br>"; 
print_r($paramArray); 

//Prepare and execute query 
$execute_faq_query = $conn->prepare($sql); 
$execute_faq_query->execute($paramArray); 
$execute_faq_query->setFetchMode(PDO::FETCH_ASSOC); 
while ($list = $execute_faq_query->fetch()){ 
} 
+0

«Используйте« ленивую »привязку, когда это возможно» ДА! – miken32

+0

Это именно то, что я искал. – Bilal

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