Ajax et formulaire, les donnees ne sont pas transmises
pix270
Messages postés12Date d'inscriptionjeudi 20 avril 2006StatutMembreDernière intervention 8 avril 2009
-
7 avril 2009 à 12:09
pix270
Messages postés12Date d'inscriptionjeudi 20 avril 2006StatutMembreDernière intervention 8 avril 2009
-
8 avril 2009 à 16:43
Bul3
Messages postés4933Date d'inscriptionsamedi 1 juillet 2006StatutMembreDernière intervention 2 février 201516 7 avril 2009 à 14:00
je n'ai pas dit cela
j'ai dis que ajax n'utilisait pas un formulaire.
rien ne t'empêche de récupérer les champs d'un
formulaire pour les transmettre avec ajax.
@+
Bul3
Messages postés4933Date d'inscriptionsamedi 1 juillet 2006StatutMembreDernière intervention 2 février 201516 7 avril 2009 à 18:00
pas normal, et je ne vois rien moi non plus,
c'est pour ça et les petites bannières et
le contenu de mon 1er message
quel navigateur utilises-tu ?
ton code, copié/collé depuis un
éditeur de texte, ou cliquer sur
"textbox normale" en dessous du bouton
@+
pix270
Messages postés12Date d'inscriptionjeudi 20 avril 2006StatutMembreDernière intervention 8 avril 2009 8 avril 2009 à 11:13
Bon ben je sait pas ce que j'ai fait mais bon voila, je vais re-saisir tout ça.
Donc mon problème est finalement double, à savoir que ma page ne fonctionne pas sous Firefox mais fonctionne sous IE7.
Ensuite, mon script permet en fait d'ajouter à mon formulaire une liste déroulante, j'en ai prévu cinq en tout qui viennent s'ajouter au fur et à mesure des choix que l'on fait dans la liste précédente. Le second problème est donc que la troisième liste est une répétition de la seconde et du coup les suivantes n'apparaissent pas non plus.
Donc voici ma page index.php qui elle n'as rien de particulier
<hr size= "2" width="100%" /> <head>
<script type="text/javascript" src="ajax.js"></script>
<script type="text/javascript" src="fonction.js"></script>
</head>
<form>
<label>Critère 1</label>
<select name="critere" id="critere" onchange="liste(critere,no_table)">
<option value="-1">Aucun</option>
<?php
$sql = mysql_query('SELECT * FROM critere_1 ORDER BY libelle') or die (mysql_error());
while ($retour = mysql_fetch_array($sql)) {
echo '<option value="'.$retour['id'].'">'.$retour['libelle'].'</option>';
}
?>
</select>
<hr size="2" width="100%" />mon script js, fichier fonction.js
<hr size ="2" width="100%" />function liste(){
var xhr = getXhr();
// On défini ce qu'on va faire quand on aura la réponse
xhr.onreadystatechange = function(){
// On ne fait quelque chose que si on a tout reçu et que le serveur est ok
if(xhr.readyState == 4){
if(xhr.status != 200){ //on verifie que le code de status soit ok
//sinon on affiche le code statut erreur
document.getElementById("loading").innerHTML = "Erreur code "+xhr.status;
}else if(xhr.status == 200){
leselect = xhr.responseText;
// On se sert de innerHTML pour rajouter les options a la liste
document.getElementById("suite").innerHTML = leselect;
}else{
document.getElementById("loading").innerHTML = "Chargement... ";
}
}
}
// Ici on va voir comment faire du post
xhr.open("POST","blank.php",true);
// ne pas oublier ça pour le post
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
// ne pas oublier de poster les arguments
xhr.send("critere="+document.getElementById("critere").value+"&no_table="+document.getElementById("no_table").value);
}
function liste1(){
var xhr = getXhr();
// On défini ce qu'on va faire quand on aura la réponse
xhr.onreadystatechange = function(){
// On ne fait quelque chose que si on a tout reçu et que le serveur est ok
if(xhr.readyState == 4){
if(xhr.status != 200){ //on verifie que le code de status soit ok
//sinon on affiche le code statut erreur
document.getElementById("loading").innerHTML = "Erreur code "+xhr.status;
}else if(xhr.status == 200){
leselect = xhr.responseText;
// On se sert de innerHTML pour rajouter les options a la liste
document.getElementById("suite1").innerHTML = leselect;
}else{
document.getElementById("loading").innerHTML = "Chargement... ";
}
}
}
// Ici on va voir comment faire du post
xhr.open("POST","blank.php",true);
// ne pas oublier ça pour le post
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
// ne pas oublier de poster les arguments
xhr.send("critere="+document.getElementById("critere").value+"&no_table="+document.getElementById("no_table").value);
file();
}
.... (à partir d'ici j'ai recopié mes fonctions en incrémentant les quelques valeurs qui en ont besoin car je ne sait pas le faire en js et puis de toute façon j'aimerais déjà que sa marche comme ça.
pix270
Messages postés12Date d'inscriptionjeudi 20 avril 2006StatutMembreDernière intervention 8 avril 2009 8 avril 2009 à 11:16
arf, j'ai fait une bêtise il en manque un petit bout.
Donc pour finir le fichier blank.php appeler par le script
<hr size="2" width="100%" /><?php
require 'connect.php';
if(isset($_POST['critere']) && isset($_POST['no_table'])) {
$critere=$_POST['critere']; //id du critere recuperer du formulaire
$no_table=$_POST['no_table']; //pour indiquer si on est au 2e, au 3e... critere
$table="critere_".($no_table+1); //la table critere ou chercher les infos
$idcri="idcri_".($no_table); //dans les tables 2,3... le champ idcri correspond à l'id de la table precedente
$form=($no_table+1);
}
?>
<label>Critère <?php echo $form?></label>
<select name="critere" id="critere" onchange="liste1(critere,no_table)">
<option value="-1">Aucun</option>
<?php
$sql = mysql_query('SELECT * FROM '.$table.' WHERE '.$idcri.'='.$critere.' ORDER BY libelle') or die (mysql_error());
while ($retour = mysql_fetch_array($sql)) {
echo '<option value="'.$retour['id'].'">'.$retour['libelle'].'</option>';
}
echo '</select> ';
?>
<?php mysql_close(); ?>
<hr size="2" width="100%" />Voila, j'espère que quelqu'un pourra m'aider.
Merci.
Bul3
Messages postés4933Date d'inscriptionsamedi 1 juillet 2006StatutMembreDernière intervention 2 février 201516 8 avril 2009 à 11:23
>>ma page ne fonctionne pas sous Firefox mais fonctionne sous IE7.
ah... plus rien à voir ça
difficile sans tester et comme on n'a pas tout....
mais pas de raisons fondamentales , si ça baigne
avec IE, ça doit baigner avec FF, même s'il
existent quelques différences ( doux euphémisme )
il doit, probablement, y avoir des erreurs de signalées
tu as fais du deboggage ?
Internet
Explorer, activer le deboggage : Outils/options Internet/Avancés
dans la liste, sous "Navigation" : décocher
o Afficher une notification de chaque erreur de script
o Désactiver le débogage de Scripts (Internet Explorer)
et mieux (pour IE < 8) : télécharger le Debogger IE
voir aussi : DebugBar et Companion JS, ----
K-Meleon, utils / Cons, ----
Opera, utils / Asole d'erreurs, ----
Safari, Debug / Show JavaScript Console
° modifier Fichier com.apple.Safari.plist situé dans le
répertoire : Support:\Documents and Settings\utilisateur
\Application Data\Apple Computer\Safari\Preferences\
y ajouter <key>IncludeDebugMenu</key>
----
pix270
Messages postés12Date d'inscriptionjeudi 20 avril 2006StatutMembreDernière intervention 8 avril 2009 8 avril 2009 à 13:44
Nikel merci bul3, ça fonctionne sous IE et FF désormais, mais le second problème reste entier.
Je vois dans Firebug que la seconde liste renvoie des données mais on dirait que comme les variables existent déjà elles ne sont pas écrasées par les nouvelles.
Pour rappel, dans mon index, j'ai une 1ere liste déroulante, en fonction du choix sélectionné une seconde apparait, et en fonction du choix de la seconde et une troisième est censé apparaitre, mais j'ai bien l'impression que ce sont toujours les premières variables qui sont envoyées, du coup c'est toujours ma seconde liste qiu revient.
Comment puis-je faire pour effacer ces variables une fois utilisés ?
Bul3
Messages postés4933Date d'inscriptionsamedi 1 juillet 2006StatutMembreDernière intervention 2 février 201516 8 avril 2009 à 13:51
>>j'ai une 1ere liste déroulante, en fonction du choix sélectionné une seconde apparait,
question récurrente
ch'tiot exemple ici
>>ce sont toujours les premières variables qui sont envoyées
problème de cache ?
ajoute un machin aléatoire à l'url
en javascript par exemple : "page/?"+new Date()
Bul3
Messages postés4933Date d'inscriptionsamedi 1 juillet 2006StatutMembreDernière intervention 2 février 201516 8 avril 2009 à 14:31
>>j'ai bien l'impression que ce sont toujours les premières
variables qui sont envoyées,
tu peux vérifier, alert coté js, echo coté php, et même avec les deboggueurs
>>la date est bien différente.
pas compris... ?
je te donnais l'exemple d'ajouter new Date ( date+heure ) pour
éviter que les navigateurs ne renvoient le cache. rien d'autres
tu peux mettre n'importe quoi pourvu que ce soit différent
des appels précédents
pix270
Messages postés12Date d'inscriptionjeudi 20 avril 2006StatutMembreDernière intervention 8 avril 2009 8 avril 2009 à 14:40
J'ai vérifier dans Firebug et c'est bien les mêmes données qui sont envoyés à chaque fois. Pour contourner ce problème, j'ai incrémenter mes variable critere et no_table dans mon blank.php et répercuter ses incrémentions dans mes script puisque j'ai fait autant de script que de liste déroulante même si c'est pas très propre comme méthode.
Bul3
Messages postés4933Date d'inscriptionsamedi 1 juillet 2006StatutMembreDernière intervention 2 février 201516 8 avril 2009 à 14:59
>>c'est bien les mêmes données qui sont envoyés à chaque fois
pas regardé ton code, mais si ce sont les mêmes données
c'est qu'elles ne sont pas modifiées.... ou alors je ne comprend rien ?
j'aimerai bien voir le html généré pour :
echo '<option value="'.$retour['id'].'">'.$retour['libelle'].'</option>';
je préfère d'ailleurs utiliser le select.options[le select.selectedIndex].value
mais "l'abréviation" doit fonctionner.
pix270
Messages postés12Date d'inscriptionjeudi 20 avril 2006StatutMembreDernière intervention 8 avril 2009 8 avril 2009 à 15:27
Ben en gros voila mon fichier qui est appelé en ajax
<hr size="2" width="100%" /><?php
require 'connect.php';
if(isset($_POST['critere']) && isset($_POST['no_table'])) {
$critere=$_POST['critere']; //id du critere recuperer du formulaire
$no_table=$_POST['no_table']; //pour indiquer si on est au 2e, au 3e... critere
$table="critere_".($no_table+1); //la table critere ou chercher les infos
$idcri="idcri_".($no_table); //dans les tables 2,3... le champ idcri correspond à l'id de la table precedente
$form=($no_table+1);//pour préciser qu'on est au critere precedent +1
}
?>
<label>Critère <?php echo $form?></label>
<select name="critere" id="critere" onchange="<?php echo 'liste'.$no_table.'()';?>">
<option value="-1">Aucun</option>
<?php
$sql = mysql_query('SELECT * FROM '.$table.' WHERE '.$idcri.'='.$critere.' ORDER BY libelle') or die (mysql_error());
while ($retour = mysql_fetch_array($sql)) {
echo '<option value="'.$retour['id'].'">'.$retour['libelle'].'</option>';
}
echo '</select>;
mysql_close();
?>
<hr size="2" width="100%" />En fait j'ai à chaque fois deux variables qui influe sur le contenu de ma liste. La variable "critere" et "no_table". Leurs valeurs est différentes à chaque ligne de chaque liste et renvoie donc à des tables différentes, seulement j'ai l'impression que js ne met pas à jour ces variables quand je rappelle mes fonctions.
Bul3
Messages postés4933Date d'inscriptionsamedi 1 juillet 2006StatutMembreDernière intervention 2 février 201516 8 avril 2009 à 15:32
mais je n'ai pas ta base de données moi....
comment je devine ? ce que contient $retour['id']
et $form ( qui est donc toujours le même pour un échange )
de toutes manières si ton alert de contrôle te donne
la même valeur à chaque... pas de mystère !