Problème listes déroulantes et tableau liés à une BDD

Petit nouveau ! | 9 Messages

21 avr. 2013, 21:06

Bonsoir à tous,
Je vais vous expliquer mon cas en essayant d'être le plus claire possible.
J'ai un projet pour l'IUT qui consiste à créer un annuaire lié à une Base De Données (BDD) (Phpmyadmin) mais mon problème est que je n'arrive pas a lié les recherches de ma liste déroulante et d'actualiser le tableau en même temps.
Mon objectif serait d'arriver à un résultat tel que celui-ci : http://www.centreantoinelacassagne.org/ ... jphonebook

Je bloque vraiment sur cette partie de code puisque je ne suis qu'un simple débutant.
Merci d'avance à ce qui répondront.
Bonne soirée.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

21 avr. 2013, 21:51

Salut,

Première chose parcourir la liste des tutos :mrgreen: faq-tutoriels/listes-liees-avec-html-ja ... 55580.html


@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 9 Messages

21 avr. 2013, 22:16

Merci pour ta réponse rapide. C'est sympa le forum mais j'ai déjà jeter quelques coups d'oeil à des tutos (sans quoi je n'oserai pas venir poser mes questions).
Ensuite, voilà le début de code que j'ai fait
<?php
 
//connexion au serveur:
 
$cnx = mysql_connect( "", "", "" );
//sélection de la base de données:
$db= mysql_select_db( "" );
//création de la requête SQL:
$sql = "SELECT personnel.Nom, personnel.Prenom, personnel.Civilite, fonction.Fonction, unite.Unite 
		FROM personnel, fonction, unite  
		WHERE personnel.Id=personnel_fonction.Id AND personnel_fonction.Id=personnel_unite.Id AND personnel.Id=personnel_unite.Id
		ORDER BY Nom";

//exécution de notre requête SQL

$requete = mysql_query( $sql, $cnx ) or die( "ERREUR MYSQL numéro: ".mysql_errno()."<br>Type de cette erreur: ".mysql_error()."<br>\n" );
//récupération avec mysql_fetch_array(), et affichage de nos résultats :

echo( "<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" align=\"center\">\n" );
echo( "<tr>
<td><div align=\"center\">Civilite</div></td>
<td><div align=\"center\">Nom</div></td>
<td><div align=\"center\">Prenom</div></td>
<td><div align=\"center\">Unite</div></td>
<td><div align=\"center\">Fonction</div></td>
</tr>" );
 
while( $result = mysql_fetch_array( $requete ) )
{
echo( "<tr>\n" );
echo( "<td><div align=\"center\">".$result["Civilite"]."</div></td>\n" );
echo( "<td><div align=\"center\">".$result["Nom"]."</div></td>\n" );
echo( "<td><div align=\"center\">".$result["Prenom"]."</div></td>\n" );
echo( "<td><div align=\"center\">".$result["Unite"]."</div></td>\n" );
echo( "<td><div align=\"center\">".$result["Fonction"]."</div></td>\n" );
echo( "</tr>\n" );
}
 
echo( "</table><br>\n" );
?>
Je bloque sur la requête, elle m'affiche tout en boucle malheureusement.
Un truc qui cloche ?
(Désolé pour mon amateurisme)

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

21 avr. 2013, 22:55

- ton code ne contient pas de liste déroulante on ne peux pas savoir ou est le problème.
- echo est une structure de langage tu n'a pas besoin de mettre de () pour l'utiliser.
- tu peux utiliser des ' pour délimiter tes chaînes de caractères ce sera plus claire pour toi (pas besoin de \ devant les " etc
- n'y a pas de gestion du prédicat, as tu essayé quelque chose ?
- j'en te conseil d'utiliser une forme de jointure normalisée afin de séparer la jointure du prédicat http://sqlpro.developpez.com/cours/sqlaz/jointures/

Sinon le principe est simple.

Tu utilise l'événement onchange de la liste pour soumettre le formulaire a chaque changement.
Le formulaire doit avoir la page courante pour action.
Lorsque tu charge la page tu vérifie si les champs du formulaire existe et si l'un d'en eux est present tu l'utilise pour le prédicat.

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 9 Messages

21 avr. 2013, 23:04

Merci encore pour ta réponse aussi rapide.
Voici mon code avec les listes déroulantes. Cependant elle n'actualise pas le tableau.
<form action="Admin_liste_personnel.php" method="post" enctype="application/x-www-form-urlencoded" name="formulaire" >
<table>
<tr id=event><td>Nom </td><td><input name="Nom" type="texte" onKeyUp="javascript:couleur(this);" maxlength="15" size="30"></tr>

<tr id=event><td>Unite </td><td width='100' >
						<select name="mail2">
							<?php
							mysql_connect("", "", "");
							mysql_select_db("");
							$reponse = mysql_query("SELECT Unite FROM `unite` ");
							while ($donnees = mysql_fetch_array($reponse) )
							{?>
							<option value="<?php echo $donnees['Unite']; ?>"><?php echo $donnees['Unite']; ?></option>
							<?php } ?>
							</select></td>
 </tr>
 <tr id=event><td>Fonction </td><td width='100' >
						<select name="mail2">
							<?php
							mysql_connect("", "", "");
							mysql_select_db("");
							$reponse = mysql_query("SELECT Fonction FROM `fonction` ");
							while ($donnees = mysql_fetch_array($reponse) )
							{?>
							<option value="<?php echo $donnees['Fonction']; ?>"><?php echo $donnees['Fonction']; ?></option>
							<?php } ?>
							</select></td>
</tr>
 <tr id=event><td>Pole </td><<td width='100' >
						<select name="mail2">
							<?php
							mysql_connect("", "", "");
							mysql_select_db("");
							$reponse = mysql_query("SELECT Pole FROM `pole` ");
							while ($donnees = mysql_fetch_array($reponse) )
							{?>
							<option value="<?php echo $donnees['Pole']; ?>"><?php echo $donnees['Pole']; ?></option>
							<?php } ?>
							</select></td>
 </tr>
 <tr id=event><td>Batiment </td><td width='100' >
						<select name="mail2">
							<?php
							mysql_connect("", "", "");
							mysql_select_db("");
							$reponse = mysql_query("SELECT Batiment FROM `batiment` ");
							while ($donnees = mysql_fetch_array($reponse) )
							{?>
							<option value="<?php echo $donnees['Batiment']; ?>"><?php echo $donnees['Batiment']; ?></option>
							<?php } ?>
							</select></td>
</tr> 

<tr></tr><tr><td><input class="button" type="submit" name="Submit" value="Rechercher"><td></tr>
</table>
</form>
De plus, pour le code du post précédent, je voulais savoir en fait comment faire pour que la liste complète de la table personnel apparaissent par défaut au début puis on pourra choisir grâce aux listes déroulantes d'être plus précis.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

22 avr. 2013, 09:58

1/ pas besoin de faire des connexions avant chaque requête c'est anti performant, et tu risque d'avoir trop de connexion simultanée surtout que tu ne clos les connexion, et ne libère pas les ressources.
2/ est ce que tu tiens compte de mes remarque la gestion du prédicat dans ta requête de recherche ?
en gros
<?php
if(!empty($_POST['mail2']) {
$sql .= ' where mail=la valeur issue du formulaire';
}
attention y a un minimum de logique a avoir si tu veux une requête correct ;)

3/ il est préférable de libérer les ressources, ne serait ce que pour une question d'espace mémoire, mais aussi pour éviter les problèmes de collision (on sais jamais).
4/ Il préférable d'utiliser mysqli plutôt que mysql
5/ : un nom de champ de formulaire se doit d'être unique (sauf radio et notation tableau), tu as fait un beau copier collé de la liste mais au final foireux :) (nom de champ identique, connexion multiple etc).

essai de faire la validation du formulaire AVANT la requête de recherche et construire le prédicat de la requête (la partie where) à partir des infos du formulaire.
c'est cette partie qui te manque et tu auras tout.

si tu ne sais pas comment récupérer les valeurs d'un formulaire http://www.lephpfacile.com/cours/8-recu ... ormulaires

si tu bûche sur la logique demande, mais avec ton code ;)


@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 9 Messages

22 avr. 2013, 12:37

Salut, merci d'avoir répondu moogli.

C'est juste pour te dire que le langage que tu utilises est très difficile à comprendre pour un débutant comme moi. J'ai essayé de comprendre mais rien n'y fait.
Donc si tu pouvais me filer une brèche facile afin que je puisse enfin trouver la solution parce que là ça fait quasiment 2 jours complets que je fais des recherches et demandes sans succès.
Donc si quelqu'un peut m'éclairer, ce serait parfait.
Désolé s'il n'y a pas de code :oops:
Merci pour les réponses.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

22 avr. 2013, 14:41

un prédicat, dans une requête sql, c'est la partie "where" (par exemple where login='polim78' and mdp='lemdpsecretdepolim78')
- je ne pense que donner un nom différent à chaque élément du formulaire soit difficile ?

la validation du formulaire je t'ai fournis un lien assez explicite je t'invite a suivre le tuto, tu peux toujours poser des question si tu ne le comprend pas.

ensuite, pour ton soucis, il te faut créer la requête SQL (enfin surtout le prédicat) en fonction du formulaire (s'il a été utilisé ou non).

le début est simple tu l'a déjà c'est ta requête sql.

je t'ai corriger le formulaire html (avec des modification pour que se soit la clef primaire des table qui soit passées et nom les données elle même (beaucoup plus facile et rapide pour la recherche sql ensuite).
<?php
$sgbdConn = mysqli_connect('url','utilisateur','motde passe','nom de la base');
if($sgbdConn === false){
    echo 'erreur sql : ',mysqli_error($sgbdConn),'<br />';
}

?>

<form action="Admin_liste_personnel.php" method="post" enctype="application/x-www-form-urlencoded" name="formulaire">
    <table>
        <tr id=event>
            <td>Nom</td>
            <td><input name="Nom" type="texte" onKeyUp="javascript&#058;couleur(this);" maxlength="15" size="30">
        </tr>

        <tr id=event>
            <td>Unite</td>
            <td width='100'>
                <select name="unite">
                    <?php
                    $reponse = mysqli_query('SELECT idUnite,Unite FROM unite',$sgbdConn);
                    while ($donnees = mysqli_fetch_array($reponse)) {
                        ?>
                        <option value="<?php echo $donnees['idUnite']; ?>"><?php echo $donnees['Unite']; ?></option>
                    <?php } ?>
                </select></td>
        </tr>
        <tr id=event>
            <td>Fonction</td>
            <td width='100'>
                <select name="fonction">
                    <?php
                    $reponse = mysqli_query('SELECT idFonction, Fonction FROM fonction',$sgbdConn);
                    while ($donnees = mysql_fetch_array($reponse)) {
                        ?>
                        <option value="<?php echo $donnees['idFonction']; ?>"><?php echo $donnees['Fonction']; ?></option>
                    <?php }
                    mysqli_free_result($reponse);
                    ?>
                </select></td>
        </tr>
        <tr id=event>
            <td>Pole</td>
            <td width='100'>
                <select name="pole">
                    <?php
                    $reponse = mysql_query('SELECT idPole,Pole FROM pole' ,$sgbdConn);
                    while ($donnees = mysql_fetch_array($reponse)) {
                        ?>
                        <option value="<?php echo $donnees['idPole']; ?>"><?php echo $donnees['Pole']; ?></option>
                    <?php }
                    mysqli_free_result($reponse);
                    ?>
                </select></td>
        </tr>
        <tr id=event>
            <td>Batiment</td>
            <td width='100'>
                <select name="batiment">
                    <?php
                    $reponse = mysqli_query("SELECT idBatiment, Batiment FROM batiment ",$sgbdConn);
                    while ($donnees = mysql_fetch_array($reponse)) {
                        ?>
                        <option value="<?php echo $donnees['idBatiment']; ?>"><?php echo $donnees['Batiment']; ?></option>
                    <?php }
                    mysqli_free_result($reponse);
                    ?>
                </select></td>
        </tr>

        <tr></tr>
        <tr>
            <td><input class="button" type="submit" name="Submit" value="Rechercher">
            <td>
        </tr>
    </table>
</form>
<?php
// requete SQL avecune jointure normalisée (cf tuto indiqué hier)
$sql = 'SELECT personnel.Nom, personnel.Prenom, personnel.Civilite, fonction.Fonction, unite.Unite 
                FROM personnel, fonction, unite  
                join fonction on personnel.idFonction = fonction.id
                join unite on personnel.idUnite = unite.id';

// est ce que le formulaire à été soumis ?
if(!empty($_POST['submit'])) {
    // ici on va traiter les valeurs issue du formulaire
    $predicat = array();
//    si il y a une valeur dans la liste fonction on ajoute la condition dans le tableau $predicat (par exmeple $predicat[] = 'idfonction=412'; où 412 esty à remplacer par la valeur du formulaire
    // idem pour les autres listes déroulantes. 
    
    // si le nombre d'élément du table $predicat est différent de zéro alors on ajoute la ou les conditions à la requete
    // $sql . =' where ';
    // + utilisation de la fonction implode => http://www.php.net/implode
}
else {
    // le formulaire 
}

$sql .= 'order by nom';

// reprise de ton code pour afficher le tableau. 

?>
Le but du forum étant de promouvoir l'apprentissage du langage php il faut que tu t'investisse un minimum, c'est pas super complexe il faut s’entraîner un peu et lire pas mal de tuto ;)


@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 9 Messages

22 avr. 2013, 17:43

Merci pour ta réponse qui commence à m'éclairer :priere: .

Je t'explique le chemin que j'ai suivi et tu me dira si c'est bon ou pas.

Alors voici le code que j'ai commencé à écrire, cependant il va être super long (Je devrai le refaire 32 fois (2^5 fois))
// NOM =0 CODE_U =0 CODE_P =0 Code_Bat =0 Code_Fct =1
				if ($_POST['Nom'] == "" && $_POST['Code_U'] == "" && $_POST['Code_P'] == "" && $_POST['Code_Bat'] == "" && $_POST['Code_Fct'] != ""){
				
				$req1 = $bd->query("SELECT Id FROM personnel_fonction WHERE  Code_Fct = '" . $_POST['Code_Fct'] . "';");
				while ($Id = $req1->fetch()){
				
				$req4 = $bd->query("SELECT Fonction FROM fonction WHERE  Code_Fct = '" . $_POST['Code_Fct'] . "';");
				$Fonction = $req4->fetch();
					if($Id['Id'] == "")
						{
							echo "Aucune correspondance dans la base de donnée";
						}else{
						$req2 = $bd->query("SELECT Code_U FROM personnel_unite WHERE  Id = '" . $Id['Id'] . "';");
				
						while ($Code_U = $req2->fetch()){
					
						$req3 = $bd->query("SELECT * FROM Personnel WHERE  Id = '" . $Id['Id'] . "';");
						$Personne = $req3->fetch();
						$req4 = $bd->query("SELECT Unite FROM unite WHERE  Code_U = '" . $Code_U['Code_U'] . "';");
						$Unite = $req4->fetch();
						
						?>
						<table>
						<tr><th></th><th>Civilite</th><th>Nom</th><th>Prenom</th><th>Unite</th><th>Fonction</th></tr>
						<tr id="event"><th></th>
						<th><?php echo $Personne['Civilite']?></th>
						<th><form action="affiche.php" method="post">
							<p>
							<input type="hidden" name="Nom" value="<?php echo $Personne['Nom']?>" /><input type="hidden" name="Prenom" value="<?php echo $Personne['Prenom']?>" /><input type="submit" class="select" value="<?php echo $Personne['Nom']?>" />
							</p>
							</form>
						<th><?php echo $Personne['Prenom']?></th>
						<th><?php echo $Unite['Unite']?></th>
						<th><?php echo $Fonction['Fonction']?></th>
						<th><form action="suppression_personnel_reussie.php" method="post">
							<p>
							<input type="hidden" name="Nom" value="<?php echo $Personne['Nom']?>" /><input type="hidden" name="Prenom" value="<?php echo $Personne['Prenom']?>" /><input type="submit" value="Supprimer" />
							</p>
							</form></th>
						<th><form action="modif_personnel_reussie.php" method="post">
							<p>
							<input type="hidden" name="Nom" value="<?php echo $Personne['Nom']?>" /><input type="hidden" name="Prenom" value="<?php echo $Personne['Prenom']?>" /><input type="submit" value="Modifier" />
							</p>
							</form></th>
						</tr>
						</table>
						<?php
						}
					}
				}
			}
			// NOM =1 CODE_U =0 CODE_P =0 Code_Bat =0 Code_Fct =0
			elseif ($_POST['Nom'] != "" && $_POST['Code_U'] == "" && $_POST['Code_P'] == "" && $_POST['Code_Bat'] == "" && $_POST['Code_Fct'] == ""   ){
				
				$req1 = $bd->query("SELECT * FROM personnel WHERE Nom like '" . $_POST['Nom']."%';");
				while ($Personne = $req1->fetch()){
				$req2 = $bd->query("SELECT Code_U FROM personnel_unite WHERE  Id = '" . $Personne['Id'] . "';");
				$req3 = $bd->query("SELECT Code_Fct FROM personnel_fonction WHERE  Id = '" . $Personne['Id'] . "';");
				$Code_Fct = $req3->fetch();
				$req4 = $bd->query("SELECT Fonction FROM fonction WHERE  Code_Fct = '" . $Code_Fct['Code_Fct'] . "';");
				$Fonction = $req4->fetch();
				while ($Code_U = $req2->fetch()){
					
					if($Personne['Id'] == "")
						{
							echo "Aucune correspondance dans la base de donnée";
						}else{
					
						$req5 = $bd->query("SELECT Unite FROM unite WHERE  Code_U = '" . $Code_U['Code_U'] . "';");
						$Unite = $req5->fetch();
						?>
						<table>
						<tr><th></th><th>Civilite</th><th>Nom</th><th>Prenom</th><th>Unite</th><th>Fonction</th></tr>
						<tr id="event"><th></th>
						<th><?php echo $Personne['Civilite']?></th>
						<th><form action="affiche.php" method="post">
							<p>
							<input type="hidden" name="Nom" value="<?php echo $Personne['Nom']?>" /><input type="hidden" name="Prenom" value="<?php echo $Personne['Prenom']?>" /><input type="submit" class="select" value="<?php echo $Personne['Nom']?>" />
							</p>
							</form>
						<th><?php echo $Personne['Prenom']?></th>
						<th><?php echo $Unite['Unite']?></th>
						<th><?php echo $Fonction['Fonction']?></th>
						<th><form action="suppression_personnel_reussie.php" method="post">
							<p>
							<input type="hidden" name="Nom" value="<?php echo $Personne['Nom']?>" /><input type="hidden" name="Prenom" value="<?php echo $Personne['Prenom']?>" /><input type="submit" value="Supprimer" />
							</p>
							</form></th>
						<th><form action="modif_personnel_reussie.php" method="post">
							<p>
							<input type="hidden" name="Nom" value="<?php echo $Personne['Nom']?>" /><input type="hidden" name="Prenom" value="<?php echo $Personne['Prenom']?>" /><input type="submit" value="Modifier" />
							</p>
							</form></th>
						</tr>
						</table>
						<?php
							}
					
					
					}
				
				}
			}
Et c'est seulement pour 2 possibilités :roll: . Pourrais-tu donc m'éclairer et me dire si c'est trop long c'que je fais là ou j'suis une une bonne voie.
Merci encore pour ton aide.

Petit nouveau ! | 9 Messages

22 avr. 2013, 22:31

Bonsoir,

Merci tout d'abord à moogli qui m'a aidé à bien avancer.
Donc, pour l'instant, j'ai procédé d'une méthode qui marche mais partiellement.
En effet, le code qui suit présente un problème. Par exemple, lorsque je fais une recherche sur "jacques" et que "jacques" appartient à plusieurs unités.
Le tableau va s'actualiser mais va me faire apparaitre deux fois jacques avec l'unité différente.
Ainsi, je voudrai savoir comment mettre le nom des 2 unités à l'intérieur de la même case.
// NOM =1 CODE_U =0 CODE_P =0 Code_Bat =0 Code_Fct =0
			elseif ($_POST['Nom'] != "" && $_POST['Code_U'] == "" && $_POST['Code_P'] == "" && $_POST['Code_Bat'] == "" && $_POST['Code_Fct'] == ""   ){?>
							<table cellpadding="0" cellspacing="0">
						<tr><th></th><th width="20"><h2>Civilite</h2></th><th width="150"><h2>Nom</h2></th><th width="150"><h2>Prenom</h2></th><th width="350"><h2>Unite</h2></th><th width="350"><h2>Fonction</h2></th></tr>
						<tr id="event"><th></th></tr></table>
						
								<?php
							
				
				$req1 = $bd->query("SELECT * FROM personnel WHERE Nom like '" . $_POST['Nom']."%';");
				while ($Personne = $req1->fetch()){
				$req2 = $bd->query("SELECT Code_U FROM personnel_unite WHERE  Id = '" . $Personne['Id'] . "';");
				$req3 = $bd->query("SELECT Code_Fct FROM personnel_fonction WHERE  Id = '" . $Personne['Id'] . "';");
				$Code_Fct = $req3->fetch();
				$req4 = $bd->query("SELECT Fonction FROM fonction WHERE  Code_Fct = '" . $Code_Fct['Code_Fct'] . "';");
				$Fonction = $req4->fetch();
				while ($Code_U = $req2->fetch()){
					
					if($Personne['Id'] == "")
						{
						$error = TRUE;
         
						$errorMSG = "Aucune correspondance dans la base de donnée";
						
						 // On affiche les erreurs :
						 if($error == TRUE){ echo "<p align='center' style='color:red;'>".$errorMSG."</p>"; }
						}else{
					
						$req5 = $bd->query("SELECT Unite FROM unite WHERE  Code_U = '" . $Code_U['Code_U'] . "';");
						$Unite = $req5->fetch();
						?>
		
						<table>
						<tr>
						<th width="100"><?php echo $Personne['Civilite']?></th>
						<th width="200"><form action="affiche.php" method="post">
							<p>
							<input type="hidden" name="Nom" value="<?php echo $Personne['Nom']?>" /><input type="hidden" name="Prenom" value="<?php echo $Personne['Prenom']?>" /><input type="submit" class="select" value="<?php echo $Personne['Nom']?>" />
							</p>
							</form>
						<th width="200"><?php echo $Personne['Prenom']?></th>
						<th width="400"><?php echo $Unite['Unite']?></th>
						<th width="400"><?php echo $Fonction['Fonction']?></th>
						<th width="40"><form action="suppression_personnel_reussie.php" method="post">
							<p>
							<input type="hidden" name="Nom" value="<?php echo $Personne['Nom']?>" /><input type="hidden" name="Prenom" value="<?php echo $Personne['Prenom']?>" /><input type="submit" value="Supprimer" />
							</p>
							</form></th>
						<th width="40"><form action="modif_personnel_reussie.php" method="post">
							<p>
							<input type="hidden" name="Nom" value="<?php echo $Personne['Nom']?>" /><input type="hidden" name="Prenom" value="<?php echo $Personne['Prenom']?>" /><input type="submit" value="Modifier" />
							</p>
							</form></th>
						</tr>
						</table></ul></li>


						<?php
							}
Merci d'avance.

Petit nouveau ! | 9 Messages

23 avr. 2013, 12:00

Pas de solution ? :priere: