Page 1 sur 1

Requete SELECT préparée avec LIKE ?

Posté : 19 juil. 2015, 11:04
par stephweb
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 : Tout sélectionner

<?php /** * Requete SQL SELECT pour récupérer la liste des articles LIKE mots clés entrées */ public function selectListeSearchArticles($mots, $filtreStatut=NULL, $trie, $sens_order, $limitPourPagination=NULL) { $sql = "SELECT id, titre_h1, description, url, statut FROM ".$this->_tableArticles.""; $i = 0; foreach($mots as $mot) { if(strlen($mot) > 0) { if($i == 0) { $sql .= " WHERE "; } else { $sql .= " AND "; } $sql .= " titre_h1 LIKE '%".$mot."%' "; $i++; } } if($filtreStatut != NULL) { // si filtre avec statut $sql .= " AND statut = ".$filtreStatut." "; } $sql .= " ORDER BY ".$trie." ".$sens_order." "; if($limitPourPagination != NULL) { $sql .= " LIMIT ".$limitPourPagination." "; } $requete = $this->db()->query($sql); $result = $requete->fetchAll(PDO::FETCH_OBJ); $requete->closeCursor(); return $result; }
J'ai essayé ce code:

Code : Tout sélectionner

<?php /** * Requete SQL SELECT préparée pour récupérer la liste des articles LIKE mots clés entrées */ public function selectListeSearchArticles($mots, $filtreStatut=NULL, $trie, $sens_order, $limitPourPagination=NULL) { $sql = "SELECT id, titre_h1, description, url, statut FROM ".$this->_tableArticles.""; $i = 0; foreach($mots as $mot) { if(strlen($mot) > 0) { if($i == 0) { $sql .= " WHERE "; } else { $sql .= " AND "; } $sql .= " titre_h1 LIKE :".$mot.$i." "; $i++; } } if($filtreStatut != NULL) { $sql .= " AND statut = ".$filtreStatut." "; } $sql .= " ORDER BY ".$trie." ".$sens_order." "; if($limitPourPagination != NULL) { $sql .= " LIMIT ".$limitPourPagination." "; } $requete = $this->db()->prepare($sql); $i = 0; foreach($mots as $mot) { $requete->bindValue(':'.$mot.$i, '%'.$mot.'%', PDO::PARAM_STR); $i++; } $requete->execute(); $result = $requete->fetchAll(PDO::FETCH_OBJ); $requete->closeCursor(); return $result; }
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.

Re: Requete SELECT préparée avec LIKE ?

Posté : 19 juil. 2015, 13:16
par Genova
Essaie de faire ça (sans les "deux points") :
$requete->bindValue($mot.$i, '%'.$mot.'%', PDO::PARAM_STR);

Re: Requete SELECT préparée avec LIKE ?

Posté : 19 juil. 2015, 13:22
par stephweb
Merci. Mais ça ne change rien

Re: Requete SELECT préparée avec LIKE ?

Posté : 19 juil. 2015, 22:34
par stephweb
Du coup,
sujet résolu.
j'ai remplacé les marqueurs nommés, par des marqueurs de positionnement.