Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
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 05/04/2011, 15h07   #1
Membre actif
 
Avatar de Meloooo
 
Mélanie
Inscription : novembre 2008
Messages : 275
Détails du profil
Informations personnelles :
Nom : Mélanie
Âge : 22

Informations forums :
Inscription : novembre 2008
Messages : 275
Points : 178
Points : 178
Par défaut manipuler array avec while

Salut,
J'ai une table tâches se présentant comme ceci :


1 | 100 | -
2 | 100 | 1
3 | 45 | -
4 | 30 | 1,2,3

Colonne 1 : numéro de tâche
Colonne 2 : pourcentage d'avancement de la tâche
Colonne 3 : idx_tache pour connaitre l'état d'avancement d'une tache ayant besoin de tâche préalablement fini

Statut_tache correspond à l'avancement de mes tâches qui se calcule en fonction de mes idx_taches
Si statut_tache est égale à 0 alors ca veut dire que ma tâche est en attente si elle est comprise entre 1 et 99 ca veut dire qu'elle est en cours et 100 terminé.
Prenons l'exemple de ma tâche 4, pour qu'elle soit fini à 100% il faut que les tâches 1,2 et 3 soient fini à 100%. Si la tâche 1 est terminé, mais que la tâche 2 et 3 est en cours alors le statut de ma tâche 4 sera "en cours".
Je ne suis pas très claire, mais j'espère que vous comprendrez un minimum.
Ce que je souhaites faire c'est récupérer les idx_taches de chacune de mes tâches et analyser leur statut(un par un) pour donner un et un seul statut !
voici mon code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
$idx_actions = "select idx_action, num_tache from table
";
$query_action = mysql_query($idx_actions);
$rows = mysql_num_rows($query_action);
while ($parcours = mysql_fetch_array($query_action))
{
	$explode_action = explode(',' , $parcours[0]);
	//print_r($test = array($parcours[1] => $explode_action));
	foreach( $explode_action as $value ) {
	$req_stat = "SELECT tableau_statut FROM tableau_bord WHERE tableau_int = '".$value."' ";
	$query_stat = mysql_query($req_stat);
		while($le_parcours = mysql_fetch_array($query_stat))
		{
			$array = array($parcours[1] => $le_parcours[0]);
		}
	}
}
Meloooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 23h26   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Ta structure n'est pas bonne.
Il faut une table qui recense les relations.
id - tache - relation
1 - 2 - 1
2 - 4 - 1
3 - 4 - 2
4 - 4 - 3

En une requête tu peux par exemple avoir le nombre de taches liées et non terminées :
Code sql :
1
2
3
4
SELECT a.avancement, table2.count(tache) AS taches_liees FROM table1 a
LEFT JOIN table2 ON a.id = table2.tache
JOIN table1 b ON table2.relation = b.id
WHERE a.id = 4 AND b.avancement < 100
ou le détail des taches liées
Code sql :
1
2
3
SELECT tache, avancement FROM table2
JOIN table1 b ON table2.relation = b.id
WHERE a.id = 4
(je n'ai pas validé la requête)
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 09h44   #3
Membre actif
 
Avatar de Meloooo
 
Mélanie
Inscription : novembre 2008
Messages : 275
Détails du profil
Informations personnelles :
Nom : Mélanie
Âge : 22

Informations forums :
Inscription : novembre 2008
Messages : 275
Points : 178
Points : 178
Merci de ta réponse sabotage, c'est vrai que c'est plus cohérent d'avoir une table relation je n'y avais pas pensé...
j'ai donc mis en place ma nouvelle table, j'affiche correctement le statut et les relations... et je voudrais un autre conseil... comment ferais-tu pour "regrouper" mes relations
c'est à dire par exemple :
id - tache - relation
1 - 2 - 1
2 - 4 - 1
3 - 4 - 2
4 - 4 - 3
Prenons la tâche 4 qui aura qu'un statut(en cours, en attente ou terminé) si la 1,2,3 sont en attente, alors la 4 sera en attente, si une des trois relations est en cours alors la 4 sera en cours, si elles sont terminées alors la 4 sera terminée.
Je dois faire une requête pour chaque état ? ou y-a t-il une solution plus simple ?
Meloooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 10h41   #4
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Le plus simple est de lire les états de toutes les tâches liées

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
$attente = FALSE;
$avancement = 0;
$nbre_taches = mysql_num_rows($result);
while ($row = mysql_fetch_assoc($result)) {
   if ($row['avancement'] == 0) {
         $attente = TRUE;
   }
   $avancement += $row['avancement'];
}
 
if ($attente) {
   $etat = 'En attente';
}
elseif ($avancement == $nbre_taches * 100) {
   $etat = 'Terminé';
}
else {
    $etat = $avancement / $nbre_taches;
}
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 11h03   #5
Membre actif
 
Avatar de Meloooo
 
Mélanie
Inscription : novembre 2008
Messages : 275
Détails du profil
Informations personnelles :
Nom : Mélanie
Âge : 22

Informations forums :
Inscription : novembre 2008
Messages : 275
Points : 178
Points : 178
J'ai modifié ce code :
Code :
1
2
3
4
 
if ($attente == TRUE) {
		$etat = 'En attente';
		}
par celui la :
Code :
1
2
3
4
 
if ($attente == TRUE && $avancement == 0) {
		$etat = 'En attente';
		}
Car si il rentre dans ma boucle la premiere fois et que l'état est à 0 alors $attente est à TRUE, et si mon autre tâche est à 55 % il m'affichais quand même en attente...
Par contre ca ne le fait pas pour chaque tâche, je voudrais par exemple l'état de chacune de mes tâches la il regroupe tous mes tâche en un...
Meloooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 11h59   #6
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Ce n'est pas logique : si tu as même une seule tâche en attente, tout ton projet est en attente ; mais bon ce n'est plus une question de code.

Pour le reste, l'idée était de determiner l'état d'une tache en fonction de taches liées, c'est bien ça que tu voulais non ?
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 12h01   #7
Membre actif
 
Avatar de Meloooo
 
Mélanie
Inscription : novembre 2008
Messages : 275
Détails du profil
Informations personnelles :
Nom : Mélanie
Âge : 22

Informations forums :
Inscription : novembre 2008
Messages : 275
Points : 178
Points : 178
1) Et non parce que si j'ai une tâche en attente et une tâche en cours, mon projet est "en cours" et non en attente étant donné qu'il as démarré une tâche...
2) Oui c'est bien cela que je voulais...
dans ma base de données pour l'instant j'ai deux tâches avec des tâches liées, donc je voudrais afficher l'état de ces deux tâches en fonction des tâches liées de chacunes d'elles...
Meloooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 12h18   #8
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Regarde ce que te donne une requête comme ça :
Code :
1
2
3
SELECT a.tache as tache, b.tache as tache_liee, b.avancement FROM table1 a LEFT JOIN table2
JOIN table1 b ON table2.relation = b.id
WHERE a.id = 4
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 12h26   #9
Membre actif
 
Avatar de Meloooo
 
Mélanie
Inscription : novembre 2008
Messages : 275
Détails du profil
Informations personnelles :
Nom : Mélanie
Âge : 22

Informations forums :
Inscription : novembre 2008
Messages : 275
Points : 178
Points : 178
Euh je comprends pas la requête.. .je construis jamais mes requêtes avec des left join...
Pourquoi mettre a.id = 4 ?
Voila la requête que j'ai actuellement :
Code :
1
2
3
4
 
SELECT tache, tableau_statut
FROM tableau_bord, relation
WHERE tableau_bord.tableau_int = relation.relation
alors je sélectionne les tâches(table relation) ainsi que leur statut(table tableau_bord) en allant les chercher dans relation et tableau_bord ensuite je fais la jointure entre les deux tables
tableau_bord.tableau_int = id des tâches
relation.relation = les tâches liées.
Meloooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 14h26   #10
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Citation:
Pourquoi mettre a.id = 4 ?
Me suis trompé
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 15h18   #11
Membre actif
 
Avatar de Meloooo
 
Mélanie
Inscription : novembre 2008
Messages : 275
Détails du profil
Informations personnelles :
Nom : Mélanie
Âge : 22

Informations forums :
Inscription : novembre 2008
Messages : 275
Points : 178
Points : 178
Ah d'accord,
donc du coup revenons à nos moutons, comment faire pour afficher le statut de chacune de mes tâches en fonction des tâches liées ?
ma requête me semble correcte mais étant donné que la vérif se fait en dehors du while, il prends en compte qu'une seule tâche mais si je le met dans le while il va m'afficher autant de fois "en attente" qu'il y a de tâche en attente...
Meloooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 15h23   #12
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Ta requête n'est pas bonne elle ne remonte pas l'avancement des taches liées (et la syntaxe de ta jointure est fausse).
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 15h27   #13
Membre actif
 
Avatar de Meloooo
 
Mélanie
Inscription : novembre 2008
Messages : 275
Détails du profil
Informations personnelles :
Nom : Mélanie
Âge : 22

Informations forums :
Inscription : novembre 2008
Messages : 275
Points : 178
Points : 178
Ma requête donné plus haut me donne ca comme résultat :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
tache 	tableau_statut
35 	0
35 	0
35 	100
36 	0
36 	0
36 	0
36 	75
36 	55
36 	100
36 	12
36 	28
36 	87
36 	0
36 	56
36 	100
j'ai essayé un group by tableau_statut et ca m'enlève les "doublons"
Code :
1
2
3
4
5
 
SELECT tache, tableau_statut
FROM tableau_bord, relation
WHERE tableau_bord.tableau_int = relation.relation
group by tableau_statut, tache
et le resultat donne :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
tache 	tableau_statut
35 	0
36 	0
36 	12
36 	28
36 	55
36 	56
36 	75
36 	87
35 	100
36 	100
pourquoi ma requête n'est pas bonne ?
EDIT : tableau_statut = avancement provenant de ma table tableau_bord
Meloooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 15h35   #14
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Citation:
pourquoi ma requête n'est pas bonne ?
Elle ne te donne pas les liaisons entre tes taches liées.

Regarde la requête que je t'ai proposée.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 15h38   #15
Membre actif
 
Avatar de Meloooo
 
Mélanie
Inscription : novembre 2008
Messages : 275
Détails du profil
Informations personnelles :
Nom : Mélanie
Âge : 22

Informations forums :
Inscription : novembre 2008
Messages : 275
Points : 178
Points : 178
Au risque de paraitre un peu niaise
je ne comprends pas les requêtes avec les JOIN
Code :
1
2
3
 
SELECT a.tache as tache, b.tache as tache_liee, b.avancement FROM table1 a LEFT JOIN table2
JOIN table1 b ON table2.relation = b.id
Meloooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 16h03   #16
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
par exemple au lieu de
Code :
1
2
3
SELECT tache, tableau_statut
FROM tableau_bord, relation
WHERE tableau_bord.tableau_int = relation.relation
tu écris
Code :
1
2
3
SELECT tache, tableau_statut
FROM tableau_bord JOIN relation
ON tableau_bord.tableau_int = relation.relation
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 16h09   #17
Membre actif
 
Avatar de Meloooo
 
Mélanie
Inscription : novembre 2008
Messages : 275
Détails du profil
Informations personnelles :
Nom : Mélanie
Âge : 22

Informations forums :
Inscription : novembre 2008
Messages : 275
Points : 178
Points : 178
Oui ca j'avais compris c'est le left join que j'avais pas captée...
ca me donne le même résultat que ma requête précédente :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
tache 	tableau_statut
35 	0
35 	0
35 	100
36 	0
36 	0
36 	0
36 	75
36 	55
36 	100
36 	12
36 	28
36 	87
36 	0
36 	56
36 	100
Meloooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 16h34   #18
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Le left join retourne les éléments de la table a gauche même s'ils n'ont pas de correspondance dans la table à droite.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 16h38   #19
Membre actif
 
Avatar de Meloooo
 
Mélanie
Inscription : novembre 2008
Messages : 275
Détails du profil
Informations personnelles :
Nom : Mélanie
Âge : 22

Informations forums :
Inscription : novembre 2008
Messages : 275
Points : 178
Points : 178
Ah d'accord, mais de toute façon les les tâches que j'ai dans ma table relation sont forcément dans la table tableau_bord, le left join me sert-il ?
Désolé de poser des questions stupides, mais je connais vraiment pas cette syntaxe pour les requêtes, je suppose que cette syntaxe est mauvaise :
Code :
1
2
3
4
 
SELECT tache, tableau_statut
FROM tableau_bord LEFT JOIN relation JOIN  relation
ON tableau_bord.tableau_int = relation.relation
EDIT :
ou peut etre celle la :
Code :
1
2
3
4
 
SELECT T.tableau_statut, R.tache
FROM tableau_bord AS T
LEFT OUTER JOIN relation AS R ON T.tableau_int = R.relation
ce qui me donne ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
tableau_statut 	tache
0 	NULL
0 	NULL
0 	NULL
0 	NULL
75 	NULL
18 	NULL
100 	36
65 	NULL
21 	NULL
5 	NULL
0 	NULL
20 	NULL
100 	35
32 	NULL
56 	36
0 	NULL
0 	NULL
0 	35
0 	36
87 	36
28 	36
12 	36
0 	NULL
100 	36
55 	36
75 	36
0 	36
0 	36
0 	36
0 	35
je vois pas trop l'intérêt...
Meloooo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h52.


 
 
 
 
Partenaires

Hébergement Web