Voila, cela fait une semaine déjà que j'effectue des recherches pour trouver un moyen de rafraîchir ma page PHP en fonction d'un choix dans une liste déroulante.
Le contexte :
Je possède une fiche PHP. Dans cette fiche, je possède une liste déroulante (remplie via requète SQL) et des champs de type "text" éditables où non selon les droits.
Je veux qu'après sélection d'un choix dans ma liste déroulante, on puisse voir apparaître les données correspondantes dans les champs texte.
Les contraintes :
j'aimerai que la page soit rafraîchie, je ne voudrais pas passer d'une page à une autre pour faire circuler les données nécessaires au rafraîchissement des données.
Mes recherches :
Elles m'ont poussées à m'orienter vers le langage JAVASCRIPT. J'ai trouvé un tuto hyper complet ( ici) dont la partie 5 pourrait correspondre à mes attentes.
Mon problème :
Je n'arrive pas à faire fonctionné mon code .
Pour le moment, la requete fonctionne, ma premiere liste se remplie mais quand je clique sur un des choix proposés, rien ne s'affiche dans la seconde liste. Je me demande si, quand je fais un choix, j'entre effectivement dans le code javascript et si le parametre mi en argument est correct... Je ne suis pas forte du tout en javascript donc c'est un peu la soupe désolée.
Voila mon code ci-dessous :
<html>
<?php
include ("commun/connexion.inc.php"); // Ouvrir une connexion à la BD
?>
<head>
<title>TEST</title>
<META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script language="JavaScript" type="text/javascript">
function request05(f){
var l1 = f.elements["list1"]; //on prend la liste des briques
var l2 = f.elements["list2"]; //on prend la liste des lignes de
//produit
var index = l1.selectedIndex; //on prend la valeur sélectionnée
//dans la liste des briques
if(index < 1)
// si rien n'est sélectionné, liste2 vide
l2.options.length = 0;
else {
var xhr_object = null; // élément sélectionné en liste 1
if(window.XMLHttpRequest) // Firefox
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
return;
}
xhr_object.open("POST", "test.php", true); //init de la requete
xhr_object.onreadystatechange = function() {
if(xhr_object.readyState == 4) //si les données sont
//accessibles
eval(xhr_object.responseText);
}
xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
var data = "brique="+escape(l1.options[index].value)+"&form="+f.name+"&select=list2";
xhr_object.send(data);
}
}
</script>
<script language="JavaScript" type="text/javascript">
header('Content-type: text/html; charset=iso-8859-1');
$query = "SELECT `DOM_VENTE` FROM `ligne_produits` WHERE `BRIQUE` = '".$_POST["brique"]."'";
$query .= " ORDER BY `DOM_VENTE`";
$result = @mysql_query($query);
echo 'var s = document.forms["'.$_POST["form"].'"].elements["'.$_POST["select"].'"];';
echo 's.options.length = 0;';
while($r = mysql_fetch_array($result))
echo 's.options[s.options.length] = new Option("'.$r["DOM_VENTE"].'");';
@mysql_close($mysql_db);
</script>
</head>
<body>
<div class="Centered">
<form class="CenteredForm" name="form_selects" id="form_selects" action="test.php" method="POST" onsubmit="return false;">
<fieldset>
<legend>TEST</legend>
<div class="Left">
<?php
//On sélectionne toutes les lignes de produit
$sql="SELECT DISTINCT (BRIQUE)
FROM ligne_produits
ORDER BY DOM_VENTE ASC";
//On exécute la requete
$req= mysql_query($sql);
//on créer une liste de lignes de produit
echo '<select name="list1" id="list1" onchange="request05(this.form)">
<option value="" selected="selected">-*- BRIQUES -*-</option>';
while($row = mysql_fetch_array($req))
{
echo '<option value="'.$row['BRIQUE'].'">'.$row['BRIQUE'].'</option>';
}
echo '</select><br/><br/>';
?>
Lignes de produit :
<select name="list2" id="list2" class="ButtonL">
</select>
</div>
</fieldset>
</form>
</div>
</body>
</HTML>
Je me pose plusieurs questions :
1° est ce que le code javascript que j'ai nommé "function request05(f){...}" ne devrait pas plutôt se trouver dans une page *.js à part ?
2° est ce que ma balise form est correcte ???
3° est ce que ma balise <select name="list1" id="list1" onchange="request05(this.form)"> doit bien s'écrire de cette façon (plus particulièrement est-ce que mon onchange est correct ?)
Je vous remercie d'avance pour votre aide sur le sujet.
Tu as mis du code php dans les balises javascript... Commence par corriger çà... Le comportement de la page changera peut être déjà...
__________________________
Sujet résolu ? Pensez à mettre le tag
Un problème en C# ? Vérifiez celui-ci n'est pas déjà résolu dans la FAQ et que le sujet n'est pas traité parmis les tutoriaux ou les articles avant de poster dans le forum C#.
Oui je vois ce que tu veux dire... J'ai effectué quelques modifs...
Le truc c'est que maintenant, quand je fais un choix dans la "list1", ie me renvoit un "syntax error" au niveau de la fonction "eval()".
Voilà le code remis à jour... J'espère que c'est bon comme ça ?
<html>
<head>
<script>
function requestmenu(f)
{
// script de menu déroulant
var l1 = f.elements["list1"];
var l2 = f.elements["list2"];
var index = l1.selectedIndex;
if(index < 1)
l2.options.length = 0;
else {
var xhr_object = null;
if(window.XMLHttpRequest) // Firefox
xhr_object = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
return;
}
xhr_object.open("POST", "test1.php", true);
xhr_object.onreadystatechange = function anonymous() {
if(xhr_object.readyState == 4)
eval(xhr_object.responseText);
}
xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
var data = "brique="+escape(l1.options[index].value)+"&form="+f.name+"&select=list2";
xhr_object.send(data);
}
}
</script>
</head>
<?php
include ("commun/connexion.inc.php"); // Ouvrir une connexion à la BD
echo" <script language=\"javascript\"> \n";
$query = "SELECT `DOM_VENTE` FROM `ligne_produits` WHERE `BRIQUE` = '".$_POST["brique"]."'";
$query .= " ORDER BY `DOM_VENTE`";
$result = mysql_query($query) or die('Erreur SQL !<br>'.$query.'<br>'.mysql_error());
echo 'var o = null;';
echo 'var s = document.forms["'.$_POST["form"].'"].elements["'.$_POST["select"].'"];';
echo 's.options.length = 0;';
while($r = mysql_fetch_array($result))
echo 's.options[s.options.length] = new Option("'.$r["DOM_VENTE"].'");';
echo "</script>\n";
?>
<body>
<form class="CenteredForm" name="form_selects" id="form_selects" action="" method="" onsubmit="return false;">
<fieldset>
<legend>Faites un choix dans la liste de gauche<br />et observez le résultat dans celle de droite</legend>
<div class="Left">
<?php
//On sélectionne toutes les lignes de produit
$sql="SELECT DISTINCT (BRIQUE)
FROM ligne_produits
ORDER BY DOM_VENTE ASC";
//On exécute la requete
$req= mysql_query($sql);
//on créer une liste de lignes de produit
echo '<select name="list1" id="list1" onchange="requestmenu(this.form)">
<option value="" selected="selected">-*- BRIQUES -*-</option>';
while($row = mysql_fetch_array($req))
{
echo '<option value="'.$row['BRIQUE'].'">'.$row['BRIQUE'].'</option>';
}
echo '</select><br/><br/>';
?>
<select name="list2" id="list2" class="ButtonL">
<option value="" selected="selected">-*- LIGNES DE PRODUIT -*-</option>
</select>
</div></fieldset></form>
</body>
</html>
voilà je voulais savoir si vous aviez quelques éclairages sur cette fonction eval... en tout cas merci pour votre aide
Essaie d'afficher ton objet xhr_object.responseText ... et regarde ce que fait la fonction eval sur le site de selfhtml.org si tu as besoin de plus de détails...
J'aimerais bien savoir aussi ce que contient l'objet xhr_object.responseText ... Il doit y avoir des caractères non supportés par eval...
__________________________
Sujet résolu ? Pensez à mettre le tag
Un problème en C# ? Vérifiez celui-ci n'est pas déjà résolu dans la FAQ et que le sujet n'est pas traité parmis les tutoriaux ou les articles avant de poster dans le forum C#.
eval()
Interprète un argument à transmettre et renvoie le résultat.
Si l'argument transmis peut être interprété comme une opération de calcul,
l'opération est effectuée et son résultat est retourné.
Cette méthode permet aussi des opérations de calcul complexes avec expressions entre parenthèses.
Cette fonctionnalité est très pratique pour, avec une seule commande, faire calculer des opérations
notées en tant que chaînes de caractères.
Si l'argument transmis peut être interprété en tant qu'objet ou propriété d'objet, l'objet ou la propriété
d'objet est retournée.
Ce qui est important quand une chaîne de caractères (par exemple le contenu d'un champ de formulaire
ou le paramètre transmis à une fonction) doit être interprété en tant qu'objet.
Provoque un message d'erreur si l'expression transmise ne peut être interprétée.
on ne peut donc pas faire eval ici sur une réponse de php.
c'est l'histoire des select liés.
de mémoire d'Alzheimer, il y a un exemple en php ici :
http://www.codyx.org/snippet_listes-deroulantes-liees_89.aspx
sinon : http://marcel-bultez.chez-alice.fr/documents/PHP/PHP.php
rechercher "Select qui dépend d'un autre ", c'est un exemple.
"
Je pose la réponse ici au cas où quelqu'un serait dans les même ennuis que moi :). Pour ma part c'est résolu merci tout de même de votre aide =).