IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Requete SQL & Foreach


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 149
    Points : 80
    Points
    80
    Par défaut Requete SQL & Foreach
    Bonjour à tous,
    J'ai un soucis avec une boucle foreach et une requete SQL dans cette boucle.

    Voici mon approche:
    Je fais une requête SQL sur une table où je sélectionne 10 champs en fonction d'un ID.
    Il arrive donc qu'en fonction de le l'ID il n'y ai que 2 champs sur 10 rempli, ou 7, ou 4 ....
    De cette requête je fais un sqlsrv_fetch_array.
    J'applique ensuite un foreach sur ce tableau.
    Dans mes premiers test je faisais un echo pour voir si le tableau était bien parcouru et que les champs remplis apparaissaient bien.Tout marche jusque là.
    J'ai donc modifié ma boucle pour qu'au lieu de faire un echo. Je fasse une requête SQL en fonction de la case du tableau que le foreach parcours.

    Et là malheureusement ma requête ne s’exécute qu'une seule fois alors que mon tableau comporte 4 entrées.

    Est-ce parce que le foreach n'execute qu'une seule fois la requête et zappe le reste?

    Voici un bout de mon code, dès fois que j'ai fais quelque chose de travers...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    $sql_associe = "SELECT Champ12, Champ13, Champ14, Champ15, Champ16, Champ17, Champ18, Champ19, Champ20, Champ21 FROM Produit WHERE Ref_Constructeur='".$pdt."' AND Champ5='Oui'";
    $envoi_associe = sqlsrv_query($connection, $sql_associe);
    $contenu_associe = sqlsrv_fetch_array( $envoi_associe, SQLSRV_FETCH_ASSOC);
    foreach ($contenu_associe as $produit_associe)
    {
    //echo $produit_associe."<br />\n";
     
    $sql_pdt_associe= "SELECT Nom_Produit, Descriptif, Prix_Vente_Euro, Champ10, Ref_Constructeur FROM Produit WHERE Champ5='Oui' and Ref_Constructeur='".$produit_associe."'";
    $envoi_pdt_associe = sqlsrv_query($connection, $sql_pdt_associe);
    while( $row_pdt_asso = sqlsrv_fetch_array( $envoi_pdt_associe, SQLSRV_FETCH_ASSOC))
    {
    		// Affichage des champs voulu					
    }
    }
    Merci d'avance de votre aide.

  2. #2
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 387
    Points
    9 387
    Par défaut
    Si je comprend bien ton code (vu qu'on a pas le contenu des fonctions) ton premier sqlsrv_fetch_array renvoie un seul n-uplet par rapport à la seconde utilisation de sqlsrv_fetch_array qui est dans une boucle while.
    Tu as donc une seule exécution du foreach() vu que tu ne récupères que le premier résultat de ta première requête SQL.

    Essayes donc ceci et tu seras rapidement fixé :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $contenu_associe = array();
    while( $r = sqlsrv_fetch_array( $envoi_associe, SQLSRV_FETCH_ASSOC) )
      $contenu_associe[] = $r;
    à la place de :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $contenu_associe = sqlsrv_fetch_array( $envoi_associe, SQLSRV_FETCH_ASSOC);

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 149
    Points : 80
    Points
    80
    Par défaut
    Désolé de ne pas avoir pu répondre plus tôt et merci de ta réponse transgohan.

    Cependant cela ne marche pas. J'ai bien remplacé le code par celui que tu as donné mais rien.
    J'ai dé-commenté la ligne 7 du code de mon premier post.
    Et à l'affichage ne j'avais que "Array" d'affiché.
    J'ai ensuite supprimé les crochets de la ligne:
    $contenu_associe[] = $r;

    Mais cela à donné le même résultat que lors de mon premier post.
    A savoir: la requête n'est prise en compte qu'une seule fois.

  4. #4
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 387
    Points
    9 387
    Par défaut
    Grumf je devais pas être réveillé quand je t'ai répondu...
    Le souci vient que tu fais un select de plusieurs champs et non de un seul...
    $produit_associe est donc un array et non une String !
    Donc ta seconde requête revient à faire :
    SELECT Nom_Produit, Descriptif, Prix_Vente_Euro, Champ10, Ref_Constructeur FROM Produit WHERE Champ5='Oui' and Ref_Constructeur='Array'

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 149
    Points : 80
    Points
    80
    Par défaut
    Ah d'accord.

    Je pensais que le fait de faire un foreach du tableau $contenu_associe allait parcourir le tableau et donc faire une requete SQL pour chaque entrée du tableau.
    Si je comprends bien tu me dis que mon foreach ne réalise une requête SQL que sur $contenu_associe[0]

    Va falloir trouver une autre astuce alors pour mon truc ^^

  6. #6
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 387
    Points
    9 387
    Par défaut
    Il y a un truc que je pige pas par contre dans ton traitement SQL...
    Dans ta première requête tu filtre par référence constructeur (variable statique).
    Et dans ta seconde requête tu sembles vouloir prendre la référence constructeur du n-uplet courant de la première requête => qui doit donc être égal à la variable statique...

    Bref tous tes produits sont forcement liés, pas besoin de faire une requête pour le vérifier !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème Requete SQL et QuickReport
    Par arnaud_verlaine dans le forum C++Builder
    Réponses: 7
    Dernier message: 07/01/2004, 09h31
  2. Prob de requete sql et variable
    Par agent-zaizai dans le forum ASP
    Réponses: 11
    Dernier message: 21/10/2003, 16h54
  3. requete sql
    Par autumn319 dans le forum ASP
    Réponses: 22
    Dernier message: 10/09/2003, 16h46
  4. Paramètre requete SQL (ADOQuery)
    Par GaL dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/07/2002, 11h24
  5. Resultat requete SQL
    Par PierDIDI dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/07/2002, 13h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo