Formulaire avec menu deroulant qui affiche un champ d'une table

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Formulaire avec menu deroulant qui affiche un champ d'une table

par AB » 24 janv. 2009, 19:46

C'est le fonctionnement des formulaires select.

Le nom du select indique le nom de l'index qui sera créé dans le tableau Get ou Post de récupération des données (on utilise Post de préférence comme méthode dans la déclaration du formulaire ex method = post).
Donc on pourra récupérer par exemple la valeur de select name = "surnom" dans $_POST['surnom'].

Cette valeur sera égale à la valeur de l'option sélectionnée (value =) mais le visiteur verra ce qu'il y a écrit entre les balises option

Donc si

Code : Tout sélectionner

<form action="#" method="POST"> <select name = "surnom"> <option value="toto">pseudo1</option> <option value="titi">pseudo2</option> </select> <input type ="submit " value " envoyer" /> </form>

Le visiteur verra une liste avec pseudo1 et pseudo2 et s'il clique sur pseudo2 et qu'il envoie le formulaire, cela va générer le code php : $_POST['surnom'] = 'titi'

N'oublies pas de mettre résolu :wink:

par remy42 » 24 janv. 2009, 18:48

<?php 
     while ($row = mysql_fetch_array($resultat))  
       {    echo "<option value=\"".$row['numclasse']."\">".$row['nom']."</option>";         }
      ?>  

Bonjour, je suis de retour pour une petite question.
Merci deja pour vos réponse précédente j'eesayer d'avancer petit a petit.

Une question sur la ligne "ECHO"
on met deux champs "numclasse" et "nomclasse" mais seul le "nomclasse" s'affiche ( super c'est ce que je veux). Mais je ne comprend pas trop comment ca marche car lorsque j'appel le resultat de mon formulaire pour faire ma requete INSERT INTO dans ma base de données s'insert le "numclasse" ( super c'est ce que je souhaite également ) mais j'aimerai s'avoir ce qui permet de dire sur la ligne ECHO on affiche "nomclasse" mais on retournera le "numclasse" correspondant comme résultat

Merci d'avance

par AB » 18 janv. 2009, 21:52

 //ligne ci-dessous modifiée 
   $selection_classe = "SELECT numclasse, nomclasse FROM classe";  
La en gros je comprend tu me dit si je me trompe mais on fait la requete sur la table complete pour choper le numclasse.

Ensuite

    <select name="num_classe"> 
   <?php 
     while ($row = mysql_fetch_array($resultat))  
       { 
        //ligne ci-dessous modifiée 
        echo "<option value="".$row['numclasse']."">".$row['nomclasse']."</option>";  
       } 
      ?> 
     </select> 
J'imagine qu'a la 6eme ligne si apres les $row on mettais comme au début ['nom'] et ['nom'] en recuperer la variables on aurait recuperer le nom de la classe et non l'id correspondant a celle ci mais je comprend pas le code ^^
Effectivement on a besoin de récupérer "numclasse" puisqu'il va te servir comme valeur dans les options que tu récupères pour faire ta requête d'insertion.

Sur le second point, Zahnzao t'a répondu dans les grandes lignes. N'oublies pas de cliquer sur les fonctions pour voir leur définition dans le manuel.

Quelques précisions :
Quand tu exécute une requête $resultat = mysql_query($selection_classe);
tu crée une ressource qui correspont au résultat de ta requête. Pour lire cette ressource il y a plusieurs possibilités : mysql_fetch_array(), mysql_fetch_assoc() ou mysql_fetch_row(). Comme indiqué dans ces fonctions cela retourne un tableau de la ligne du résultat et avance le pointeur interne pour lire la ligne suivante.
Donc tu pourrais lire tes lignes en faisant
$ligne1 = mysql_fetch_assoc($resultat);
echo $ligne1['numclasse'].' '.$ligne1['nomclasse'].'<br />';

$ligne2 = mysql_fetch_assoc($resultat);
echo $ligne2['numclasse'].' '.$ligne2['nomclasse'].'<br />';

$ligne3 = mysql_fetch_assoc($resultat);
echo $ligne3['numclasse'].' '.$ligne3['nomclasse'].'<br />';

//etc.
Donc pour lister toutes les lignes on fait une boucle avec while() qui corresond à :
Tant que $ligne retourne un résultat correspondant à mysql_fetch_assoc($resultat) on affiche les valeurs
while ($ligne = mysql_fetch_array($resultat))   
       {  
        echo "<option value="".$ligne['numclasse']."">".$ligne['nomclasse']."</option>";   
       }

par Zahnzao » 17 janv. 2009, 16:24

Salut, je peux te répondre.

En fait ceci
while ($row = mysql_fetch_array($resultat))  
       { 
        //ligne ci-dessous modifiée 
        echo "<option value=\"".$row['numclasse']."\">".$row['nomclasse']."</option>";  
       }  
est une boucle qui passe en revue chaque ligne de ta table classe. (ou plus précisement le tableau $row[] renvoyé par ta requête SQL)

Donc si on imagine que ta table classe se compose de cette manière.

numclasse | nomclasse

1 | un
2 | deux
3 | trois
4 | quatre

Alors la boucle ci dessus se répétera 4 fois, le premier passage renverra

$row['numclasse'] = 1 et $row['nomclasse'] = 'un'

le deuxieme

$row['numclasse'] = 2 et $row['nomclasse'] = 'deux'

et ainsi de suite ...

ce qui affichera au final

<option value="1">un</option>
<option value="2">deux</option>
<option value="3">trois</option>
<option value="4">quatre</option>

par remy42 » 17 janv. 2009, 02:17

Bonsoir,

Merci beaucoup AB pour ton aide.
C'est pas mes devoir lol j'apprend le php. Ton aide m'est précieuse j'essai egalement de me debrouiller un peu de mon coter mais sur le net tu trouve tout et nimporte quoi.

Alors pour information j'ai tester ton code en l'adaptant bien avec mes nom de tables etc et ca fonctionne nikel pour l'ajout. J'ai vérifié ma BDD et j'ai bien le num_classe dans ma table élèves qui s'est ajouté. Super.

Cependant copier coller sans comprendre sa sert a rien lol tu me dira pas le contraire. :) C'est pourquoi je me permet de te demander si tu le souhaite, peut tu m'expliquer les lignes modifier car je vois en gros mais je comprend pas tout.

 //ligne ci-dessous modifiée 
   $selection_classe = "SELECT numclasse, nomclasse FROM classe";  
La en gros je comprend tu me dit si je me trompe mais on fait la requete sur la table complete pour choper le numclasse.

Ensuite

    <select name="num_classe"> 
   <?php 
     while ($row = mysql_fetch_array($resultat))  
       { 
        //ligne ci-dessous modifiée 
        echo "<option value=\"".$row['numclasse']."\">".$row['nomclasse']."</option>";  
       } 
      ?> 
     </select> 
Ci dessus c'est la que je comprend pas ce qui se passe exactement.
1ere ligne on crée le menu déroulant
3eme ligne ca fait quoi ?
6eme ligne Je pense que toute la subtiliter de ce que je voulais se situe ici mais je ne comprend rien lol désolé ca peut parraitre facile pour toi j'imagine

J'imagine qu'a la 6eme ligne si apres les $row on mettais comme au début ['nom'] et ['nom'] en recuperer la variables on aurait recuperer le nom de la classe et non l'id correspondant a celle ci mais je comprend pas le code ^^


Si tu veut bien m'expliquer comme ca j'aurai compris ^^

Je te remercie encore pour ton aide a bientôt

par AB » 16 janv. 2009, 01:19

Hé dis, j'ai un peu l'impression de faire tes devoirs à ta place...
<?php
  //connection au serveur
  
	$serveurBD = "localhost";
    $nomUtilisateur = "root";
    $motDePasse = "";
    $baseDeDonnees = "intranet";
   
    $idConnexion = mysql_connect($serveurBD,
                                 $nomUtilisateur,
                                 $motDePasse);
                                 
    
  //sélection de la base de données:
  
    $connexionBase = mysql_select_db($baseDeDonnees);

  //ligne ci-dessous modifiée
   $selection_classe = "SELECT numclasse, nomclasse FROM classe"; 

   $resultat = mysql_query($selection_classe); 

//code de travail pour visualiser l'envoi du post 
if (!empty($_POST)) 
   {
     echo '<pre>';
     print_r($_POST);
     echo '</pre>'; 
   }

?>
<html>
  <head>
    <title>Insertion d'un eleve</title>
  </head>
  
  
<body>
<form name="insertion" action="#" method="POST">
  <table border="0" align="center" cellspacing="2" cellpadding="2">
    <tr align="center">
      <td>nom</td>
      <td><input type="text" name="nom"></td>
    </tr>
    <tr align="center">
      <td>prenom</td>
      <td><input type="text" name="prenom"></td>
    </tr>

    <tr><td>
    <!--ligne ci-dessous modifiée-->
    <select name="num_classe">
   <?php
     while ($row = mysql_fetch_array($resultat)) 
       {
        //ligne ci-dessous modifiée
        echo "<option value=\"".$row['numclasse']."\">".$row['nomclasse']."</option>"; 
       }
      ?>
     </select>
    </td></tr>
 
    <tr align="center">
      <td colspan="2"><input type="submit" value="insérer"></td>
    </tr>
  </table>
</form>
</body>
</html>
J'ai indiqué les trois lignes modifiées (par rapport au code précédent) pour que tu puisse construire ta requête d'insertion facilement.

par remy42 » 16 janv. 2009, 00:20

Merci a vous pour votre aide
J'ai tester ton code AB et je commence a bien comprendre certaines chose c'est déja ca lol


Ce que je souhaite bien evidemment c'est INSERER le resultat de l'ajout dans la base de données "intranet" table "eleve"

Voici le modele de mes deux tables

CLASSE ( numclasse , nomclasse )
ELEVES ( numeleves, nom, prenom, age , #numclasse)

#numclasse qui est la clé etrangere de numclasse de la table "CLASSE"

cependant dans mon menu déroulant c'est le nom des "classes" qui apparait logique c'est plus intuitif que l'id par exemple. Cependant lors de ma requete pour l'insertion dans la base

$sql = "INSERT  INTO eleves (nom,prenom,age,numclasse)
            VALUES ( '$nomeleve', '$prenomeleve','$ageeleve','[b]XXXXXXX[/b]') " ; 

1- A la place des XXXX je met quoi ??

2- En clé étrangere il va falloir transformer le nom de la classe apparaissant dans le menu déroulant pour qu'il devienne l'id correspondant a cette classe. Comment faire ??



J'espere que je suis assez clair dans mes propos sinon dites le moi.

Merci d'avance pour vos réponses.

par AB » 16 janv. 2009, 00:10

Un code à peu près bien structuré donnerait ceci :
<?php
  //connection au serveur
  
	$serveurBD = "localhost";
    $nomUtilisateur = "root";
    $motDePasse = "";
    $baseDeDonnees = "intranet";
   
    $idConnexion = mysql_connect($serveurBD,
                                 $nomUtilisateur,
                                 $motDePasse);
                                 
    
  //sélection de la base de données:
  
    $connexionBase = mysql_select_db($baseDeDonnees);

   $selection_classe = "SELECT nom FROM classe"; 
   $resultat = mysql_query($selection_classe); 

//code de travail pour visualiser l'envoi du post 
if (!empty($_POST)) 
   {
     echo '<pre>';
     print_r($_POST);
     echo '</pre>'; 
   }

?>
<html>
  <head>
    <title>Insertion d'un eleve</title>
  </head>
  
  
<body>
<form name="insertion" action="#" method="POST">
  <table border="0" align="center" cellspacing="2" cellpadding="2">
    <tr align="center">
      <td>nom</td>
      <td><input type="text" name="nom"></td>
    </tr>
    <tr align="center">
      <td>prenom</td>
      <td><input type="text" name="prenom"></td>
    </tr>

    <tr><td>
    <select name="nom_classe">
   <?php
     while ($row = mysql_fetch_array($resultat)) 
       {
        echo "<option value=\"".$row['nom']."\">".$row['nom']."</option>"; 
       }
      ?>
     </select>
    </td></tr>
 
    <tr align="center">
      <td colspan="2"><input type="submit" value="insérer"></td>
    </tr>
  </table>
</form>
</body>
</html>
Testes et tu finiras bien par comprendre.

par mike001 » 16 janv. 2009, 00:05

pour la sécurité contre les failles sql, les sessions ne sont pas efficaces pour filtrer les variables envoyés ...

Voici le code général pour sécurisé les variables récupérés avant de les utilisé :
$var = htmlentities(htmlspecialchars($var));
if( !get_magic_quotes_gpc() )
{
$var = addslashes($var); // remplacer $var par ta variable et ensuite l'utiliser ...
}
et le code met-le soit dans une deuxième page après avoir récupéré les variables en get et les avoirs filtré avec le code que je vient de mettre ci-dessus ...
ou soit dans la même page avec un :

 if(isset($_POST['nom']) AND isset($_POST['prenom']) AND !empty($_POST['nom']) AND !empty($_POST['nprenom']) )
{
//ajoute à la base de donnée ...
}
else
{
//code html pour ajouter avec le code qui liste les classe
}

par remy42 » 15 janv. 2009, 23:27

C'est fait dsl j'avais pas tilter que je postais sans être inscrit.

Pour la securité j'ai mis en place les sessions c'est tout pour le moment

je viens d'essayer le code ci dessus il manquai une ligne
echo "<SELECT NAME='liste_deroulante' onChange='FocusObjet()'>"; 
J'ai trouver cette info en farfouillant sur le net. Mais je ne comprend pas exactement ce qu'elle fait pouvez vous m'expliquer car dans cette ligne nul part on dit de metre le resultat de la requete dans une liste deroulante car sur cette ligne nul part apparait la variable resulat.

COmment ca fonctionne ?

<?php
  //connection au serveur
  
	$serveurBD = "localhost";
    $nomUtilisateur = "root";
    $motDePasse = "";
    $baseDeDonnees = "intranet";
   
    $idConnexion = mysql_connect($serveurBD,
                                 $nomUtilisateur,
                                 $motDePasse);
                                 
    
  //sélection de la base de données:
  
    $connexionBase = mysql_select_db($baseDeDonnees);


echo "<SELECT NAME='liste_deroulante' onChange='FocusObjet()'>"; 
$selection_classe = "SELECT nom FROM classe"; 
$resultat = mysql_query($selection_classe); 
while ($row = mysql_fetch_array($resultat))  
{ 
echo "<option value=\"".$row[0]."\">".$row[0]."</option>";  
} 
?>
Et si tu pouvais m'expliquer , me commenter les dernieres lignes de $selection_classe jusqu'au Echo

Merci encore

par AB » 15 janv. 2009, 23:18

Puisque tu poses plusieurs questions, pourquoi ne t'inscris-tu pas. Cela te permettrait entre autre d'éditer tes messages et de mettre résolu quand c'est le cas. D'ailleurs à ce propos, c'en est où ce topic et as-tu pensé à protéger tes requêtes pour éviter le piratage de tes tables.

Pour répondre à ta dernière question essaie de mettre le code de Mike001 dans ton formulaire puisque ce code est fait pour générer automatiquement la liste de tes classes. C'est bien ce que tu souhaitais ?

par remy42 » 15 janv. 2009, 22:37

J'ai pas tout compris les lignes de codes. Dsl je débute :)

Ca tu le copie dans ta page ou tu a le formulaire je supose ? mais sous quel forme car moi voila ma page du formulaire

<html>
  <head>
    <title>Insertion d'un eleve</title>
  </head>
  
  
<body>
<form name="insertion" action="ajout_eleve.php" method="POST">
  <table border="0" align="center" cellspacing="2" cellpadding="2">
    <tr align="center">
      <td>nom</td>
      <td><input type="text" name="nom"></td>
    </tr>
    <tr align="center">
      <td>prenom</td>
      <td><input type="text" name="prenom"></td>
    </tr>
 
    <tr align="center">
      <td colspan="2"><input type="submit" value="insérer"></td>
    </tr>
  </table>
</form>
</body>
</html>

Je le met ou ce que tu me dit ??

Merci encore pour ton aide

Rémy

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

par mike001 » 15 janv. 2009, 21:11

ba tu selection avec :
<select name="pseudo">
<?php
$selection_classe = "SELECT nom FROM classe";
$resultat = mysql_query($selection_classe);
while ($row = mysql_fetch_array($resultat)) 
{
echo "<option value=\"".$row[0]."\">".$row[0]."</option>"; 
}
?>
</select>

Formulaire avec menu deroulant qui affiche un champ d'une ta

par remy42 » 15 janv. 2009, 21:04

Bonjour,

je m'explique je suis en train d'apprendre le php pour mes cours d'info car j'ai un mini projet a faire en php. Une gestion d'absence d'eleves.

J'ai crée mes tables dont 2 ( une classe , une eleves ) avec dans eleves une clé etrangere pointant vers la clé primaire de classe. Jusque la je pense que c'est logique.

Ma question est : Comment dans ma page de formulaire d'ajout d'élève je fais pour ajouter en bas un champ après Nom et Prénom qui va me proposer non pas d'ecrire la classe mais un menu déroulant qui m'affiche toutes les classes crée dans la table classe ( Juste le champ "nom" de la table "classe" )

Si quelqu'un peut m'aiguiller car je pinaille la et je trouve pas après plusieurs recherche.

Merci d'avance

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]