Requette SQL sur la présence dans un tableau

Résolu
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

8 réponses

  1. Utilisateur anonyme
     
    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
    0
    1. Sozay
       
      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 ?
      0
  2. Utilisateur anonyme
     
    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.
    0
  3. Utilisateur anonyme
     
    // 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();
    
    0
  4. Sozay
     
    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 !!
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Utilisateur anonyme
     
    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
    0
  7. Sozay
     
    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...
    0
  8. Utilisateur anonyme
     
    Ç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) . ","; 
    0
  9. Sozay
     
    Merci bcp !!! Ça marche à la perfection !!!
    0