Requette SQL sur la présence dans un tableau [Résolu/Fermé]

Signaler
-
 Sozay -
Bonjour,

en fait j'ai une table nommé recette dans une base de donnée MySQL et j'ai un array PHP qui contient un certain nombre d'ingrédient, nommé $ingredients_interdits. La table possédant l'attribut ingrédient je voudrait pouvoir écrire la requête SQL suivante:
SELECT * FROM recette WHERE ingredient est present dans mon tableau $ingredients_interdits

Est ce que vous savez comment faire

Pour l'instant j'ai essayer de transformer mon tableau en liste et faire une recherche grâce à IN mais ça marche pas....

Merci d'avance de votre réponse

8 réponses


Bonjour

Mais si, ça marche de faire une liste
// on fabrique la liste
$liste='';
foreach ($ingredients_interdits as $ingredient )   
  $liste .= "'". mysql_real_escape_string ($ingredient) . "',";
$liste=substr($liste,0,-1); // pour enlever la virgule finale
// la requête :
$requete = "SELECT * FROM recette WHERE ingredient IN ($liste)";
$reponse=mysql_query($requete) or die (mysql_error());// pour un éventuel message d'erreur
Merci beaucoup d'avoir répondu si vite.
J'ai encore un problème. Quand je fais comme vous me le recommandez, j'ai le message d'erreur suivant:

No database selected

alors que pourtant au début de mon code j'ai bien:

$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
$bdd = new PDO('mysql:host=localhost;dbname=matthieu', 'root', '',$pdo_options);

C'est la première fois que ça me fait ça... pourquoi ?

Aïe aïe aïe, je t'ai donné un code avec des fonctions mysql_ alors que tu utilises PDO. Ce que je t'ai donné n'est pas tu tout adapté, il faut que je revoie ma copie.

// on fabrique la liste
$liste='';
foreach ($ingredients_interdits as $ingredient )   
  $liste .= "'". $bdd->quote ($ingredient) . "',";
$liste=substr($liste,0,-1); // pour enlever la virgule finale
// la requête :
$requete = "SELECT * FROM recette WHERE ingredient IN ($liste)";
$stmt=$bdd->prepare($requete);
$stmt->execute();
Quand j'utilise cette technique et que je fait afficher la liste des ingrédients (en fait des numéros correspondant aux ingrédients, j'ai bien:
''11'',''19'',''108''
mais quand je l'utilise cette liste dans la requête, j'ai le message d'erreur suivant:
Erreur : 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 '11'',''19'',''108'')' at line 1
Je comprend pas ce qui bug !!

As-tu utilisé le code que je t'ai donné ?
Affiche la requête complète, si mysql te dit qu'il y a une erreur, c'est qu'il y en a une, et il suffit probablement de voir la requête pour voir l'erreur.
Ajoute un echo $requete.
Montre la partie du code qui génère la requete
voilà la partie du code commentée qui génère la requête:

$liste_aliments_interdits=''; //la liste dans laquelle je voudrais faire la clause WH
foreach ($array_alimentsInterdits as $ingredient )
$liste_aliments_interdits .= "'". $bdd-> quote ($ingredient) . "',";
$liste_aliments_interdits = substr($liste_aliments_interdits,0,-1); // pour enlever la virgule finale
?>
<p>
<?php print_r($liste_aliments_interdits) ?> </p>
<?php
// la requête :
$requete = "SELECT * FROM ingredient_recette WHERE ingr_id IN ($liste_aliments_interdits)";
echo $requete; ?>
<br/>
<?php
$tableauInt = $bdd->prepare($requete);
$tableauInt ->execute();

et voilà ce qu'il me renvoi:
SELECT * FROM ingredient_recette WHERE ingr_id IN (''13'',''108'')
Erreur : 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 '13'',''108'')' at line 1

est ce que ça ne serait pas parce que c'est des int et pas des string dans mon liste le problème ? Les recettes sont en fait des numéros dans ma base de donnée...

Ça y est, je vois l'erreur !
Regarde bien ce qu'il y a autour de 13 et de 108, ce ne sont pas des double quotes, mais deux simples quotes.
La fonction PDO::quote en ajoute, il est donc inutile d'en remettre une couche
-> dans la fabrication de la liste :
$liste_aliments_interdits .=  $bdd-> quote ($ingredient) . ","; 
Merci bcp !!! Ça marche à la perfection !!!