8791 sujets

Développement web côté serveur, CMS

Bonjour,
Impossible de sortir de ce casse-tête depuis trop de jours.
Je souhaite créer dans un formulaire php un menu déroulant où on choisit un pays (dans une table d'une bdd) et en fonction de ce 1er choix s'affiche un second menu déroulant avec les départements concernés (aussi dans 1 table.
JuseN m'a aidé et transmis un code (je le remercie encore) que j'ai adapté à mon cas.
RIEN A FAIRE.
Si quelqu'un avait un peu de temps pour regarder mon code et voir ce qui ne va pas ça me sortirai d'un gros pétrin. Les "echo" sont des repères pour voir où ça ne va pas uniquement :

[code=php]<?php

$connexion = mysql_pconnect($serveur, $admin, $mdp);

echo '<p>====$connexion======</p>';
echo $connexion;

if($connexion != false)

{

$choixbase = mysql_select_db($base, $connexion);

$sql1 = "SELECT `id_pays`, `nomPays`".

" FROM `PAYS`".

" ORDER BY `id_pays`";

// ICI C'EST LA PREMIERE REQUETE POUR SELECTIONNER UN PAYS DANS UNE FUTURE LISTE DEROULANTE

$rech_pays = mysql_query($sql1);

$id_pays = array();

$nomPays = array();

echo '<p>====$rech_pays======</p>';
echo $rech_pays;
echo '<p>-----$id_pays---</p>';
echo $id_pays;
echo '<p>-----$nomPays-----</p>';
echo $nomPays;

/* On active un compteur pour les régions */

$nb_pays = 0;

if($rech_pays != false)

{

while($ligne = mysql_fetch_assoc($rech_pays))

{

array_push($id_pays, $ligne['id_pays']);

array_push($nomPays, $ligne['nomPays']);

/* On incrémente de compteur */

$nb_pays++;

}

}
echo '<p>****avant form action ***</p>';
echo $nb_pays;

?>

<form action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post" id="chgdepartement">



<p>Sélectionnez un pays</p>

<select name="nomPays" id="nomPays" onchange="document.forms['chgdepartement'].submit();">

<option value="-1">- - - Choisissez un pays- - -</option>

<?php

echo '****avant boucle***<br />';
echo $nb_pays;

for($i = 0; $i < $nb_pays; $i++)

{

?>

<option value="<?php echo($id_pays[$i]); ?>"<?php echo((isset($idp) && $idp == $id_pays[$i])?" selected=\"selected\"":null); ?>><?php echo($nomPays[$i]); ?></option>
// ICI C'EST LA LISTE DEROULANTE, DANS VALUE ON A L'ID ET ENTRE LA BALISE OPTION ON A nomPays
<?php

}

?>

</select>

<?php

mysql_free_result($rech_pays);

/* On commence par vérifier si on a envoyé un numéro de région et le cas échéant s'il est différent de -1 */

if(isset($idp) && $idp != -1)

{

/* Cération de la requête pour avoir les départements de cette région */

$sql2 = "SELECT `id_departement`, `nomDepartement`".

" FROM `DEPARTEMENT`".

" WHERE `id_pays` = ". $idp ."".

" ORDER BY `id_departement`;";

//ICI CEST LA DEUXIEME REQUETE POUR TROUVER UN DEPARTEMENT SUIVANT CE QUON A SELECTIONNER EN nomPays
// AVEC LA CLAUSE WHERE IDnomPays=$idr

if($connexion != false)

{

$rech_departement = mysql_query($sql2, $connexion);

/* Un petit compteur pour les départements */

$nd = 0;

/* On crée deux tableaux pour les numéros et les noms des départements */

$id_departement = array();

$nomDepartement = array();

/* On va mettre les numéros et noms des départements dans les deux tableaux */

while($ligne_departement = mysql_fetch_assoc($rech_departement))

{

array_push($id_departement, $ligne_departement['id_departement']);

array_push($nomDepartement, $ligne_departement['nomDepartement']);

$nd++;

}

/* Maintenant on peut construire la liste déroulante */

?>

<select name="nomDepartement" id="nomDepartement">

<?php

for($d = 0; $d<$nd; $d++) // BOUCLE POUR LA DEUXIEME LISTE DEROULANTE

{

?>

<option value="<?php echo($id_departement[$d]); ?>"<?php echo((isset($dept_selectionne) && $dept_selectionne == $id_departement[$d])?" selected=\"selected\"":null); ?><?php echo($nomDepartement[$d]." (". $id_departement[$d] .")"); ?></option>

<?php

}

?>

</select>

<?php
}
/* Un petit coup de balai */
mysql_free_result($rech_departement);
}
?>


<?php
/* Terminé, on ferme la connexion */
mysql_close($connexion);
}
else
{
/* Si on arrive là, c'est pas bon signe, il faut vérifier les
paramètres de connexion, mot de passe, serveur pas démarré etc... */
?>
<p>Un incident s'est produit lors de la connexion à la base de données, veuiillez essayer à nouveau ultérieurement.</p>
<?php
}
?> [<?php

$connexion = mysql_pconnect($serveur, $admin, $mdp);

echo '<p>====$connexion======</p>';
echo $connexion;

if($connexion != false)

{

$choixbase = mysql_select_db($base, $connexion);

$sql1 = "SELECT `id_pays`, `nomPays`".

" FROM `PAYS`".

" ORDER BY `id_pays`";

// ICI C'EST LA PREMIERE REQUETE POUR SELECTIONNER UN PAYS DANS UNE FUTURE LISTE DEROULANTE

$rech_pays = mysql_query($sql1);

$id_pays = array();

$nomPays = array();

echo '<p>====$rech_pays======</p>';
echo $rech_pays;
echo '<p>-----$id_pays---</p>';
echo $id_pays;
echo '<p>-----$nomPays-----</p>';
echo $nomPays;

/* On active un compteur pour les régions */

$nb_pays = 0;

if($rech_pays != false)

{

while($ligne = mysql_fetch_assoc($rech_pays))

{

array_push($id_pays, $ligne['id_pays']);

array_push($nomPays, $ligne['nomPays']);

/* On incrémente de compteur */

$nb_pays++;

}

}
echo '<p>****avant form action ***</p>';
echo $nb_pays;

?>

<form action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post" id="chgdepartement">



<p>Sélectionnez un pays</p>

<select name="nomPays" id="nomPays" onchange="document.forms['chgdepartement'].submit();">

<option value="-1">- - - Choisissez un pays- - -</option>

<?php

echo '****avant boucle***<br />';
echo $nb_pays;

for($i = 0; $i < $nb_pays; $i++)

{

?>

<option value="<?php echo($id_pays[$i]); ?>"<?php echo((isset($idp) && $idp == $id_pays[$i])?" selected=\"selected\"":null); ?>><?php echo($nomPays[$i]); ?></option>
// ICI C'EST LA LISTE DEROULANTE, DANS VALUE ON A L'ID ET ENTRE LA BALISE OPTION ON A nomPays
<?php

}

?>

</select>

<?php

mysql_free_result($rech_pays);

/* On commence par vérifier si on a envoyé un numéro de région et le cas échéant s'il est différent de -1 */

if(isset($idp) && $idp != -1)

{

/* Cération de la requête pour avoir les départements de cette région */

$sql2 = "SELECT `id_departement`, `nomDepartement`".

" FROM `DEPARTEMENT`".

" WHERE `id_pays` = ". $idp ."".

" ORDER BY `id_departement`;";

//ICI CEST LA DEUXIEME REQUETE POUR TROUVER UN DEPARTEMENT SUIVANT CE QUON A SELECTIONNER EN nomPays
// AVEC LA CLAUSE WHERE IDnomPays=$idr

if($connexion != false)

{

$rech_departement = mysql_query($sql2, $connexion);

/* Un petit compteur pour les départements */

$nd = 0;

/* On crée deux tableaux pour les numéros et les noms des départements */

$id_departement = array();

$nomDepartement = array();

/* On va mettre les numéros et noms des départements dans les deux tableaux */

while($ligne_departement = mysql_fetch_assoc($rech_departement))

{

array_push($id_departement, $ligne_departement['id_departement']);

array_push($nomDepartement, $ligne_departement['nomDepartement']);

$nd++;

}

/* Maintenant on peut construire la liste déroulante */

?>

<select name="nomDepartement" id="nomDepartement">

<?php

for($d = 0; $d<$nd; $d++) // BOUCLE POUR LA DEUXIEME LISTE DEROULANTE

{

?>

<option value="<?php echo($id_departement[$d]); ?>"<?php echo((isset($dept_selectionne) && $dept_selectionne == $id_departement[$d])?" selected=\"selected\"":null); ?><?php echo($nomDepartement[$d]." (". $id_departement[$d] .")"); ?></option>

<?php

}

?>

</select>

<?php
}
/* Un petit coup de balai */
mysql_free_result($rech_departement);
}
?>


<?php
/* Terminé, on ferme la connexion */
mysql_close($connexion);
}
else
{
/* Si on arrive là, c'est pas bon signe, il faut vérifier les
paramètres de connexion, mot de passe, serveur pas démarré etc... */
?>
<p>Un incident s'est produit lors de la connexion à la base de données, veuiillez essayer à nouveau ultérieurement.</p>
<?php
}
?>
<?php

$connexion = mysql_pconnect($serveur, $admin, $mdp);
 	    
	      echo '<p>====$connexion======</p>';
	    echo $connexion;

if($connexion != false)

{

    $choixbase = mysql_select_db($base, $connexion);

    $sql1 = "SELECT `id_pays`, `nomPays`".

    " FROM `PAYS`".

    " ORDER BY `id_pays`";

//  ICI C'EST LA PREMIERE REQUETE POUR SELECTIONNER UN PAYS DANS UNE FUTURE LISTE DEROULANTE

    $rech_pays = mysql_query($sql1);

    $id_pays = array();

    $nomPays = array();
    
     echo '<p>====$rech_pays======</p>';
	    echo $rech_pays;
		echo '<p>-----$id_pays---</p>';
	    echo $id_pays;	
	    echo '<p>-----$nomPays-----</p>';
	    echo $nomPays;

    /* On active un compteur pour les régions */

    $nb_pays = 0;

    if($rech_pays != false)

    {

        while($ligne = mysql_fetch_assoc($rech_pays))

        {

            array_push($id_pays, $ligne['id_pays']);

            array_push($nomPays, $ligne['nomPays']);

            /* On incrémente de compteur */

            $nb_pays++;

        }

    }
  echo '<p>****avant form action ***</p>';
             echo $nb_pays;

    ?>
 
<form action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post" id="chgdepartement">



<p>Sélectionnez un pays</p>

<select name="nomPays" id="nomPays" onchange="document.forms['chgdepartement'].submit();">

  <option value="-1">- - - Choisissez un pays- - -</option>

    <?php
    
    	     echo '****avant boucle***<br />';
             echo $nb_pays;

    for($i = 0; $i < $nb_pays; $i++)

    {

?>

  <option value="<?php echo($id_pays[$i]); ?>"<?php echo((isset($idp) && $idp == $id_pays[$i])?" selected=\"selected\"":null); ?>><?php echo($nomPays[$i]); ?></option>
// ICI C'EST LA LISTE DEROULANTE, DANS VALUE ON A L'ID ET ENTRE LA BALISE OPTION ON A nomPays
<?php

    }

    ?>

</select>

    <?php

   mysql_free_result($rech_pays);

    /* On commence par vérifier si on a envoyé un numéro de région et le cas échéant s'il est différent de -1 */
      	    
    if(isset($idp) && $idp != -1)

    {

        /* Cération de la requête pour avoir les départements de cette région */

        $sql2 = "SELECT `id_departement`, `nomDepartement`".

        " FROM `DEPARTEMENT`".

        " WHERE `id_pays` = ". $idp ."".

        " ORDER BY `id_departement`;";

//ICI CEST LA DEUXIEME REQUETE POUR TROUVER UN DEPARTEMENT SUIVANT CE QUON A SELECTIONNER EN nomPays
// AVEC LA CLAUSE WHERE IDnomPays=$idr

        if($connexion != false)

        {

            $rech_departement = mysql_query($sql2, $connexion);

            /* Un petit compteur pour les départements */

            $nd = 0;

            /* On crée deux tableaux pour les numéros et les noms des départements */

            $id_departement = array();

            $nomDepartement = array();

            /* On va mettre les numéros et noms des départements dans les deux tableaux */

            while($ligne_departement = mysql_fetch_assoc($rech_departement))

            {

                array_push($id_departement, $ligne_departement['id_departement']);

                array_push($nomDepartement, $ligne_departement['nomDepartement']);

                $nd++;

            }

            /* Maintenant on peut construire la liste déroulante */

            ?>

<select name="nomDepartement" id="nomDepartement">

            <?php  

            for($d = 0; $d<$nd; $d++) // BOUCLE POUR LA DEUXIEME LISTE DEROULANTE

            {

                ?>

  <option value="<?php echo($id_departement[$d]); ?>"<?php echo((isset($dept_selectionne) && $dept_selectionne == $id_departement[$d])?" selected=\"selected\"":null); ?><?php echo($nomDepartement[$d]." (". $id_departement[$d] .")"); ?></option>

                <?php

            }

?>

</select>

<?php
        }
        /* Un petit coup de balai */
        mysql_free_result($rech_departement);
    }
?>


<?php
    /* Terminé, on ferme la connexion */
    mysql_close($connexion);
}
else
{
    /* Si on arrive là, c'est pas bon signe, il faut vérifier les 
   paramètres de connexion, mot de passe, serveur pas démarré etc... */
?>
<p>Un incident s'est produit lors de la connexion à la base de données, veuiillez essayer à nouveau ultérieurement.</p>
<?php
}
?>  
Hi,

je te mets un code un peu plus structuré qui fait un ptit appel à de l'ajax (via JQuery): tu as besoin de 3 fichiers:
- metier.php qui contient les traitements.
- ajax.php, qui contient le code à exécuter par l'appel ajax.
- index.php, le fichier principal qui coordonne le tout.

Les 3 fichiers sont dans le même répertoire (tu peux le modifier, faut juste revoir les chemins des inclusions)
En l'état, le système est fonctionnel; pour l'adapter à tes besoin, tu as seulement à implémenter les fonctions get_pays() et get_departement(), en respectant le format de sortie.

Fichier metier.php
<?php

/**
* Retourne un menu déroulant HTML
* Les deux tableaux correspondent l'un avec l'autre
* TODO : vérifications sur le format des tableaux
*
* @param array $valeurs attribut value des option
* @param array $textes affichage de l'info
* @param String $attributs HTML
* @return String
*/
function select( array $valeurs, array $textes, $attributs ){
	$code   = '<select ' . $attributs . ' >
				 ';
	$taille = sizeof( $valeurs );
	//Remplissage des options
	for( $i = 0 ; $i < $taille ; $i++ ){
		$code .= '<option value="' . $valeurs[$i] . '" >' .
		         $textes[$i] . '</option>
				 ' ;
	}
	$code .= '</select>
	';
	return $code ;
}

/**
* A partir d'une base de données, récupère la liste 
* des pays disponibles
* @param String $conditions pour ne sélectionner que quelques enr.
* @return array vecteur indicé contenant les pays
* Exemple :
*	$t[0] = 'France';
*   $t[1] = 'Belgique';
*   $t[2] = 'Kazakstan';
*/
function get_pays( $conditions = NULL ){
	//TODO : utilise ton accesseur BdD
	return array('France', 'Belgique','Kazakstan');
}

/**
* A partir d'une base de données, et du paramètre
* Pays, récupère tous les départements du pays considéré
* @param String $pays
* @return array 
* Exemple :      
*     $t['value'][0] = 1;
*     $t['value'][1] = 2;
*     $t['text'][0]  = 'Ain';
*     $t['text'][1]  = 'Aisne';
*/
function get_departements( $pays ){
	//TODO: toujours avec ton accesseur BdD
	return array('text' => array('Ain','Aisne','Allier'), 
	             'value' => array(1,2,3) );
}

?>


Fichier ajax.php

<?php
	require_once('metier.php');
	
	//TODO: vérification sur la variable récupérée/par défaut
	$dep = get_departements( $_GET['p'] ) ;
	
	echo $_GET['p'] . ':' . select($dep['value'], $dep['text'], 'id="departement" name="departement" ');
	
?>



Fichier index.php
<?php
 //Inclusion des fonctions de traitement
 require_once("metier.php");
?>

<!DOCTYPE html>
<html lang="en">
<head>
<title>Menu déroulants liés</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script language='javascript'>
	function maj_departements( main, id ){
		var pays = $('#' + main ).val() ;
		$.ajax({
			type: "GET",
			url: "ajax.php",
			data: { p: pays }
			})
		 .done(function( infos ) {
				$('#' + id ).html( infos );
		});
	}
</script>

</head>

<body onload="maj_departements('pays','dpt');">
<div id='formulaire'>
	<fieldset><legend>Sélectionnez un pays</legend>
		<div id='p'>
		<?php 
			$pays = get_pays();
			$code = '' ;
			$code .= select($pays, $pays, 'id="pays" name="pays" onchange="maj_departements(\'pays\',\'dpt\');"');
			echo $code ;
		?>
		</div>
		<div id='dpt'>
		</div>
	</fieldset>
</div>
</body>

</html>


J'ai fait ça en mode rapidos, donc il y a pas mal d'améliorations à apporter :
passer en objet, MVC, code ajax à optimiser, vérification des formats, traitement des erreurs,etc...

Et quand tu codes, même si tu ne fais pas d'orienté objet, utilise des fonctions, ça permet d'y voir plus clair; 200 lignes non stop c'est ultra moche.
Modifié par Zed13 (18 Jul 2012 - 23:34)
Bonsoir Zed13,
Je te remercie pour cette réponse tant attendue. Je désespérais.
Je teste tout ça demain car là je suis HS. Ca fait 2 semaines que je suis là-dessus. Je code, je recode, je poste... rien à faire.
Si j'arrive à régler le pp je poste partout pour donner la solution.
Quand tu dis "utilise des fonctions, ça permet d'y voir plus clair; 200 lignes non stop c'est ultra moche.", je suis désolée, je débute et je ne comprends pas tout mais j'essaie, ça m'intéresse beaucoup.
Demain je reprends avec tes conseils et je te tiens au courant.
Encore 1000 mercis, bonne soirée,
Evelyne31