IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

récupérer des listes liées


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Invité
    Invité(e)
    Par défaut
    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é)

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8
    Par défaut
    comme je l'ai indiqué, apparemment ça ne le fait pas.
    Mais là n'est pas mon problème principal

  4. #4
    Invité
    Invité(e)
    Par défaut
    .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

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8
    Par défaut
    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

  6. #6
    Invité
    Invité(e)
    Par défaut
    Voila ce qui s'appelle un code "propre" :

    1/ Formulaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

Discussions similaires

  1. [AJAX] des listes liées
    Par feadream dans le forum AJAX
    Réponses: 4
    Dernier message: 13/04/2011, 15h55
  2. Réponses: 11
    Dernier message: 29/06/2009, 22h20
  3. Réponses: 1
    Dernier message: 09/06/2009, 18h31
  4. Information et aide à propos des listes liées et de XMLHttpRequest
    Par redpopo dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/04/2007, 17h05
  5. Utilisation des liste liées (ajax) avec du perl
    Par Jim_Nastiq dans le forum Web
    Réponses: 1
    Dernier message: 12/07/2006, 12h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo