Problème de boucles while imbriquées

Résolu
nougitch Messages postés 431 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 17 novembre 2008 - 20 juil. 2005 à 09:18
nougitch Messages postés 431 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 17 novembre 2008 - 20 juil. 2005 à 11:10
Bonjour,



J'ai un problème avec mes boucles.

Lorsque je compte les enregistrements de la table, le bon nombre
s'affiche mais à l'exécution, il effectue la deuxième boucle (la boucle
intérieure) uniquement pour le premier enregistrement de la première
boucle (la boucle extérieure).



Voici le code :



include("applications.php");



$requete_max_application = mysql_query("SELECT MAX(id) AS id FROM applications");

$recuperation_max_application = mysql_fetch_array($requete_max_application);

$requete_modules = mysql_query("SELECT id FROM modules");

$requete_langues = mysql_query("SELECT id FROM langues");



echo 'Nombre de modules = '.mysql_num_rows($requete_modules).'
';

echo 'Nombre de langues = '.mysql_num_rows($requete_langues).'
';



while($recuperation_langues = mysql_fetch_array($requete_langues)) {

echo 'langues traités = '.$requete_modules.'
';

while($recuperation_modules = mysql_fetch_array($requete_modules)) {

echo 'modules traités = '.$requete_langues.'
';

mysql_query("INSERT INTO app_mod VALUES
('$recuperation_max_application[id]', '$recuperation_modules[id]', '$recuperation_langues[id]', '0')");

}

}



mysql_close();





L'objectif est le suivant :



Brièvement, j'ai dans ma base de données une table 'matrice' 4 champs dont 3 qui sont des clés primaires :

- applications (int, primary key)

- modules (int, primary key)

- langues (int, primary key)

- notes (int)




L'idée est d'avoir un tableau comprenant les applications en abscisses,
les modules en ordonnées, en fonction d'une langue. A chaque
croisement, j'ai une note.



Un exemple : le module 'dictionnaire monolingue' est noté '5/10' pour l'application 'traduction', le tout pour la langue 'française'.

Autrement dit : une note correspond au croisement d'un module pour une aplication en fonction d'une langue.



Ma question est la suivante :


Lorsque j'ajoute une application (par exemple, car en fait ma question
s'applique aussi pour les modules et pour les langues), je veux que
dans la table 'matrice', s'ajoute autant de fois le numéro d'application que nécessaire, c'est-à-dire pour chaque cas possible.



Un petit schéma qui résume le tout :



applications| modules | langues | notes

----------------------------------------------


1
|
1
|
1 | 5


1
|
2
|
1 | 4


1
| 1

| 2
| 6


1
|
2
| 2
| 5

2

| 1

|
1 | 8
2

| 2

|
1 | 3
2

| 1

| 2
| 5
2

| 2

| 2
| 6



J'espère que je suis clair ;-)

Je vous remercie par avance pour votre aide !

13 réponses

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
20 juil. 2005 à 10:57
Ok, c'etait evident...je m'en veux de pas l'avoir vu de suite lol.



Losque l'on utilise une requete mysql_query, la ressource est liberee
une fois que l'on est sorti de la boucle (le while) qui la traite.



Donc $recuperation_modules ne valait plus rien apres la 1ere 2eme boucle :-) :



<?php

mysql_connect ('localhost', 'root', '');

mysql_select_db ('noug');



$requete_max_application = mysql_query("SELECT MAX(id) AS id FROM applications");

$recuperation_max_application = mysql_fetch_array($requete_max_application);



$requete_langues = mysql_query("SELECT id, libelle FROM langues");



//echo 'Nombre de modules = '.mysql_num_rows($requete_modules).'
';

echo 'Nombre de langues = '.mysql_num_rows($requete_langues).'
';



while($recuperation_langues = mysql_fetch_array($requete_langues)) {

echo 'langues traités = '.$recuperation_langues['libelle'].'
';

$requete_modules = mysql_query("SELECT id, libelle FROM modules");

while($recuperation_modules = mysql_fetch_array($requete_modules)) {

echo 'modules traités = '.$recuperation_modules['libelle'].'
';

mysql_query("INSERT INTO
app_mod VALUES ('".$recuperation_max_application['id']."',
'".$recuperation_modules['id']."', '".$recuperation_langues['id']."',
'0')");

}

}



mysql_close();

?>



ca ca marche. (J'ai mis les libelle pour y voir plus clair hein, tu peux les enlever).
3
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
20 juil. 2005 à 09:34
Hello,



essaye de changer le nom de ta variable dans une des deux boucles :



while($recuperation_langues = mysql_fetch_array($requete_langues)) {

echo 'langues traités = '.$requete_modules.'
';

while($recuperation_modules = mysql_fetch_array($requete_modules)) {
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
20 juil. 2005 à 10:05
Salut,



et le mysql_close(); mets-le après le dernier mysql_query.



a +

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
0
nougitch Messages postés 431 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 17 novembre 2008
20 juil. 2005 à 10:20
Merci pour vos réponses.



Malalam, je ne vois pas trop ce que tu veux dire. Tu veux que je change les noms des variables utilisées dans les boucles ?



Anthomicro, j'ai déplacé mysql_close(), je l'ai mis à l'intérieur de la
boucle mais aussi après : $requete_langues = mysql_query("SELECT id
FROM langues"); J'obtiens un message d'erreur relatif à la connection à
la base de données.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
20 juil. 2005 à 10:24
ah non j'avais pas vu ta requête dans la boucle désolé... (au passage c'est pas vraiment à faire ça une requête dans une boucle)

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
0
nougitch Messages postés 431 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 17 novembre 2008
20 juil. 2005 à 10:25
Qu'est ce que tu me proposes Antho ?

Comment puis-je faire autrement que dans la boucle ?



Thanls !
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
20 juil. 2005 à 10:31
Heu non laisse tomber j'ai mal lu lol.

Je ne vois pas pourquoi ca ne fonctionne pas en fait.



Par contre dans tes affichages, tu as inverse module et langue. Remets ca dans le bon ordre peut-etre pour voir.
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
20 juil. 2005 à 10:34
File un exemple de structure de ta base, avec chacune des tables ici,
mais avec peu d'entrees, et mets la ici sour forme SQL, pour que je
teste ca ici. (J'ai pas envie de creer la base exemple a la main lol).
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
20 juil. 2005 à 10:39
"(J'ai pas envie de creer la base exemple a la main lol)."



\o/

<hr size="2" width="100%">




<li>Entraide, dépannage et vulgarisation informatique: Mon site de vulgarisation informatique</li>
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
20 juil. 2005 à 10:44
Bah j'avoue que je suis flemmard vu qu'il n'y a qu'une colonne par table lol...
0
nougitch Messages postés 431 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 17 novembre 2008
20 juil. 2005 à 10:45
Merci Malalam, c'est gentil.



Je t'ai donc mis ci-après les 4 tables et quelques exemples.



La table 'applications' :



CREATE TABLE applications (




id int(8) unsigned NOT NULL auto_increment,
libelle varchar(255) NOT NULL default '',
description text NOT NULL,
type tinyint(1) unsigned NOT NULL default '0',
langues int(8) unsigned NOT NULL default '0',
etat tinyint(1) NOT NULL default '0',
PRIMARY KEY (id)
) TYPE= MyISAM;

Et quelques données pour cette table :


INSERT INTO applications VALUES (1, 'Document Production', 'Test matrice', 0, 0, 0);


INSERT INTO applications VALUES (2, 'Summarization', 'It\\\'s very good !', 1, 0, 0);


INSERT INTO applications VALUES (3, 'Classification', 'Que les langues françaises', 0, 0, 0);




La table 'modules' :






CREATE TABLE modules (
id int(8) unsigned NOT NULL auto_increment,
libelle varchar(255) NOT NULL default '',
description text NOT NULL,
type tinyint(1) unsigned NOT NULL default '0',
langues int(8) unsigned NOT NULL default '0',
etat tinyint(1) NOT NULL default '0',
PRIMARY KEY (id)

) TYPE =MyISAM;

Et quelques données pour cette table :

INSERT INTO modules VALUES (1, 'Diacritizer', 'Inclusion du fichier de connexion à la base de données', 0, 1, 0);
INSERT INTO modules VALUES (2, 'Sentence Boundary Detection', 'Élections des représentants du personnel aux conseils centraux et au conseil de l’UFR de LEA Recrutements', 0, 0, 0);
INSERT INTO modules VALUES (3, 'Named Entity Recognition', 'Lisez la lettre de Richard Descoings, Directeur de Sciences Po', 0, 0, 0);
INSERT INTO modules VALUES (4, 'Word Sense Disambiguator', 'Vous souhaitez soutenir le projet éducatif de sciences po en versant la taxe d\\\'apprentissage à notre école ?', 2, 0, 0);

La table 'langues' :

CREATE TABLE langues (
id int(8) unsigned NOT NULL auto_increment,
code char(2) NOT NULL default '',
libelle varchar(70) NOT NULL default '',
etat tinyint(1) NOT NULL default '0',
PRIMARY KEY (id)
) TYPE= MyISAM;

Et quelques données pour cette table :

INSERT INTO langues VALUES (1, '', 'French', 0);
INSERT INTO langues VALUES (2, '', 'English', 0);
INSERT INTO langues VALUES (3, '', 'Spanish', 0);
INSERT INTO langues VALUES (4, '', 'Chinese, Adygei', 0);
INSERT INTO langues VALUES (5, '', 'German', Adygei', 0);

La table 'app_mod' :

CREATE TABLE app_mod (
applications int(8) unsigned NOT NULL default '0',
modules int(8) unsigned NOT NULL default '0',
langues int(8) unsigned NOT NULL default '0',
notes tinyint(1) unsigned NOT NULL default '0',
PRIMARY KEY (applications,modules,langues)

) TYPE =MyISAM;
0
nougitch Messages postés 431 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 17 novembre 2008
20 juil. 2005 à 10:48
Dans la table module, on aura des enregistrements du genre :



INSERT INTO app_mod VALUES (2, 1, 3, 0);

Ce qui signifie : la note pour 'Summarization' Vs 'Diacritizer' pour la langue 'Spanish' = 0
0
nougitch Messages postés 431 Date d'inscription mercredi 22 octobre 2003 Statut Membre Dernière intervention 17 novembre 2008
20 juil. 2005 à 11:10
Youhou !



J'suis trop content.

Mille merci pour ton aide, merci également Antho.



Vous êtes géniaux les mecs, heureusement que vous êtes là.



Merci et à bientôt !



P.S. : j'ai déjà une autre question qui doit vous paraître simple... voir le nouveau POST.
0
Rejoignez-nous