Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/05/2011, 11h12   #1
Futur Membre du Club
 
Inscription : décembre 2009
Messages : 58
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 58
Points : 18
Points : 18
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 :
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.
Friksstyle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2011, 13h06   #2
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 802
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 802
Points : 1 515
Points : 1 515
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 :
1
2
3
$contenu_associe = array();
while( $r = sqlsrv_fetch_array( $envoi_associe, SQLSRV_FETCH_ASSOC) )
  $contenu_associe[] = $r;
à la place de :
Code php :
$contenu_associe = sqlsrv_fetch_array( $envoi_associe, SQLSRV_FETCH_ASSOC);
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 08h58   #3
Futur Membre du Club
 
Inscription : décembre 2009
Messages : 58
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 58
Points : 18
Points : 18
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.
Friksstyle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 09h12   #4
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 802
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 802
Points : 1 515
Points : 1 515
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'
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 11h20   #5
Futur Membre du Club
 
Inscription : décembre 2009
Messages : 58
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 58
Points : 18
Points : 18
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 ^^
Friksstyle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/05/2011, 07h13   #6
Membre Expert
 
Avatar de transgohan
 
Homme Baptiste ROUSSEL
Étudiant
Inscription : janvier 2011
Messages : 802
Détails du profil
Informations personnelles :
Nom : Homme Baptiste ROUSSEL
Localisation : France, Territoire de Belfort (Franche Comté)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2011
Messages : 802
Points : 1 515
Points : 1 515
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 !
__________________
Toujours se souvenir que la majorité des ennuis viennent de l'espace occupé entre la chaise et l'écran de l'ordinateur.
transgohan est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h31.


 
 
 
 
Partenaires

Hébergement Web