Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
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 20/09/2011, 19h16   #1
Invité de passage
 
Homme
Inscription : septembre 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 52
Localisation : France

Informations professionnelles :
Secteur : Santé

Informations forums :
Inscription : septembre 2011
Messages : 4
Points : 0
Points : 0
Par défaut récupérer des listes liées

bonjour
je créé bénévolement le site d'un club et j'ai un souci:
j'ai 2 tables mysql:
bureau: 3 champs id_b, fonction, id_nb (identifiant du titulaire)
membres: plusieurs champs dont: id_n, nom

pour remplir ces deux tables séparément no problem...sauf pour bureau.id_nb, pour lequel j'ai fait un autre formulaire:

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
33
34
35
36
37
38
39
40
41
42
43
44
 
<?php
require_once('../../connections.php');
// Comptage des entrées dans la table membres 
$resm = mysql_query("SELECT COUNT(*) AS nbre_membres FROM membres");
$rowm = mysql_fetch_assoc($resm);
$nbm = $rowm['nbre_membres'];
?>				
<center><p><strong>Bureau</strong></p>
<table rules="rows"  bgcolor="#CCCCCC" >
<tr><center><th> Fonction </th>
<th> Titulaire actuel</th>
<th colspan="2"> Nouveau titulaire <br>(choisir dans la liste)</th></tr></center>
<form action="menvoi_bureau.php" method="post">
<?php
//requête dans les tables jointes bureau et membres pour listage des données	
		$reqFM = mysql_query("SELECT * FROM bureau AS b RIGHT JOIN membres AS m ON b.id_nb = m.id_n WHERE b.id_b >0 ORDER BY b.id_b ASC LIMIT 0, $nbm"); 		
		while  ($ligneFM = mysql_fetch_array($reqFM))
				{
				echo '<tr><td> '.$ligneFM["fonction"].' </td>'; //affiche les noms en clair des diverses fonctions
				echo '<td> '.$ligneFM["nom"].'</td>';//affiche le nom de chaque titulaire de fonction
				echo '<td><input type="hidden" name="Poste" value="'.$ligneFM["id_b"].'"></td>';//champ caché: identifiant de fonction
//listbox de choix du nouveau titulaire, chargée à partir de la table membres
		echo '<td><select name="Titulaire">';		
		$reqMembre = mysql_query("SELECT nom FROM membres ORDER BY nom ASC");
		while ($ligneMembre = mysql_fetch_array($reqMembre)) // boucle pour lister les membres du bureau
		{	
		echo '<option value="'.$ligneFM["id_n"].'">';//la valeur sera l'identifiant du membre sélectionné
 
		echo ''.$ligneMembre["nom"].'</option>';//nom des membres
 
		}
				}		 
		echo '</select></td>';
 
		echo '</tr><tr>';
 
			echo '<td colspan="3"><center><input type="submit" name="bouton" value="Valider le nouveau bureau" /></center></td>';
		echo '</tr>';
 
?>
</form>	
</table>
</center>
et, ce qui me pose problème: ma page de traitement:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
<?php 
$id_b = $_POST['Poste']; //récupération des valeurs du champ caché "Poste"
$id_n = $_POST['Titulaire'];//récupération des valeurs du champ "titulaire"
     echo '<table caption="Nouveau bureau">';
     echo '<tr><th>id titulaire</th>';
     echo '<th>id fonction</th>';
     echo "</tr><tr><td>$id_n </td>";//identifiant des membrs titulaires
     echo "<td>$id_b</td></tr></table<br>";//identifiant des fonctions
 
require_once('../../connections.php'); //connection à la bdd
mysql_query("UPDATE bureau SET id_nb='" . $id_n . "' , id_b='" .$id_b. "' WHERE id_b='" . $_POST['Poste'] . "'"); mise à jour de la table bureau
 
echo "<br>";
 "Cliquez <a href=gerlist_membre.php> ici </a> pour continuer";//redirection vers la page de liste des membres
mysql_close(); //fermeture de la connection à la base
en effet, d'une part, ça ne met rien du tout à jour, et ensuite, ça ne m'affiche pas du tout ce que j'aurais pensé: il n'y a pas tout !

Est-ce que quelqu'un aurait la bonté de me dire où je me suis trompé ?

précision: je suis sur Free, et donc pas en php 5 (et pourtant j'ai essayé de mettre un fichier htacess pour modifier mais ça le fait pas)

Merci d'avance pour vos réponses
gadob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2011, 20h50   #2
Rédacteur
 
Avatar de jreaux62
 
Homme Jérôme Réaux
Webdesigner
Inscription : août 2008
Messages : 2 993
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Réaux
Âge : 45
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Webdesigner
Secteur : Arts - Culture

Informations forums :
Inscription : août 2008
Messages : 2 993
Points : 5 786
Points : 5 786
Envoyer un message via Skype™ à jreaux62
Citation:
Pour que php5 soit utilisé par défaut sur les pages perso de free.fr, il faut placer à la racine du site un fichier .htaccess qui contienne :
(le 5 ne doit pas servir à grand chose car quelle que soit la valeur présente dans le fichier, c'est le php5 qui est activé)
__________________
"Ce qui se conçoit bien s'énonce clairement - Et les mots pour le dire arrivent aisément."
Nicolas Boileau-Despréaux, Homme de lettres français (1636-1711), principal théoricien de l'esthétique classique.
Site perso Mes tutos DVP : Gestion-Affichage de Nouvelles - Affichage en tableau HTML - Fonctions de redimensionnement d'images
jreaux62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 08h48   #3
Invité de passage
 
Homme
Inscription : septembre 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 52
Localisation : France

Informations professionnelles :
Secteur : Santé

Informations forums :
Inscription : septembre 2011
Messages : 4
Points : 0
Points : 0
comme je l'ai indiqué, apparemment ça ne le fait pas.
Mais là n'est pas mon problème principal
gadob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 09h20   #4
Rédacteur
 
Avatar de jreaux62
 
Homme Jérôme Réaux
Webdesigner
Inscription : août 2008
Messages : 2 993
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Réaux
Âge : 45
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Webdesigner
Secteur : Arts - Culture

Informations forums :
Inscription : août 2008
Messages : 2 993
Points : 5 786
Points : 5 786
Envoyer un message via Skype™ à jreaux62
.htaccess : php 1

Concernant ton code, tel que tu le présentes, il est "en vrac", illisible, ce qui ne facilite ni la compréhension ni le débogage.

Commence donc par l'écrire "proprement" :
- indentation claire ;
- code html en dehors du code PHP ;
- ajout de commentaires.

ps : la mise en page avec des <table> est obsolète.
-> Div et CSS : une mise en page rapide et facile
__________________
"Ce qui se conçoit bien s'énonce clairement - Et les mots pour le dire arrivent aisément."
Nicolas Boileau-Despréaux, Homme de lettres français (1636-1711), principal théoricien de l'esthétique classique.
Site perso Mes tutos DVP : Gestion-Affichage de Nouvelles - Affichage en tableau HTML - Fonctions de redimensionnement d'images
jreaux62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 12h39   #5
Invité de passage
 
Homme
Inscription : septembre 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 52
Localisation : France

Informations professionnelles :
Secteur : Santé

Informations forums :
Inscription : septembre 2011
Messages : 4
Points : 0
Points : 0
J'ai édité mon premier post, revu l'indentation du 2ème code et mis des commentaires, partout, pour que même un débutant puisse s'y retrouver

Pour ce qui est du html en dehors du php, je verrai plus tard: j'avais essayé déjà mais j'avais un problème de syntaxe, donc je suis allé au plus simple pour moi, pour l'instant.
Quand à la mise en page par CSS, je sais, mais j'ai l'habitude du html classique que je crois maitriser assez bien depuis plus de 10 ans que je fais bénévolement des sites pour asso désargentées, et je me mets à peine aux nouvelles techniques, donc j'y travaillerai après, c'est un détail qui ne nuit pas au fonctionnement du code php, je pense ?

J'ai mis le code pour faciliter la compréhension de ce que je veux faire, mais ma question principale est en fait celle-ci:

Quand, dans un formulaire on a chargé deux variables issues de requêtes MySql, affichant des listes(par exemple L1 et L2), comment faire pour récupérer chaque valeur de la liste L1 ainsi que sa correspondance dans la liste L2 ?

question subsidiaire: ...et que quand il n'y a pas de correspondance, cela affiche la valeur 0
gadob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 14h44   #6
Rédacteur
 
Avatar de jreaux62
 
Homme Jérôme Réaux
Webdesigner
Inscription : août 2008
Messages : 2 993
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Réaux
Âge : 45
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Webdesigner
Secteur : Arts - Culture

Informations forums :
Inscription : août 2008
Messages : 2 993
Points : 5 786
Points : 5 786
Envoyer un message via Skype™ à jreaux62
Voila ce qui s'appelle un code "propre" :

1/ Formulaire :
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php
require_once('../../connections.php');
// Comptage des entrées dans la table membres 
$resm 	= mysql_query("SELECT COUNT(*) AS nbre_membres FROM membres");
$rowm 	= mysql_fetch_assoc($resm);
$nbm 	= $rowm['nbre_membres'];
?>				
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr" dir="ltr">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<title>test</title>	
</head>
<body>
 
<div style="text-align:center;">
 
<p style="text-align:center;"><strong>Bureau</strong></p>
 
<form action="menvoi_bureau.php" method="post">
<table rules="rows" bgcolor="#CCCCCC" style="text-align:center;">
<thead>
	<tr>
		<th> Fonction </th>
		<th> Titulaire actuel</th>
		<th> Nouveau titulaire <br />(choisir dans la liste)</th>
	</tr>
</thead>
<tbody>
<?php
	//requête dans les tables jointes bureau et membres pour listage des données	
	$reqFM = mysql_query("SELECT b.fonction, b.nom FROM bureau AS b RIGHT JOIN membres AS m ON b.id_nb = m.id_n WHERE b.id_b >0 ORDER BY b.id_b ASC LIMIT 0, $nbm"); 		
	while ($ligneFM = mysql_fetch_array($reqFM))
	{
?>
	<tr>
		<td><!-- nom en clair des diverses fonctions -->
			<?php echo $ligneFM["fonction"]; ?> 
		</td>
		<td><!-- nom de chaque titulaire de fonction -->
			<?php echo $ligneFM["nom"]; ?>
		</td>
		<td>
			<!-- champ caché: identifiant de fonction -->
			<input type="hidden" name="Poste[<?php echo $ligneFM["id_b"]; ?>]" value="<?php echo $ligneFM["id_b"]; ?>">
			<!-- listbox de choix du nouveau titulaire, chargée à partir de la table membres -->
			<select name="Titulaire[<?php echo $ligneFM["id_b"]; ?>]">	
<?php	// requete : tous les membres
		$reqMembre = mysql_query("SELECT id_n, nom FROM membres ORDER BY nom ASC;");
		while ($ligneMembre = mysql_fetch_array($reqMembre)) // boucle pour lister les membres du bureau
		{	
			//la valeur sera l'identifiant du membre sélectionné
?>			<option value="<?php echo $ligneFM["id_n"]; ?>"><?php echo $ligneMembre["nom"]; ?></option>
<?php
		} // fin while reqMembre
?>
			</select>
		</td>
	</tr>
<?php
	} // fin while reqFM
?>
	<tr>
		<td colspan="3" style="text-align:center;">
			<input type="submit" name="bouton" value="Valider le nouveau bureau" />
		</td>
	</tr>
<tbody>
</table>
</form>	
 
</div>
 
</body>
</html>
On constate que ton code comportait des erreurs, que tu aurais pu voir facilement si tu avais fait l'effort de l'écrire "proprement" :
- mauvais positionnement de balises </td></tr> et des fin de while

- $reqFM : éviter "SELECT * ..." et mettre clairement les noms des champs à récupérer
(surtout si tu as des champs de même nom dans 2 tables différentes)

- $reqMembre : il manquait id_n dans la requete

- un <input type="hidden" /> n'a pas besoin d'être dans un <td> à part, puisqu'il est "caché"

- $reqFM génère plusieurs lignes. On affiche un input et un select sur CHAQUE LIGNE.
On doit donc utiliser des arrays :
... name="Poste[<?php echo $ligneFM["id_n"]; ?>]"
... name="Titulaire[<?php echo $ligneFM["id_n"]; ?>]"
Astuce : utiliser id_n (auto-incrément, donc unique !) comme "index" d'array simplifie l'identification des lignes (de la <table>) par rapport aux lignes (dans la base de données)

2/ Traitement, on récupère donc des arrays :
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
<?php //connection à la bdd
require_once('../../connections.php'); 
// on récupère des arrays :
$array_id_b = $_POST['Poste']; 		// récup. array id_b
$array_id_n = $_POST['Titulaire']; 	// récup. array id_n
 
// POUR CHAQUE LIGNE
foreach($array_id_n as $id => $val) {
	$id_b 	= $array_id_b[$id];
	$id_n 	= $val; // $val équivaut à $array_id_n[$id]
	// PROTECTION contre injection SQL
	$id_b 	= mysql_real_escape_string($id_b);
	$id_n 	= mysql_real_escape_string($id_n);
	// UPDATE de la ligne dans la BDD : mise à jour de la table bureau
	mysql_query("UPDATE bureau SET id_nb='" . $id_n . "' WHERE id_b='" . $id_b . "';");
} // fin traitement
// ------------------------------
// ré-affichage du nouveau bureau
// REQUETE
// [.......]
?>
<!-- ré-affichage du nouveau bureau -->
<table>
<!-- [.......] -->
</table>
On update QUE id_nb !
__________________
"Ce qui se conçoit bien s'énonce clairement - Et les mots pour le dire arrivent aisément."
Nicolas Boileau-Despréaux, Homme de lettres français (1636-1711), principal théoricien de l'esthétique classique.
Site perso Mes tutos DVP : Gestion-Affichage de Nouvelles - Affichage en tableau HTML - Fonctions de redimensionnement d'images
jreaux62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 19h12   #7
Invité de passage
 
Homme
Inscription : septembre 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 52
Localisation : France

Informations professionnelles :
Secteur : Santé

Informations forums :
Inscription : septembre 2011
Messages : 4
Points : 0
Points : 0
Merci pour ta réponse

quelques commentaires toutefois, si je puis me permettre:

Citation:
- mauvais positionnement de balises </td></tr> et des fin de while
Pourtant le formulaire s'affichait comme il faut ?
Citation:
On constate que ton code comportait des erreurs, que tu aurais pu voir facilement si tu avais fait l'effort de l'écrire "proprement" :
ce n'est pas une question d'effort, mais de savoir...et puis:
les balises de début
Code :
1
2
3
4
5
6
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr" dir="ltr">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<title>test</title>	
</head>
<body>
je ne les avais pas mises ici, car pas nécessaires à la compréhension

Soit dit en passant j'ai testé avec ce que tu as mis dans html et meta, et j'obtiens des caractères bizarres sur les accents ça vient d'où ?

Citation:
- $reqFM : éviter "SELECT * ..." et mettre clairement les noms des champs à récupérer
(surtout si tu as des champs de même nom dans 2 tables différentes
je veux bien mais chez moi quand je mets ce que tu as marqué ça me donne une erreur sur mysql_fetch_array, tandis qu'en mettant * , ça marche.
De toutes façons, j'évite de mettre des champs de même nom dans 2 tables différentes, surtout quand il y a des jointures (par exemple dans la table bureau, j'ai id_nb qui aurait pu être confondu avec id_n de la table membres, ça évite les soucis.

Citation:
- $reqMembre : il manquait id_n dans la requete
oups ! en effet, mais dans mon code original, il y était: c'est un oubli en recopiant. (j'aime pas les copié collé)

Citation:
- un <input type="hidden" /> n'a pas besoin d'être dans un <td> à part, puisqu'il est "caché"
non, en effet, mais au départ, il était visible pour tester et je l'ai donc laissé là où il était, après l'avoir caché.

Pour le reste je me disais bien que c'était un truc d'array mais je pigeais pas bien.
Par contre je reviendrais parce qu'apparemment, ça ne me met pas à jour ma table...(et pourtant, là, j'ai fait un copié collé de ton code)

Merci beaucoup, en attendant
gadob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/09/2011, 20h01   #8
Rédacteur
 
Avatar de jreaux62
 
Homme Jérôme Réaux
Webdesigner
Inscription : août 2008
Messages : 2 993
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Réaux
Âge : 45
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Webdesigner
Secteur : Arts - Culture

Informations forums :
Inscription : août 2008
Messages : 2 993
Points : 5 786
Points : 5 786
Envoyer un message via Skype™ à jreaux62
Citation:
Envoyé par gadob Voir le message
ce n'est pas une question d'effort, mais de savoir...
Il faut comprendre "effort" dans le sens "rigueur", dans la validité et propreté du code.
La portabilité et validation w3c dépendent de plus en plus d'un "code rigoureux".

Citation:
j'obtiens des caractères bizarres sur les accents
C'est une histoire de charset. (voila pourquoi il est utile d'indiquer les balises de début !)
J'ai mis UFT-8, mais tu es sans doute en iso-8859-1.

Citation:
ça ne me met pas à jour ma table
Possible, je ne pouvais pas tester

PS : puisque $id_b et $id_n sont des identifiants (numérique, donc), tu peux remplacer :
Code :
1
2
	$id_b 	= mysql_real_escape_string($id_b);
	$id_n 	= mysql_real_escape_string($id_n);
par :
Code :
1
2
	$id_b 	= intval($id_b);
	$id_n 	= intval($id_n);
__________________
"Ce qui se conçoit bien s'énonce clairement - Et les mots pour le dire arrivent aisément."
Nicolas Boileau-Despréaux, Homme de lettres français (1636-1711), principal théoricien de l'esthétique classique.
Site perso Mes tutos DVP : Gestion-Affichage de Nouvelles - Affichage en tableau HTML - Fonctions de redimensionnement d'images
jreaux62 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 18h50.


 
 
 
 
Partenaires

Hébergement Web