13stephweb13 | 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 :
- <?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 :
- <?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. |