Requete préparée avec LIKE

WRInaute discret
Bonjour,
j'ai besoin d'un peu d'aide SVP, car j'essaye de faire une requete préparée avec LIKE, et je ni arrive pas.

Voici mon code qui marche (sans que la requete soit préparée avec LIKE):
Code:
<?php
public function selectListeArticlesSearchSite($mots, $orderBy, $limit) {
	$sql = "SELECT titre_h1, contenu, title, url, date_action, date_publ, image_url
			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."%' OR contenu LIKE '%".$mot."%' ";
			$i++;
		}
	}

	$sql .= " AND statut = 1 ";

	$sql .= " ORDER BY ".$orderBy." ";

	if($limit != NULL) {
		$sql .= " LIMIT ".$limit." ";
	}

	$requete = $this->db()->prepare($sql);
	$requete->execute();
	$result = $requete->fetchAll(PDO::FETCH_OBJ);
	$requete->closeCursor();
	return $result;
}

Et voici le code (en requete préparée) que je n'arrive pas à faire marcher :
Code:
<?php
public function selectListeArticlesSearchSite($mots, $orderBy, $limit) {
	$sql = "SELECT titre_h1, contenu, title, url, date_action, date_publ, image_url
			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 ? OR contenu LIKE ? ";
			$i++;
		}
	}

	$sql .= " AND statut = 1 ";

	$sql .= " ORDER BY ".$orderBy." ";

	if($limit != NULL) {
		$sql .= " LIMIT ".$limit." ";
	}

	$requete = $this->db()->prepare($sql);

	$i = 1;
	foreach($mots as $mot) {
		$requete->bindValue($i, '%'.$mot.'%', PDO::PARAM_STR);
		$i++;
	}

	$requete->execute();
	$result = $requete->fetchAll(PDO::FETCH_OBJ);
	$requete->closeCursor();
	return $result;
}
ps: PDO me renvoi cette erreur:
"Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in ... 139"
La ligne 139 est la où il y a le execute()

Pourquoi ma requête préparée ne marche pas? quelle est la solution SVP ?
Merci beaucoup
 
WRInaute impliqué
$sql .= " titre_h1 LIKE ? OR contenu LIKE ? ";
2 ? à chaque passage du foreach
$requete->bindValue($i, '%'.$mot.'%', PDO::pARAM_STR);
1 seul bind à chaque passage du foreach
 
WRInaute discret
Oui exact.

Du coup j'ai mit ceci pour les bindValue:
Code:
        $i = 1;
        $x = 2;
        foreach($mots as $mot) {
            $requete->bindValue($i, '%'.$mot.'%', PDO::PARAM_STR);
            $requete->bindValue($x, '%'.$mot.'%', PDO::PARAM_STR);
            $i = $i +2;
            $x = $x +2;
        }
Et visiblement, ça marche.
Merci beaucoup
 
Discussions similaires
Haut