2010-07-27 7 views
1

je suis en train ma main avec AOP et je voudrais savoir si ce qui suit est le code correct pour rechercher des mots-clés, car il me donne une erreur: mysql_real_escape_string(): [2002] A connection attempt failed because connected host has failed to respond.recherche en utilisant pdo, mysql et php

classe 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>"; 
     } 

page php:

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

else 
    $quotes->displayQuotes(); 

displayQuotes() affiche les citations fines, donc je suppose que rien ne va pas avec la connexion en elle-même.

Répondre

3

Avec PDO et les paramètres de liaison/instructions préparées, vous n'avez pas besoin d'échapper les chaînes. Comment vous l'avez configuré, PDO devrait automatiquement y échapper pour vous. Comme vous utilisez PDO, vous n'utilisez pas le pilote mysql_connect et vous ne pouvez donc pas utiliser la fonction real_escape_string car elle nécessite une connexion valide au serveur mysql, en utilisant mysql_connect.

EDIT:

Je ne sais pas au sujet de cette instruction if, mais il pourrait être problématique:

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

serait préférable d'utiliser imo. Ce peut ou peut ne pas être le problème. L'autre problème est que vous devriez vérifier le error information et vous alerter s'il y a une erreur d'une manière ou d'une autre.

+0

Merci de remarquer cela. toutes les autres erreurs, car il dit «aucun résultat trouvé» même s'il y a des citations avec ce mot-clé. – input

+0

Eh bien, les espaces supplémentaires dans l'instruction like trouveront seulement la chaîne de recherche si elle est entourée d'espaces (pas sûr si c'était intentionnel ou non). Mais j'ai rarement utilisé la méthode bindparam, donc je ne suis pas sûr à 100% sur cette fonctionnalité. La requête semble correcte, étant donné que ces espaces étaient intentionnels. Avec ces espaces cependant, si le mot-clé de recherche est au tout début ou à la fin, il ne correspondra pas, étant donné qu'il nécessite les espaces pour le faire correspondre. –

+0

Que utiliseriez-vous alors, au lieu de bindparam, pour rechercher un mot-clé? depuis que je suis nouveau à PDO, j'apprends encore. Donc, si vous avez une alternative efficace ou une meilleure, s'il vous plaît faites remarquer. – input

1

Vous ne devez pas utiliser mysql_real_escape_string() dans le cas où vous utilisez PDO préparé des déclarations