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.