Listes deroulantes PHP

cs_la_main_sur_le_katana Messages postés 15 Date d'inscription lundi 25 juin 2007 Statut Membre Dernière intervention 2 septembre 2007 - 25 juil. 2007 à 19:12
rethenor Messages postés 48 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 9 mai 2011 - 31 juil. 2007 à 00:06
Bonjour,
j'ai un soucis. Je dois faire un formulaire avec 2 listes déroulantes liées plus des champs texte à remplir en PHP. J'arrive à faire 2 listes déroulantes dépendantes l'une de l'autre mais ce qu'il y a c'est que je dois remplir les champs texte pour modifier la base de données qui se trouvent derrière (base de données MYSQL). Je dois récupérer les valeurs sélectionnées dans les 2 listes plus les champs entrés et mettre tout ça dans une requête. Le problème c'est que dans le action de mon formulaire j'ai "<?php echo($_SERVER['PHP_SELF']); ?>" et donc je sais pas comment faire pour appeler une page php qui va faire la requête sql avec les éléments récupérés.

Merci de votre aide

10 réponses

rethenor Messages postés 48 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 9 mai 2011
25 juil. 2007 à 20:05
Je ne sais pas si c'est ça, mais si j'ai bien compris quand tu valides ton formulaire, la page se rappelle elle-même ($_SERVER['PHP_SELF']). C'est bien ça ? Mais tu voudrais en profiter pour alimenter ta base. Correct ?


Le problème que tu poses est-il lié à des listes déroulantes dépendantes et aux données saisies ou au rappel de la page par elle-même ?


Quand tu valides un formulaire, tu passes au script de traitement les valeurs de tous les contrôles de ton formulaire (input, select, checkbox, etc...), y compris celui du bouton submit.


Donc si dans les valeurs transmises, $submit n'est pas nul, c'est que le formulaire a été validé, donc tu engranges dans ta BD sinon, tu affiches le formulaire :


if($submit) {


   // construction requete d'insertion puis insertion dans BD


} else {


   // affichage du formulaire


}


Si tu veux réafficher le formulaire systématiquement après insertion :


if($submit) {


   // construction requete d'insertion puis insertion dans BD


}


// affichage du formulaire


Enfin, c'est ce que j'ai compris dans ce que tu as exposé...
0
cs_la_main_sur_le_katana Messages postés 15 Date d'inscription lundi 25 juin 2007 Statut Membre Dernière intervention 2 septembre 2007
26 juil. 2007 à 18:50
Tu as bien compris mon problème mais j'aurais 2, 3 précisions à te demander sur les indications que tu m'as donné : tout d'abord, d'après ce que j'ai compris tout ce fait dans un formulaire donc je dois laisser en action le ($_SERVER['PHP_SELF']) mais la varaible $submit comment tu l'obtiens?Je veux dire es ce qu'il faut faire une affectation ou autre chose?
0
rethenor Messages postés 48 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 9 mai 2011
26 juil. 2007 à 19:53
Voilà succinctement deux exemples qui j'espère te suffiront.

Tu trouveras ces pages en service pour démo à :


http://www.fr-webdev.net/demophp/


test1.php pour le premier
test2.php pour le second





<html>



<head>
<title>Test</title>
</head>




Formulaire ou Traitement

<?
if($submit) {



 // si on passe par ici, le formulaire a été validé
 $requete = "INSERT into TableTest (nom,mois) values ('$nom','$moisnaiss');";
 // Ici (pour la démo) affichage de la requête. En réalité, il faut l'exécuter
 echo " Au lieu d'afficher la requête, il faudrait l'exécuter...
";
 echo $requete;



} else { ?>



 <!-- si on passe par ici, c'est le premier appel (pas de $submit) -->
 <!-- Affichage du formulaire (simplifié pour l'exemple) -->
 <form name ="test" method= "post" action="<? echo $_SERVER['PHP_SELF']; ?>">
 Nom:

 Né en: <select name="moisnaiss">
   <option value="jan">janvier
   <option value="feb">février
   <option value="mar">mars
   <option value="apr">avril
  </select>

 
 </form>



<? } ?>




</html>




ou si tu veux réafficher d'office le formulaire :




<html>



<head>
<title>Test</title>
</head>




Formulaire ou (Traitement + Formulaire)

<?
if($submit) {



 // si on passe par ici, le formulaire a été validé
 $requete = "INSERT into TableTest (nom,mois) values ('$nom','$moisnaiss');";
 // Ici (pour la démo) affichage de la requête. En réalité, il faut l'exécuter
 echo " Au lieu d'afficher la requête, il faudrait l'exécuter...
";
 echo $requete; echo "<hr>";



} ?>



<!-- on passe d'office par ici, premier ou second appel (avec ou sans $submit) -->
<!-- Affichage du formulaire (simplifié pour l'exemple) -->
<form name ="test" method="post" action="<? echo $_SERVER['PHP_SELF']; ?>">
Nom:

Né en: <select name="moisnaiss">
  <option value="jan">janvier
  <option value="feb">février
  <option value="mar">mars
  <option value="apr">avril
 </select>

</form>







Ai-je répondu à ta question ?
:o)
0
cs_la_main_sur_le_katana Messages postés 15 Date d'inscription lundi 25 juin 2007 Statut Membre Dernière intervention 2 septembre 2007
27 juil. 2007 à 21:21
En fait, j'ai essayé ton code et ça marche pas. Il me met Undefined variable :submit et donc la requête ne s'effectue pas. J'ai essayé de mettre $submit=$_POST['submit'] mais ça marche pas non plus.

Je te mets en-dessous mon code php avec des 2 listes déroulantes liées entre elles. En fait dans ma base, il ya 2 tables : une qui s'appelle societe_bus et l'autre ligne_bus sachant qu'une société a plusieurs lignes. En fait avec la liste je voudrais  fais une requête sql qui va prendre les valeurs sélectionnées dans chacune des listes mais également rajouter un champ texte par la suite qui sera un élément en plus dans la requête.
//-------------------Création des tables--------------------------------------
CREATE TABLE `societe_bus` (
  `id_societe_bus` int(11) NOT NULL auto_increment,
  `nom_societe` varchar(50) default NULL,
  PRIMARY KEY  (`id_societe_bus`)
)
//------------------------------------------------------------------------------
CREATE TABLE `ligne_bus` (
  `id_ligne_bus` int(11) NOT NULL auto_increment,
  `numero_ligne` int(3) default NULL,
  `id_societe_bus` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id_ligne_bus`),
  KEY `id_societe_bus` (`id_societe_bus`)
)

//------Code PHP des 2 listes dépendantes----------------------------------------

<?php
    //connexion à la base
    include("include/connexion.php");
   
    //on récupère si elle existe la valeur de la société envoyée par le formulaire
    $idr=isset($_POST['nomsociete'])?$_POST['nomsociete']:null;
?>
<html>

<?php
    if(isset($_POST['ok'])&& isset($_POST['ligne'])&& $_POST['ligne']!="")
    {
        $societe_selectionnee=$_POST['nomsociete'];
        $ligne_selectionnee=$_POST['ligne'];
    }
?>
Trouver une ligne

<?php
    $rech_societe=mysql_query("select id_societe_bus, nom_societe from societe_bus order by id_societe_bus")or die (mysql_error());
   
    //création de 2 tableaux
    $code_societe=array();
    $societe=array();
   
    //onactive un compteur pour les sociétés
    $nb_societe=0;
    if($rech_societe!=false)
    {
        while($ligne=mysql_fetch_assoc($rech_societe))
        {
            //onremplit les 2 tableaux avec l'id et le nom des sociétés retournés par la requête
            array_push($code_societe,$ligne['id_societe_bus']);
            array_push($societe, $ligne['nom_societe']);
           
            //incrémentation du compteur
            $nb_societe++;
        }
    }
?>
<!--Début du formulaire-->
<form method="post" id="chgligne">

<!--première liste déroulante contenant le nom des sociétés de bus -->
Sélectionner une société :
<select name="nomsociete" id="nomsociete" onchange="document.forms['chgligne'].submit();">
    <option value="-1">--Choississez une société --</option>
<?php
    for($i=0;$i<$nb_societe;$i++)
    {
?>
    <option value="<?php echo($code_societe[$i]);?>"<?php echo((isset($idr)&& $idr==$code_societe[$i])?" selected="selected"" :null); ?>><?php echo($societe[$i]);?></option>
<?php
    }
?>

</select>
<!-- fin de la liste déroulante-->

<?php
    //on commence par vérifier si on a envoyé un numéro de société et le cas échéant s'il est différent de -1
    if(isset($idr)&& $idr!=-1)
    {
        //création de la requête pour avoir les lignes de cette société
        $rech_ligne=mysql_query("select id_ligne_bus,numero_ligne from ligne_bus where id_societe_bus=".$idr." order by id_ligne_bus")or die (mysql_error());
       
        //compteur pour les lignes de bus
        $nb_ligne=0;
       
        //création de deux tableaux pour les id et les numéros de lignes de bus
        $code_ligne=array();
        $numero_ligne=array();
       
        //on va remplir le tableau du numéro
        while($ligne_l=mysql_fetch_assoc($rech_ligne))
        {
            array_push($numero_ligne,$ligne_l['numero_ligne']);
           
            //incrémentation du compteur
            $nb_ligne++;
        }
       
        //maintenant construction de la liste déroulante
?>

Sélectionner une ligne de bus :
<select name="ligne" id="ligne">
<?php
    for($j=0;$j<$nb_ligne;$j++)
    {
?>
    <option value="<?php echo($code_ligne[$j]); ?>"<?php echo((isset($ligne_selectionnee) && $ligne_selectionnee==$cpde_ligne[$j])? "selected="selected"":null);?>><?php echo ($numero_ligne[$j]);?></option>
<?php
    }
?>
</select>
<!--fin de la deuxième liste déroulante-->
<?php
    }
?>

<!--bouton submit du formulaire-->



</form>

</html>
//------------------------------------------------------------------------------------
Merci pour ton aide.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
rethenor Messages postés 48 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 9 mai 2011
28 juil. 2007 à 12:16
Quel code ne marche pas ?
- est-ce que les deux pages test1.php et test2.php placées sur
  http://www.fr-webdev.net/demophp/ fonctionnent ?
- est-ce la modification de ta page qui ne marche pas ?


Tu mets :
<!--bouton submit du formulaire-->


pourquoi a-tu donné "ok" comme nom à ce contrôle (ce bouton) ?
- soit tu ne mets pas le name="submit" et il prendra pour nom le type (cad submit)
- le plus propre est de préciser le nom (name="submit").
  Et le script de traitement utilisera la variable $submit


A quoi sert l'attribut id="ok" ?
Dans quasiment chaque contrôle tu mets l'attribut id.
Il te sert à quoi ?
0
rethenor Messages postés 48 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 9 mai 2011
28 juil. 2007 à 14:37
Il me semble que tu as affiché les pages test1.php et test2.php mais que tu n'y as pas fait de saisie dans les formulaires pour les vérifier...
0
cs_la_main_sur_le_katana Messages postés 15 Date d'inscription lundi 25 juin 2007 Statut Membre Dernière intervention 2 septembre 2007
29 juil. 2007 à 10:03
J'ai essayé tes pages de test avec une vrai base et des vraies insertions mais ça me disait que la variable $submit n'était pas définie
0
rethenor Messages postés 48 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 9 mai 2011
29 juil. 2007 à 13:54
t'as pas répondu à mes questions ?
1) tu as affiché les pages test1 et test2 mais tu n'y a pas fait de saisie. As-tu réellement essayé ces pages de démo ?
2) c'est quoi ton attribut id="xxx" ?
3) qu'appelles-tu une vraie base ? Tu crois que j'utilises Access ? :o)
Quelle version de PHP utilises-tu ?
0
cs_la_main_sur_le_katana Messages postés 15 Date d'inscription lundi 25 juin 2007 Statut Membre Dernière intervention 2 septembre 2007
30 juil. 2007 à 18:57
Merci pour ton aide mais j'ai réussi à résoudre mon problème tout seul.
0
rethenor Messages postés 48 Date d'inscription mercredi 11 juillet 2007 Statut Membre Dernière intervention 9 mai 2011
31 juil. 2007 à 00:06
Salut,

ce serait peut-être sympa de dire où était le problème et comment il a été résolu...
Merci.
0
Rejoignez-nous