requete pdo un peu particulière

requete pdo un peu particulière - PHP - Programmation

Marsh Posté le 23-10-2011 à 16:24:02    

Bonjour
 
Je sèche sur une requete PDO un peu particulière et j'ai besoin de vos lumières.
 
Je voudrai faire un SELECT contenant un "in"; et en utilisant un tableau qui contient toutes les valeurs du in. Pour ainsi avoir une requete du style :
 
select count(1) as total from personne p where p.id_etablissement = 1 and p.id_role in ('ADMIN','ENS_NON') and nom > 'A'
 
Pour cela je fais :

Code :
  1. $in = "'".implode("','", $tableau_role)."'";
  2.  $requete = $bdd->prepare('select count(1) as total
  3.                from personne p
  4.                where p.id_etablissement = :id_etablissement
  5.                and  p.id_role in :id_role
  6.                and  nom >= :nom_personne');
  7.  $requete->bindValue(':id_etablissement',$id_etablissement, PDO::PARAM_INT);
  8.  $requete->bindValue(':id_role',   "(".$in." )",  PDO::PARAM_STR);
  9.  $requete->bindValue(':nom_personne', $nom_personne,  PDO::PARAM_STR);
  10.  print_r($requete);
  11.  $requete->execute() or die(print_r($requete->errorInfo()));


 
Qaund je débuggue, j'obtiens bien que la variable $in contient ce qu'il faut, par exemple : 'ADMIN','ENS_NON'
 
Et pourtant j'ai toujours une erreur de requete sql :
 
Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''(\'ADMIN\',\'ENS_NON\')' and nom >= 'A'' at line 4'
 
Je suis généralement assez habitué à ce genre de requete, mais là je séche.
 
Vos lumière me seront utilises.  
 
Merci  
Dominique

Reply

Marsh Posté le 23-10-2011 à 16:24:02   

Reply

Marsh Posté le 24-10-2011 à 12:03:14    

Le problème c'est qu'il va banaliser les chaines, et va donc banaliser tout les caractères spéciaux (' ici par ex.).
 
Ici le mieux c'est sans doute de faire un truc du genre :

Code :
  1. $first = true;
  2.     $in = "'";
  3.     foreach ($tableau_role as $item) {
  4.         if (!$first) {
  5.             $in .= "', '";
  6.         }
  7.         $in .= $bdd->quote($item);
  8.         $first = false;
  9.     }
  10.      $requete = $bdd->prepare("select count(1) as total
  11.                    from personne p
  12.                    where p.id_etablissement = :id_etablissement
  13.                    and  p.id_role in $in
  14.                    and  nom >= :nom_personne" );
  15.      $requete->bindValue(':id_etablissement',$id_etablissement, PDO::PARAM_INT);
  16.      $requete->bindValue(':nom_personne', $nom_personne,  PDO::PARAM_STR);
  17.      print_r($requete);
  18.      $requete->execute() or die(print_r($requete->errorInfo()));


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed