Requete SELECT préparée avec LIKE ?

Requete SELECT préparée avec LIKE ? - PHP - Programmation

Marsh Posté le 19-07-2015 à 21:17:36    

Bonjour,
je voudrai un petit renseignement SVP.
 
J'essaye de faire une requête SQL SELECT préparée pour récupérer des articles selon ce que l'utilisateur a entré dans un input search.
 
Voici mon code (qui marche bien, mais la requête n'est pas en préparée) :

Code :
  1. <?php
  2. /**
  3. * Requete SQL SELECT pour récupérer la liste des articles LIKE mots clés entrées
  4. */
  5. public function selectListeSearchArticles($mots, $filtreStatut=NULL, $trie, $sens_order, $limitPourPagination=NULL) {
  6.    $sql = "SELECT id, titre_h1, description, url, statut FROM ".$this->_tableArticles."";
  7.  
  8.    $i = 0;
  9.    foreach($mots as $mot) {
  10.       if(strlen($mot) > 0) {
  11.          if($i == 0) {
  12.             $sql .= " WHERE ";
  13.          }
  14.          else {
  15.             $sql .= " AND ";
  16.          }
  17.          $sql .= " titre_h1 LIKE '%".$mot."%' ";
  18.          $i++;
  19.       }
  20.    }
  21.    if($filtreStatut != NULL) {      // si filtre avec statut
  22.       $sql .= " AND statut = ".$filtreStatut." ";
  23.    }
  24.    $sql .= " ORDER BY ".$trie." ".$sens_order." ";
  25.    if($limitPourPagination != NULL) {
  26.       $sql .= " LIMIT ".$limitPourPagination." ";
  27.    }
  28.    $requete = $this->db()->query($sql);
  29.  
  30.    $result = $requete->fetchAll(PDO::FETCH_OBJ);
  31.    $requete->closeCursor();
  32.    return $result;
  33. }


 
J'ai essayé ce code:

Code :
  1. <?php
  2. /**
  3. * Requete SQL SELECT préparée pour récupérer la liste des articles LIKE mots clés entrées
  4. */
  5. public function selectListeSearchArticles($mots, $filtreStatut=NULL, $trie, $sens_order, $limitPourPagination=NULL) {
  6.    $sql = "SELECT id, titre_h1, description, url, statut FROM ".$this->_tableArticles."";
  7.  
  8.    $i = 0;
  9.    foreach($mots as $mot) {
  10.       if(strlen($mot) > 0) {
  11.          if($i == 0) {
  12.             $sql .= " WHERE ";
  13.          }
  14.          else {
  15.             $sql .= " AND ";
  16.          }
  17.          $sql .= " titre_h1 LIKE :".$mot.$i." ";
  18.          $i++;
  19.       }
  20.    }
  21.    if($filtreStatut != NULL) {
  22.       $sql .= " AND statut = ".$filtreStatut." ";
  23.    }
  24.    $sql .= " ORDER BY ".$trie." ".$sens_order." ";
  25.    if($limitPourPagination != NULL) {
  26.       $sql .= " LIMIT ".$limitPourPagination." ";
  27.    }
  28.    $requete = $this->db()->prepare($sql);
  29.    $i = 0;
  30.    foreach($mots as $mot) {
  31.       $requete->bindValue(':'.$mot.$i, '%'.$mot.'%', PDO::PARAM_STR);
  32.       $i++;
  33.    }
  34.    $requete->execute();
  35.  
  36.    $result = $requete->fetchAll(PDO::FETCH_OBJ);
  37.    $requete->closeCursor();
  38.    return $result;
  39. }


 
 
Si dans le input on met que des caractères alphabétique de A à Z, ça marche.
Par contre, avec ce code (requête préparée), si on met des caractère spéciaux (exemple: =, <...),
PDO::ERRMODE_EXCEPTION me renvoi cette erreur:
"PDOException: SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in C:\wamp\www\site\admin\php\classes\Article.php on line 829"
Et PDO::ERRMODE_WARNING me renvoi cette erreu :
Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: parameter was not defined in C:\wamp\www\site\admin\php\classes\Article.php on line 829.
 
ps: la ligne 829 est : $requete->execute();
 
Savez vous comment résoudre ce problème SVP?
Merci beaucoup.

Reply

Marsh Posté le 19-07-2015 à 21:17:36   

Reply

Marsh Posté le 19-07-2015 à 22:34:43    

Du coup,
sujet résolu.
j'ai remplacé les marqueurs nommés, par des marqueurs de positionnement.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed