Accueil
Trucs & Astuces
Scripts
Regex
Annuaire
Articles
.
|
Articles Listes déroulantes avec PHP, MySQL et JavaScript Par J-Pierre DEZELUS
Novembre 2000
Nous allons voir dans cet article comment associer PHP, MySQL et JavaScript pour générer des liste déroulantes dynamiques.
Nous étudierons 2 cas. Celui d'une liste dont le contenu se met à jour en fonction du choix fait dans une autre (Items / Rubriques), et celui de 2 listes IN et OUT où l'on peut faire passer les éléments d'une liste à l'autre.
MySQL servira à alimenter les listes, JavaScript à faire les sélections, et PHP traitera la demande.
Pour que les démonstrations fonctionnent vous devez avoir activé JavaScript sur votre navigateur. Il faut aussi 2 tables MySQL 'demo_rubrique' et 'demo_item' dont voici la srtucture et le contenu :
code | rubrique | 1 | Langage | 2 | OS | 3 | SGBD |
code | item | code_rub | 1 | PHP | 1 | 2 | ASP | 1 | 3 | JavaScript | 1 | 4 | C++ | 1 | 5 | Linux | 2 | 6 | Windows | 2 | 7 | Mac OS X | 2 | 8 | FreeBSD | 2 | 9 | Unix | 2 | 10 | MySQL | 3 | 11 | PostgreSQL | 3 | 12 | Oracle | 3 |
Dans ce premier exemple, la liste 'Items' est regénérée par JavaScript à chaque nouvelle sélection dans la liste 'Rubrique'. Il n'y a aucun appel à PHP et MySQL à ce moment puisque l'exécution se déroule maintenant côté client. Tout s'est fait au chargement de la page où tous les cas de figure ont été envisagés. Cette technique convient bien quand il y a peu de combinaisons possibles.
Vous pouvez faire quelques tests :
Voici le code source utilisé où l'on voit bien l'imbrication de PHP et MySQL pour générer le code JavaScript, qui lui-même génèrera la liste Item en fonction du choix fait dans la liste Rubrique.
<?php
@mysql_connect($hote, $user, $pass);
?>
<SCRIPT LANGUAGE="JavaScript">
function ModifierListe(code_item) { lg = document.frmDemo1.zlItem.length; // On vide la liste for (i = lg - 1; i >= 0; i--) { document.frmDemo1.zlItem.options[i] = null; } code_rub = document.frmDemo1.zlRubrique.selectedIndex;
<?php
// Génération des Items par Rubriques $sql = "SELECT code FROM demo_rubrique ORDER BY code"; $resultat = mysql_db_query($Base, $sql);
$max_lignes = 0; $option_max = '';
while ($enr = mysql_fetch_array($resultat)) { $sql = "SELECT code, item "; $sql .= "FROM demo_item "; $sql .= "WHERE code_rub='".$enr[0]."'"; $sql .= "ORDER BY item"; $resultat2 = mysql_db_query($Base, $sql);
echo " if (document.frmDemo1.zlRubrique.options[code_rub].value == ".$enr[0].") {\n"; echo " document.frmDemo1.zlItem.length = ".(mysql_num_rows($resultat2)).";\n"; $cpt = 0; while ($enr2 = mysql_fetch_array($resultat2)) { echo " document.frmDemo1.zlItem.options[".$cpt."].value = ".$enr2[0].";\n"; echo " document.frmDemo1.zlItem.options[".$cpt."].text = \"".$enr2[1]."\";\n"; echo " if (code_item == ".$enr2[0].") document.frmDemo1.zlItem.options[".$cpt."].selected = true;\n"; $cpt++; if ($cpt > $max_lignes) $max_lignes = $cpt; if (strlen($enr2[1]) > strlen($option_max)) $option_max = $enr2[1]; } echo " }\n";
}
?> }
</SCRIPT>
<?php
// ---------------------------------------------------------------------------- // Liste Rubriques // ---------------------------------------------------------------------------- $sql = "SELECT code, rubrique FROM demo_rubrique ORDER BY rubrique"; $resultat = mysql_db_query($Base, $sql);
echo "<FORM METHOD=POST NAME='frmDemo1'>";
echo "<BR> <B>Rubriques</B> "; echo " <SELECT NAME='zlRubrique' onChange='ModifierListe(-1)'>\n"; while ($enr = mysql_fetch_array($resultat)) { echo "<OPTION VALUE='".$enr[0]."'"; if ($zlRubrique == $enr[0]) echo " SELECTED"; echo ">".htmlspecialchars($enr[1])."</OPTION>\n"; } echo "</SELECT> \n";
// ---------------------------------------------------------------------------- // Liste Items // ---------------------------------------------------------------------------- echo " <B>Items</B> "; echo " <SELECT NAME='zlItem'>\n"; for ($cpt = 0; $cpt < $max_lignes; $cpt++) echo "<OPTION>".ereg_replace(".", "--", $option_max)."</OPTION>\n"; echo "</SELECT> \n"; if (!isset($zlItem)) $zlItem = -1; echo "<SCRIPT LANGUAGE='JavaScript'>\n;ModifierListe(".$zlItem.");\n</SCRIPT>\n"; // ----------------------------------------------------------------------------
echo "<INPUT TYPE='submit' VALUE='Valider'>\n";
echo "</FORM>";
// ---------------------------------------------------------------------------- // Résultats des sélections // ---------------------------------------------------------------------------- echo "Sélection :<BR>\n";
if (isset($zlRubrique) && $zlRubrique != "") { $sql = "SELECT rubrique FROM demo_rubrique WHERE code='".$zlRubrique."'"; $resultat = @mysql_db_query($Base, $sql); $enr = @mysql_fetch_array($resultat); echo "Rubrique = $zlRubrique [$enr[0]]<BR>\n"; }
if (isset($zlItem) && $zlItem != "" && $zlItem != -1) { $sql = "SELECT item FROM demo_item WHERE code='".$zlItem."'"; $resultat = @mysql_db_query($Base, $sql); $enr = @mysql_fetch_array($resultat); echo "Item = $zlItem [$enr[0]]<BR>\n"; }
?>
|
|
Ce deuxième exemple utilise les listes à sélection multiples. Vous pouvez ainsi voir comment on peut récupérer dans un tableau PHP les différentes sélections faites dans une liste.
Dans cet exemple le principe consiste à faire aller et venir les éléments d'une liste à une autre. Au moment de la validation, les éléments des 2 listes sont sélectionnés (en JavaScript) ce qui permet ensuite de récupérer dans 2 tableaux différents les items de la 1ère liste (IN) et ceux de la deuxième (OUT). Il ne reste plus qu'à faire les traitements appropriés (INSERT ou UPDATE pour ceux de la liste IN par exemple, DELETE pour ceux de la liste OUT).
Une nouvelle démo pour mieux comprendre :
Le code source utilisé, un mélange de PHP et de JavaScript.
<?php
@mysql_connect($hote, $user, $pass);
?>
<SCRIPT LANGUAGE="JavaScript">
function DeplacerItemDeVers(de, vers) {
var zlAv = "zlItem"+de+"[]"; var zlAp = "zlItem"+vers+"[]";
if (document.frmDemo2.elements[zlAv].options.selectedIndex >= 0) { while (document.frmDemo2.elements[zlAv].options.selectedIndex >= 0) { ind = document.frmDemo2.elements[zlAv].options.selectedIndex; texte = document.frmDemo2.elements[zlAv].options[ind].text; valeur = document.frmDemo2.elements[zlAv].options[ind].value; document.frmDemo2.elements[zlAv].options[ind] = null; var user = new Option(texte, valeur); lg = document.frmDemo2.elements[zlAp].options.length; document.frmDemo2.elements[zlAp].options[lg] = user; } } else { alert("Aucun Item sélectionné !"); } return(false); }
function SelectionnerItems(form) {
zl = "zlItemIN[]"; lg = document.frmDemo2.elements[zl].options.length;
for (cpt = 0; cpt < lg; cpt++) { document.frmDemo2.elements[zl].options[cpt].selected = true; }
zl = "zlItemOUT[]"; lg = document.frmDemo2.elements[zl].options.length;
for (cpt = 0; cpt < lg; cpt++) { document.frmDemo2.elements[zl].options[cpt].selected = true; }
return( true );
}
</SCRIPT>
<?php
echo "<FORM METHOD=POST NAME='frmDemo2'>";
$sql = "SELECT demo_item.code, item, demo_rubrique.code, rubrique "; $sql .= "FROM demo_item, demo_rubrique "; $sql .= "WHERE demo_item.code_rub = demo_rubrique.code "; $sql .= "ORDER BY rubrique, item";
$resultat = mysql_db_query($Base, $sql); $listeIn = "<SELECT NAME=zlItemIN[] SIZE='10' MULTIPLE>"; $listeOut = "<SELECT NAME=zlItemOUT[] SIZE='10' MULTIPLE>"; while ($enr = mysql_fetch_array($resultat)) { // condition quelconque pour mettre dans l'une ou l'autre des listes $liste = ($enr[2] == 1 ? "listeOut" : "listeIn"); $$liste .= "<OPTION VALUE='".$enr[0]."'>".$enr[3]." - ".$enr[1]."</OPTION>\n";
}
$listeIn .= "</SELECT> "; $listeOut .= "</SELECT> ";
echo "<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0><TR>"; echo "<TD ALIGN='center'> <B>IN</B> <BR> ".$listeIn." </TD>"; echo "<TD ALIGN='center'> "; echo "<INPUT TYPE='submit' VALUE='<<' "; echo "onClick='return DeplacerItemDeVers(\"OUT\", \"IN\")'> <BR><BR> "; echo "<INPUT TYPE='submit' VALUE='>>' "; echo "onClick='return DeplacerItemDeVers(\"IN\", \"OUT\")'>"; echo " </TD>"; echo "<TD ALIGN='center'> <B>OUT</B> <BR> ".$listeOut." </TD>"; echo "<TD VALIGN='center'> <INPUT TYPE='submit' VALUE='Valider' "; echo "OnClick='return SelectionnerItems()'> </TD>"; echo "</TR></TABLE>\n";
echo "</FORM>";
// ---------------------------------------------------------------------------- // Résultats des sélections // ----------------------------------------------------------------------------
echo "Sélection :\n";
if (isset($zlItemIN)) { echo "<BR>IN:"; for ($cpt = 0; $cpt < sizeof($zlItemIN); $cpt++) { $sql = "SELECT code, item FROM demo_item WHERE code='".$zlItemIN[$cpt]."'"; $resultat = @mysql_db_query($Base, $sql); $enr = @mysql_fetch_array($resultat); echo " $enr[1] ($enr[0])"; } }
if (isset($zlItemOUT)) { echo "<BR>OUT:"; for ($cpt = 0; $cpt < sizeof($zlItemOUT); $cpt++) { $sql = "SELECT code, item FROM demo_item WHERE code='".$zlItemOUT[$cpt]."'"; $resultat = @mysql_db_query($Base, $sql); $enr = @mysql_fetch_array($resultat); echo " $enr[1] ($enr[0])"; } }
?>
|
|
On a pu voir avec ces deux exemples que PHP et MySQL côté serveur alliés à JavaScript côté client pouvaient nous donner une page vraiment dynamique. Dynamique par son contenu grâce à PHP et MySQL, et dynamique par son comportement grâce à JavaScript.
» Tout JavaScript Le 1er site vers lequel je me dirige quand je bute sur JavaScript. » L'Editeur JavaScript Un autre site très bien fait.
|
|