Requete SELECT préparée avec LIKE ?
Posté : 19 juil. 2015, 11:04
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) :
J'ai essayé ce code:
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.
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;
}
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;
}
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.