Requete préparée avec LIKE

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par stephweb13, 31 Juillet 2015.

  1. stephweb13
    stephweb13 WRInaute discret
    Inscrit:
    11 Janvier 2012
    Messages:
    67
    J'aime reçus:
    0
    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
     
  2. loubet
    loubet WRInaute impliqué
    Inscrit:
    19 Février 2003
    Messages:
    792
    J'aime reçus:
    0
    $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
     
  3. stephweb13
    stephweb13 WRInaute discret
    Inscrit:
    11 Janvier 2012
    Messages:
    67
    J'aime reçus:
    0
    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
     
Chargement...
Similar Threads - Requete préparée Forum Date
marqueurs nommés vs marqueurs interrogatifs requête préparée Développement d'un site Web ou d'une appli mobile 16 Janvier 2019
Marqueur nommé ou interrogatif pour les requetes préparées ? Développement d'un site Web ou d'une appli mobile 30 Décembre 2018
Requête préparée nécessaire ? Développement d'un site Web ou d'une appli mobile 28 Octobre 2018
Combiner 2 requetes préparées Développement d'un site Web ou d'une appli mobile 30 Septembre 2018
Pourquoi ma requête préparée n'update-t'elle rien du tout ? Développement d'un site Web ou d'une appli mobile 8 Avril 2017
Qu'est-ce qui ne va pas dans ma requête préparée ? Développement d'un site Web ou d'une appli mobile 31 Mars 2017
Ma première requête préparée (ne) fonctionne (pas) Développement d'un site Web ou d'une appli mobile 19 Septembre 2015
Nettoyage de requètes externes de Google, comment faire? Administration d'un site Web 24 Octobre 2020
encodage texte sur requete mysql Demandes d'avis et de conseils sur vos sites 21 Octobre 2020
Requête MySql imbriquée Développement d'un site Web ou d'une appli mobile 8 Octobre 2020