XMLHttpRequest pas de retour php

Résolu
vol68 Messages postés 33 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 8 mai 2016 - 16 févr. 2011 à 17:24
vol68 Messages postés 33 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 8 mai 2016 - 19 févr. 2011 à 14:17
Hello et merci d'avance
j'ai trouvé pratiquement ce que je cherchai avec le script ci dessous en le modifiant un peu, mais.....
1er probleme en ce qui concerne la reconnaissance du navigateur impossible de faire un ELSE entre Firefox et IE , dans l'alerte il apparait toujours Firefox, seul possibilité faire deux IF et la IE est reconnu.

2eme probleme le script php ne complete pas le SELECT apres la lecture de la base de donnée bien que tout semble etre normale dans les alertes "reponse" et "data"

Si quelqu'un avait une solution

</head>
<SCRIPT TYPE="text/javascript">

function requetebase(f){
//alert("acces javascript");
var scriptphp = "traitementbase.php";
var L1 = f.elements["list1"];
var L2 = f.elements["list2"];
var index = L1.selectedIndex;

if(index < 1){
 		//alert("L2 < 1");
L2.options.length = 0;
} 
else {
  		//alert("L2 > 1");
var xhr_object = null;
if(window.XMLHttpRequest){ // Firefox
   			//alert("Firefox");	
xhr_object = new XMLHttpRequest();
} 
//else 
//if (window.ActiveXObject){// Internet Explorer
//alert("IE");
//xhr_object = new ActiveXObject("Microsoft.XMLHTTP");
//} 
//else 
//if (window.ActiveXObject){// Internet Explorer
//alert("IE");
//xhr_object = new ActiveXObject("Msxml2.XMLHTTP");		
if (window.ActiveXObject) {// Internet Explorer 
//alert("IE");
try { 
xhr_object = new ActiveXObject("Msxml2.XMLHTTP"); 
} 
catch (e) { 
try {	
xhr_object = new ActiveXObject("Microsoft.XMLHTTP"); 
} catch (e) {}
}
} 
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
return;
}
//alert("reponse");
xhr_object.onreadystatechange = function attente() {
if(xhr_object.readyState == 4){
alert("reponse "+xhr_object.responseText);
//document.write(xhr_object.responseText);
eval(xhr_object.responseText);
//document.getElementById(list1).innerHTML = XHR.responseText;

}
//return xhr_object.readyState;

}
//alert("requete");
xhr_object.open("POST", scriptphp, true);

xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
var data = "numero_section="+escape(L1.options[index].value)+"&form="+f.name+"&select=list2";
//alert("envoie : "+data);
xhr_object.send(data);
}
}


</script>

<?php
include("connexionbase.php");	
$link = mysql_pconnect($serveur, $utilisateur, $motdepasse);
//$mysql_db = @mysql_pconnect("localhost", "root", "ms1570le");
$basededonnees = "the_wall";
mysql_select_db($basededonnees,$link);
$nomtablesection = "the_wall_tags";
$criteresection = "numero_section";
?>


<form class="CenteredForm" name="form_selects" id="form_selects" action="" method="" onsubmit="return false;">
<fieldset>
<legend>Faites un choix dans la liste de gauche
et observez le résultat dans celle de droite</legend>


Numero Section :
<?php			
echo "<select name='list1' id='list1' class='ButtonL' onchange='requetebase(this.form)'>";
$requetenumesection  = "SELECT distinct numero_section FROM $nomtablesection ORDER by numero_section";
$resultatnumsection = mysql_query($requetenumesection,$link);
if (!$resultatnumsection) return FALSE;
echo "<option selected value=''></option>";
while ($affichageselectnumerosection = mysql_fetch_array($resultatnumsection)) {
$num_sec = $affichageselectnumerosection['numero_section'];
echo "<option value=$num_sec>$num_sec</option>";
}
echo "</select>";

echo "   tag : ";
echo "<select name='list2' id='list2' class='ButtonL'>";
 			//echo "<option value='0' selected>choix</option>";
echo "</select>";
?>


</fieldset>
</form>



</html>


<?php
header("Content-type: text/html; charset=iso-8859-1");
include("connexionbase.php");
$link = mysql_pconnect($serveur, $utilisateur, $motdepasse);
$basededonnees = "the_wall";
mysql_select_db($basededonnees,$link);
$nomtablesection = "the_wall_tags";
$criteresection = "numero_section";
$requete  "SELECT DISTINCT tag FROM $nomtablesection WHERE ".$criteresection." ".$_POST[$criteresection]." ORDER BY tag;";
echo $requete;
echo "var o = null;";
echo "var s = document.forms['".$_POST['form']."'].elements['".$_POST['select']."'];";
echo "s.options.length = 0;";
$resultatrequete = mysql_query($requete,$link);
//echo "s.options[s.options.length] = new Option('choix','');";
while($afficheresultat = mysql_fetch_array($resultatrequete)){
echo "s.options[s.options.length] = new Option('".$afficheresultat['tag']."');";
}
mysql_close($link);
?>

5 réponses

dvwyns Messages postés 159 Date d'inscription mardi 2 janvier 2007 Statut Membre Dernière intervention 7 mai 2012
18 févr. 2011 à 12:13
Salut,
Je te conseille d'utiliser Jquery pour parler au serveur via javascript
Voici un lien pour le downloader.
Cette librairie a l'avantage d'être crossbrowser mais aussi est plus simple pour faire des anims, faire de l'ajax, ect...

Voici un code pour te faire une idée de la puissance de jquery
$("#list1").change(function() {
           $.ajax({ // fonction permettant de faire de l'ajax
   type: "POST", // methode de transmission des données au fichier php
   url: "file.php", // url du fichier php
   data: "param="+$("option:selected",this).text(), // données à transmettre
                   success: function(msg){
                          $(#divcontientselect).html(msg);
                   }
});
}

Comme tu vois ça réduit considérablement la taille du code
Voilà qui arrange ton premier problème.

Pour ton 2ème problème, tu dois remplir ton select dans ta page php appelé que tu termines par un "echo" comportant ton select. Tu retrouveras la valeur dans la variable msg se trouvant en paramètre de la fonction (success: function(msg)), apres tu appelles le div qui contient le select (si il n'existe pas créé le) qui sera rempli par ton select.
Il faut bien sur adapter tout ça a ta sauce, c'est un pseudo exemple, je me rend compte que tu fais des truc avec 2 select mais bon, je pense qu'il est temps pour toi de rentrer dans le monde de Jquery

Dvwyns
3
007Julien Messages postés 276 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 8 janvier 2014 4
18 févr. 2011 à 16:36
Il n'est pas obligatoire de charger Jquery (bien que ce soit effectivement une solution) pour faire des requêtes en Ajax. Par contre, il peut être utile d'utiliser un code éprouvé. En voici un (voir la source pour toutes explications complémentaires):

// D'après http://www.quirksmode.org/js/xmlhttp.html
var xmlFct=[function(){return new XMLHttpRequest()},
function(){return new ActiveXObject("Msxml2.XMLHTTP")},
function(){return new ActiveXObject("Msxml3.XMLHTTP")}];
function xmlObj(){
var xmlhttp=false;
for (var i=0;i<xmlFct.length;i++) {
try{xmlhttp = xmlFct[i]();}
catch(e){continue;}
break;}
return xmlhttp;
};
function sndRqu(url,cllbck,pstDta){
var req=xmlObj();
if (!req) return;
var mth=(pstDta)? "POST":"GET";
req.open(mth,url,true);
req.setRequestHeader('User-Agent','XMLHTTP/1.0');
if (pstDta) req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
req.onreadystatechange=function(){
if (req.readyState!=4) return;
if (req.status!=200 && req.status!=304) {// 200 Ok, 304 Redirection Not modified
//			alert('HTTP error ' + req.status);
return;}
cllbck(req);}
if (req.readyState==4) return;
req.send(pstDta);
};
3
vol68 Messages postés 33 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 8 mai 2016
19 févr. 2011 à 07:52
Hello, et déja merci pour l'interet que vous portez à ma demande.

Pour ce quiest de JQuery si je pouvais m'en passer j'aimerais autant mais en dernier recour effectivement c'est une solution.
Pour la reponse de 007julien, apparement ma solution fonctionne mais le probleme c'est que le retour PHP qui devrait remplir mon select ne marche pas voici la reponse que jobtiens dans "document.write(xhr_object.responseText);"
<< SELECT DISTINCT tagtexte FROM the_wall_tagstextes WHERE numero_section 2 ORDER BY tagtexte var o null ; var s = document.forms["form_selects"].elements["list2"] ; s.options.length = 0 ; s.options[s.options.length] = new Option("testvol68") ; s.options[s.options.length] = new Option("toto") ;>>
donc javascript fait son boulot et php fait presque le sien la base de donnée est lue et les infos converties en javascript mais pourquoi le SELECT "List2" n'est il pas rempli, manque t'il quelque chose? la reponse transcrite en javascript fonctionne
<SCRIPT TYPE="text/javascript">
function test(){
var o = null;
var s = document.forms["form_selects"].elements["list2"];
s.options.length = 0;
s.options[s.options.length] = new Option("testvol68");
s.options[s.options.length] = new Option("toto");
s.options[s.options.length] = new Option(s);
}
</script>

j'ai beau rechercher sur le net je ne trouve pas pourtant cela fonctionne j'ai eu l'occasion de tester des fonction similaires sur /www.toutjavascript.com/savoir/xmlhttprequest.php3 section 5 il y a surement un truc que je ne voi pas,
3
007Julien Messages postés 276 Date d'inscription mercredi 22 septembre 2010 Statut Membre Dernière intervention 8 janvier 2014 4
19 févr. 2011 à 13:07
Pour générer proprement des selects au vol voir la [La http://www.javascriptkit.com/javatutors/selectcontent.shtml page suivante] (http://www.javascriptkit.com/javatutors/selectcontent.shtml) qui utilise le tableau options et new Options("text","value") (les deux derniers arguments sont facultatifs mais pourraient également être utilisés).

La meilleure solution consisterait alors, me semble-t-il, à ne générer en PHP que des chaînes
$chnSlc="value1|text1|value2|text2|value3|text3";

pour les incruster et les transformer en tableaux en javascript soit dès l'ouverture, soit après une requête Ajax.
var tabSlc="<?php echo $chnSlc ?>".split(/\|/g);
function InitOrRemoveSelect(){
  document.myform.master.options.length=0;
for (i=0;i<tabSlc.length;i++)
if (i%2==0) {// Utiliser i et i+1 pour les seuls i pairs
      document.myform.master.options[i>>1]=new Option(tabSlc[i],tabSlc[i+1]);
}
}
3

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

Posez votre question
vol68 Messages postés 33 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 8 mai 2016
19 févr. 2011 à 14:17
hello
en fait j'ai trouvé l'erreur dans le réponse PHP ci dessous generée apres le requete AJAX XMLHttpRequest,
<< SELECT DISTINCT tagtexte FROM the_wall_tagstextes WHERE numero_section <gras>2 ORDER BY tagtexte var o</gras> null ; var s = document.forms["form_selects"].elements["list2"] ; s.options.length = 0 ; s.options[s.options.length] = new Option("testvol68") ; s.options[s.options.length] = new Option("toto") ;>>
j'avais laissé trainer un ECHO, en effet la ligne SELECT DISTINCT.......ORDER BY tagtexte non comprise par javascript empechait la fonction EVAL de fonctionner, évident, quel quiche, maintenant je me retrouve bien avec une implementation du SELECT id ="list2" par les donner de la base en fonction du contenu choisi dans le SELECT id="list1" genéré par le PHP.

pour ce qui est du premier probleme en fait a partir de IE7 plus besoin de ActiveXObject("Msxml2.XMLHTTP"), XMLHttpRequest() est tres bien reconnu.

je vous remercie tout de meme d'avoir pris le temps de tenter de resoudre mon probleme
0
Rejoignez-nous