Problème de boucles while imbriquées

Résolu
Signaler
Messages postés
431
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
17 novembre 2008
-
Messages postés
431
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
17 novembre 2008
-
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

Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
25
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).
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
25
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)) {
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
9
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>
Messages postés
431
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
17 novembre 2008

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.
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
9
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>
Messages postés
431
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
17 novembre 2008

Qu'est ce que tu me proposes Antho ?

Comment puis-je faire autrement que dans la boucle ?



Thanls !
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
25
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.
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
25
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).
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
9
"(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>
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
25
Bah j'avoue que je suis flemmard vu qu'il n'y a qu'une colonne par table lol...
Messages postés
431
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
17 novembre 2008

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;
Messages postés
431
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
17 novembre 2008

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
Messages postés
431
Date d'inscription
mercredi 22 octobre 2003
Statut
Membre
Dernière intervention
17 novembre 2008

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.