2010-07-27 6 views
1

я пытаюсь моя рука с PDO и хотел бы знать, если следующее правильный код для поиска ключевых слов, так как он дает мне ошибку: mysql_real_escape_string(): [2002] A connection attempt failed because connected host has failed to respond.поиска с использованием PDO, MySQL и PHP

PHP класс:

public function searchQuotes() 
     { 
      $search = mysql_real_escape_string($_POST['search']); 

      $sql = "SELECT cQuotes, vAuthor, cArabic, vReference FROM thquotes WHERE cQuotes LIKE '% :search %' ORDER BY idQuotes DESC"; 


        try { 

         $query = $this->_db->prepare($sql); 
         $query->bindParam(':search', $search, PDO::PARAM_STR); 
         $query->execute(); 

         if(!$query->rowCount()==0) 
         { 
           while($row = $query->fetch()) 
         { 
          echo $this->formatSearch($row); 
         } 


         } 
         else 
         { 
          echo "No results found!"; 
         } 
         $query->closeCursor(); 
        } 
        catch (Exception $ex){ 

         echo "Something went wrong " . $ex; 
        } 
     } 

     public function formatSearch($row) 
     { 
      $cQuote = highlightWords(htmlspecialchars($row['cQuotes']), $search); 

      return "<p id=\"s_arabic\">" . $this->h($row['cArabic']) . "</p><br />" 
      . "<p id=\"s_quotes\"><q>&nbsp;" . $cQuote . "&nbsp;</q></p><br />" 
      . "<p id=\"s_author\"><b>-</b>&nbsp;" . $this->h($row['vAuthor']) . "</p><br />" 
      . "<p id=\"s_reference\"><span class=\"source\">Source:</span> " . $this->h($row['vReference']) . "</p>"; 
     } 

PHP страница:

if (isset($_POST['search'])) 
    $quotes->searchQuotes(); 

else 
    $quotes->displayQuotes(); 

displayQuotes() отображает котировки тонкие, так что я не уверен, предполагая ничего плохого в связи с этим в себе.

ответ

3

С PDO и обязательными параметрами/подготовленными операциями вам не нужно избегать строк. Как вы его устанавливаете, PDO должен автоматически уйти от него для вас.

Поскольку вы используете PDO, вы не используете драйвер mysql_connect и, следовательно, вы не можете использовать функцию real_escape_string, так как для правильного подключения к серверу mysql используется mysql_connect.

EDIT:

Не уверен, что это, если заявление, но это может быть проблематично:

if($query->rowCount()>0)

Было бы лучше использовать имо. Это может быть или не быть проблемой. Другая проблема заключается в том, что вы должны проверить error information и предупредить себя, если есть какая-то ошибка.

+0

Спасибо за указание на это. любые другие ошибки там, так как он говорит «никаких результатов не найдено», хотя есть цитаты с этим ключевым словом. – input

+0

Ну, дополнительные пробелы в аналогичном выражении найдут только строку поиска, если она окружена пробелами (не уверен, что это было намеренно или нет). Но я редко использовал метод bindparam, поэтому я не уверен на 100% этой функциональности. Запрос выглядит хорошо, учитывая, что эти пробелы были преднамеренными. Однако с этими пробелами, если ключевое слово поиска находится в самом начале или в конце, оно не будет соответствовать, поскольку для него требуются пробелы. –

+0

что бы вы использовали тогда вместо bindparam для поиска ключевого слова? так как я новичок в PDO, я все еще участвую. поэтому, если у вас есть эффективная или лучшая альтернатива, пожалуйста, укажите. – input

1

Вы не должны использовать mysql_real_escape_string() в случае, если вы используете PDO подготовленных операторов