Requette SQL sur la présence dans un tableau
Résolu
Sozay
-
Sozay -
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
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
A voir également:
- Requette SQL sur la présence dans un tableau
- Tableau word - Guide
- Trier un tableau excel - Guide
- Tableau ascii - Guide
- Comment imprimer un tableau excel sur une seule page - Guide
- Tableau croisé dynamique - Guide
8 réponses
Bonjour
Mais si, ça marche de faire une liste
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
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 !!
''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 !!
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
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...
$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 :
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) . ",";
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 ?