XMLHttpRequest
Résolu/Fermé
chantaussel
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
-
17 mars 2008 à 13:54
med327 - 2 août 2008 à 09:31
med327 - 2 août 2008 à 09:31
14 réponses
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
18 mars 2008 à 14:11
18 mars 2008 à 14:11
Re,
Concernant tes questions :
- à quoi ça sert de dire var req = null; est-ce qu'on peut pas mettre juste var req; ?
-> Puisque tu as garder tes deux fonctions séparées et que dans chacune d'entre elles tu utilise la même variable (initialisée dans la première fonction, et utilisée dans la seconde), il faut que tu déclare ta variable en dehors de des deux fonctions (globalement donc) de manière à ce que cette variable soit visible depuis ces fonctions.
Il faut savoir que lorsque tu déclare une variable, cette variable n'est visible que dans le bloc d'instruction où tu l'as déclare (et les blocs "fils"). Par exemple, si tu déclare une variable à l'intérieur d'un IF, elle ne sera pas visible à l'extérieur de ce IF (ainsi que dans toutes les instructions comprises dans ce IF : cf. succession de if inbriqués par exemple). Dans ton cas, lorsque tu déclare ta variable dans la première fonction, cette variable est visible dans ta première fonction, du coup lorsque tu y fais appel dans ta seconde fonction, comme elle n'est plus visible, une erreur est lançée, ce qui fait échoué le script.
- à quoi sert le "return" après l'alerte "votre navigateur n'accepte pas..."?
L'instruction return ici permet de "quitter" la fonction au lieu de continuer à faire les instructions. L'utilisation des objets XMLHttpRequest n'était au début disponible que sur certain navigateur (aujourd'hui je ne sais pas ce qu'il en est mais je pense que la majeur partie intègre la gestion de ces objets). Si le navigateur ne prends pas en compte leur utilisation, il est indispensable d'avertir l'utilisateur et de ne pas faire la suite des scripts (auquel cas de toute manière ça ne fonctionnera pas). C'est pour cela que je fais un return si le test n'est pas validé.
Une autre façon de géré ce cas d'erreur serait de faire un IF ( ... ) { } ELSE { les autres instructions du script } sans mettre de return dans le bloc validé du IF.
- quelle est la différence entre POST et GET? est ce que c'est juste la façon dont sont envoyées les variables? (dans l'url ou pas)?
GET permet de passer des variables via l'url de manière visible. Donc les variables et leur valeurs sont visible dans la barre d'adresse, ce qui n'est pas top du tout.
POST fais la même chose mais en cachant ces variables et leur valeur. A préconiser donc.
Il faudrait donc que tu remplace GET par POST ici :
Et que tu reprenne tes valeurs dans le script PHP via $_POST et non plus $_GET
- à quoi sert le
eval(xhr_object.responseText);
-> eval permet d'évaluer une chaine de caractère comme étant du code. Conclusion, si dans ton script PHP au lieu d'afficher : echo "blabla"; tu affiche : echo "alert('blabla');";
Lors du retour du script, la partie en gars va être interprétée par l'instruction eval, et donc ton code sera exécuté.
Je te conseille donc d'utiliser de cette manière le retour de ton script PHP, ainsi tu peux modifier dynamiquement tout élément de ta page sans rafraichir cette dernière.
et le
xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
-> Juste une formalité.
Concernant tes questions :
- à quoi ça sert de dire var req = null; est-ce qu'on peut pas mettre juste var req; ?
-> Puisque tu as garder tes deux fonctions séparées et que dans chacune d'entre elles tu utilise la même variable (initialisée dans la première fonction, et utilisée dans la seconde), il faut que tu déclare ta variable en dehors de des deux fonctions (globalement donc) de manière à ce que cette variable soit visible depuis ces fonctions.
Il faut savoir que lorsque tu déclare une variable, cette variable n'est visible que dans le bloc d'instruction où tu l'as déclare (et les blocs "fils"). Par exemple, si tu déclare une variable à l'intérieur d'un IF, elle ne sera pas visible à l'extérieur de ce IF (ainsi que dans toutes les instructions comprises dans ce IF : cf. succession de if inbriqués par exemple). Dans ton cas, lorsque tu déclare ta variable dans la première fonction, cette variable est visible dans ta première fonction, du coup lorsque tu y fais appel dans ta seconde fonction, comme elle n'est plus visible, une erreur est lançée, ce qui fait échoué le script.
- à quoi sert le "return" après l'alerte "votre navigateur n'accepte pas..."?
L'instruction return ici permet de "quitter" la fonction au lieu de continuer à faire les instructions. L'utilisation des objets XMLHttpRequest n'était au début disponible que sur certain navigateur (aujourd'hui je ne sais pas ce qu'il en est mais je pense que la majeur partie intègre la gestion de ces objets). Si le navigateur ne prends pas en compte leur utilisation, il est indispensable d'avertir l'utilisateur et de ne pas faire la suite des scripts (auquel cas de toute manière ça ne fonctionnera pas). C'est pour cela que je fais un return si le test n'est pas validé.
Une autre façon de géré ce cas d'erreur serait de faire un IF ( ... ) { } ELSE { les autres instructions du script } sans mettre de return dans le bloc validé du IF.
- quelle est la différence entre POST et GET? est ce que c'est juste la façon dont sont envoyées les variables? (dans l'url ou pas)?
GET permet de passer des variables via l'url de manière visible. Donc les variables et leur valeurs sont visible dans la barre d'adresse, ce qui n'est pas top du tout.
POST fais la même chose mais en cachant ces variables et leur valeur. A préconiser donc.
Il faudrait donc que tu remplace GET par POST ici :
req.open("GET", "sql.php", true);
Et que tu reprenne tes valeurs dans le script PHP via $_POST et non plus $_GET
- à quoi sert le
eval(xhr_object.responseText);
-> eval permet d'évaluer une chaine de caractère comme étant du code. Conclusion, si dans ton script PHP au lieu d'afficher : echo "blabla"; tu affiche : echo "alert('blabla');";
Lors du retour du script, la partie en gars va être interprétée par l'instruction eval, et donc ton code sera exécuté.
Je te conseille donc d'utiliser de cette manière le retour de ton script PHP, ainsi tu peux modifier dynamiquement tout élément de ta page sans rafraichir cette dernière.
et le
xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
-> Juste une formalité.
mike_d
Messages postés
8
Date d'inscription
mardi 19 février 2008
Statut
Membre
Dernière intervention
28 mars 2008
4
17 mars 2008 à 15:40
17 mars 2008 à 15:40
Salut! essaye en mettant false dans le open, si tu mets à true le traitement est asynchrone et la réponse n'a pas le temps d'être envoyée. Dans ton cas il faut que tu attendes la réponse de ta requête.
chantaussel
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
30
17 mars 2008 à 15:54
17 mars 2008 à 15:54
Merci,
Je viens d'essayer de mettre "true", et ça ne marche plus du tout, ça ne m'affiche même plus le readyState.
En fait, dans quand je clique sur le lien, la console d'erreur de firefox me dit que req de la ligne 13 n'est pas reconnu.
Je ne comprends pas car req est défini juste au dessus dans la fonction ajax comme étant un nouvel objet XMLHttpRequest...
Il doit certainement y avoir un problème ici, mais c'est surement pas le seul!
Je viens d'essayer de mettre "true", et ça ne marche plus du tout, ça ne m'affiche même plus le readyState.
En fait, dans quand je clique sur le lien, la console d'erreur de firefox me dit que req de la ligne 13 n'est pas reconnu.
if (req.readyState == 0)
Je ne comprends pas car req est défini juste au dessus dans la fonction ajax comme étant un nouvel objet XMLHttpRequest...
Il doit certainement y avoir un problème ici, mais c'est surement pas le seul!
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
>
chantaussel
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
17 mars 2008 à 16:21
17 mars 2008 à 16:21
L'erreur est assez logique puisque tu ne défini req que dans ta fonction ajax.
Défini le soit en global ou alors fais un mixte de tes deux fonctions en une seule.
Défini le soit en global ou alors fais un mixte de tes deux fonctions en une seule.
Reivax962
Messages postés
3672
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
11 février 2021
1 011
17 mars 2008 à 16:38
17 mars 2008 à 16:38
Bonjour,
Remplace tes fonctions par ceci (même chose, mais en définissant la 2e à l'intérieur de la première, ce qui confère une portée plus grande à req).
Remplace tes fonctions par ceci (même chose, mais en définissant la 2e à l'intérieur de la première, ce qui confère une portée plus grande à req).
<script language="JavaScript"> function ajax() { req = new XMLHttpRequest(); req.onreadystatechange = testRep; req.open("GET", "sql.php", false); req.send(null); function testRep() { if (req.readyState == 0) { document.write("0"); } if (req.readyState == 1) { document.write("1"); } if (req.readyState == 2) { document.write("2"); } if (req.readyState == 3) { document.write("3"); } if (req.readyState == 4) { if (req.status ==200) { document.write (req.responseText); } else { alert("Problem: " + req.statusText); } } } } </script>
chantaussel
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
30
17 mars 2008 à 21:24
17 mars 2008 à 21:24
J'ai essayé la technique de Reivax62 mais ça ne marche pas, ça me donne le même message d'erreur.
Et j'ai aussi essayé de definir req avant les deux fonctions, mais ça ne marche pas non plus:
kij_82 à parlé de définir req en global, comment fait-on ça?
Merci
Et j'ai aussi essayé de definir req avant les deux fonctions, mais ça ne marche pas non plus:
<script language="JavaScript"> req = new XMLHttpRequest(); function ajax() { req.onreadystatechange = testRep; req.open("GET", "sql2.php", true); req.send(null); --etc--
kij_82 à parlé de définir req en global, comment fait-on ça?
Merci
chantaussel
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
30
>
chantaussel
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
17 mars 2008 à 21:46
17 mars 2008 à 21:46
Yey! Je crois que j'y suis presque, c'est bien ce que disait kij_82, j'ai rajouté la ligne : var = req;
et c'est presque nickel!
Le seul truc bizarre c'est qu'on dirait que ma page se finit jamais de se charger.
Merci de votre aide!
et c'est presque nickel!
<html> <head> <title>My first XMLHttpRequest</title> <script language="JavaScript"> function ajax() { var req; req = new XMLHttpRequest(); req.onreadystatechange = testRep; req.open("GET", "sql2.php", true); req.send(null); function testRep() { if (req.readyState == 0) { document.write("0"); } if (req.readyState == 1) { document.write("1"); } if (req.readyState == 2) { document.write("2"); } if (req.readyState == 3) { document.write("3"); } if (req.readyState == 4) { if (req.status ==200) { document.write (req.responseText); } else { alert("Problem: " + req.statusText); } } } } </script> </head> <body> <a href="javascript:ajax();">Click me</a> </body> </html>
Le seul truc bizarre c'est qu'on dirait que ma page se finit jamais de se charger.
Merci de votre aide!
chantaussel
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
30
>
chantaussel
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
17 mars 2008 à 23:23
17 mars 2008 à 23:23
Bon je continue mon petit monologue... j'espère que ça pourra servir, et que je ne dis pas trop de bêtises dans mes commentaires...
Alors voilà, j'ai révisé un peu mon javascript et ça marche!!
Voilà ce que ça donne au final: (il reste à rajouter quelques lignes pour la compatibilité avec IE, mais ça c'est pas bien compliqué)
ajax.html, qui contient le lien à cliquer, qui lance la requête, et qui affiche less données lorsqu'elles reviennent:
...et sql.php, qui récupère les données demandées dans la bdd et les "fait passer" à la propriété responseText de l'objet XMLHttpRequest:
Ah, c'est le pied quand ça marche!
Alors voilà, j'ai révisé un peu mon javascript et ça marche!!
Voilà ce que ça donne au final: (il reste à rajouter quelques lignes pour la compatibilité avec IE, mais ça c'est pas bien compliqué)
ajax.html, qui contient le lien à cliquer, qui lance la requête, et qui affiche less données lorsqu'elles reviennent:
<html> <head> <title>My first XMLHttpRequest</title> <script language="JavaScript"> var req; //défini l'objet req de façon globale, pour qu'il soit reconnu dans tout le script ; il va contenir les données renvoyées par le serveur function ajax() { req = new XMLHttpRequest(); req.onreadystatechange = testRep; req.open("GET", "sql.php", true); req.send(null); } function testRep() { // cette fonction va lancer l'affichage des données reçues, une fois que la requête sera "complete" (readyState=4) if (req.readyState == 4) { if (req.status == 200) { document.open(); //ceci ouvre un nouveau flux qui va permettre l'exécution des commandes qui suivent (ici document.write) s'exécute simultanément document.write (req.responseText); // responseText contient la chaîne de caractères du tableau $donnees (dans le script php) document.close(); // ceci ferme le flux et lance l'exécutions des commandes qui precèdent } else { alert("Problem: " + req.statusText); } } } </script> </head> <body> <a href="javascript:ajax();">Click me</a> </body> </html>
...et sql.php, qui récupère les données demandées dans la bdd et les "fait passer" à la propriété responseText de l'objet XMLHttpRequest:
<?php mysql_connect("localhost", "root", ""); mysql_select_db("test"); $reponse = mysql_query("SELECT * FROM membres WHERE id='2'"); $donnees = mysql_fetch_array($reponse); echo $donnees['nom']; //ceci n'écrit rien de visible dans le navigateur, ça envoie les données demandées à responseText (il me semble, car si on supprime cette ligne document.write(req.responseText) n'affiche plus rien) mysql_close(); ?>
Ah, c'est le pied quand ça marche!
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
18 mars 2008 à 09:22
18 mars 2008 à 09:22
C'est bien d'avoir vu par toi même comment faire.
Cela dit, et ça reste une appréciation personnelle ;), je trouve que ton code n'est pas très "propre". Définir la variable en global n'est pas terrible du fait que ça ne sert à rien (mise à part faire fonctionner ton script).
Cela montre bien que ton code n'est pas "sympathiquement" écrit (le terme est un peu pourri je sais)
J'ai dit variable globale pour te sauver, mais je te conseille plutôt de faire un mixte des deux fonctions en une. Reivax t'as montré la voix (bien qu'il ai fait une faute de recopie qui ne permet pas au code de fonctionner)
Enfin bref, voilà le code de la fonction ajax que Reivax proposait :
Si tu veux par la suite automatiser ce procédé je te conseille de faire une fonction "type" qui appelle un script PHP en lui fournissant des paramètres. En voilà une que j'utilise régulièrement dans mes sites :
Exemple d'utilisation :
Ensuite l'intérêt principal de l'appel de tel script PHP depuis le javascript, c'est d'écrire dynamiquement sur ta page en fonction du code du script PHP appellé.
Par exemple si tu ajoute la DIV suivante dans le body de ta page HTML 'ajax.html' :
Et puis dans ton script PHP modifier quelque peu comme ceci :
Cela dit, et ça reste une appréciation personnelle ;), je trouve que ton code n'est pas très "propre". Définir la variable en global n'est pas terrible du fait que ça ne sert à rien (mise à part faire fonctionner ton script).
Cela montre bien que ton code n'est pas "sympathiquement" écrit (le terme est un peu pourri je sais)
J'ai dit variable globale pour te sauver, mais je te conseille plutôt de faire un mixte des deux fonctions en une. Reivax t'as montré la voix (bien qu'il ai fait une faute de recopie qui ne permet pas au code de fonctionner)
Enfin bref, voilà le code de la fonction ajax que Reivax proposait :
function ajax() { req = new XMLHttpRequest(); req.onreadystatechange = function ( ){ if (req.readyState == 4) { if (req.status == 200) { document.open(); //ceci ouvre un nouveau flux qui va permettre l'exécution des commandes qui suivent (ici document.write) s'exécute simultanément document.write (req.responseText); // responseText contient la chaîne de caractères du tableau $donnees (dans le script php) document.close(); // ceci ferme le flux et lance l'exécutions des commandes qui precèdent } else { alert("Problem: " + req.statusText); } } } req.open("GET", "sql.php", true); req.send(null); }
Si tu veux par la suite automatiser ce procédé je te conseille de faire une fonction "type" qui appelle un script PHP en lui fournissant des paramètres. En voilà une que j'utilise régulièrement dans mes sites :
function callScript ( scriptName, args ){ 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", scriptName, true); xhr_object.onreadystatechange = function() { if(xhr_object.readyState == 4) { //alert(xhr_object.responseText); // DEBUG MODE //document.write(xhr_object.responseText); eval(xhr_object.responseText); } //alert(xhr_object.readyState); return xhr_object.readyState; } xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr_object.send(args); }
Exemple d'utilisation :
callScript("toto.php","id=2&mdp=blabla");
Ensuite l'intérêt principal de l'appel de tel script PHP depuis le javascript, c'est d'écrire dynamiquement sur ta page en fonction du code du script PHP appellé.
Par exemple si tu ajoute la DIV suivante dans le body de ta page HTML 'ajax.html' :
<body> <a href="javascript:ajax();">Click me to see the text</a> <div id="maDiv"></div> </body>
Et puis dans ton script PHP modifier quelque peu comme ceci :
<?php mysql_connect("localhost", "root", ""); mysql_select_db("test"); $reponse = mysql_query("SELECT * FROM membres WHERE id='2'"); $donnees = mysql_fetch_array($reponse); echo "var div = document.getElementById('maDiv');"; echo "div.innerHTML = ".$donnees['nom'].";"; // écrit le nom dans la div et l'affiche donc dynamiquement sans rafraichir la page mysql_close(); ?>
chantaussel
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
30
18 mars 2008 à 11:13
18 mars 2008 à 11:13
Merci beaucoup pour ces infos. :-)
C'est vrai que j'apprends un peu les choses "sur le tas", et quand j'en ai besoin, du coup je sais pas vraiment ce qui fait qu'un code est bien écrit ou pas...
Bon en fait mon bout de code d'hier c'était que le début... Maintenant je voudrais faire passer une variable de mon script js au script php. J'ai vu que c'est ce que tu fait avec la ligne
Bon alors j'y suis depuis ce matin et j'y arrive pas...
J'ai maintenant deux liens possibles : 1 et 2
En cliquant sur 1, php va récupérer dans ma bdd le membre dont id=1, et idem pour 2.
Voilà mon code. J'ai un message d'erreur qui me dit que var_i est un "Undefined index".
ajax.html:
et sql.php
J'ai aussi des questions sur le code que tu as posté:
- à quoi ça sert de dire var req = null; est-ce qu'on peut pas mettre juste var req; ?
- à quoi sert le "return" après l'alerte "votre navigateur n'accepte pas..."?
- quelle est la différence entre POST et GET? est ce que c'est juste la façon dont sont envoyées les variables? (dans l'url ou pas)?
- à quoi sert le
et le
oui, ça fait un peu beaucoup de questions...
C'est vrai que j'apprends un peu les choses "sur le tas", et quand j'en ai besoin, du coup je sais pas vraiment ce qui fait qu'un code est bien écrit ou pas...
Bon en fait mon bout de code d'hier c'était que le début... Maintenant je voudrais faire passer une variable de mon script js au script php. J'ai vu que c'est ce que tu fait avec la ligne
xhr_object.send(args);
Bon alors j'y suis depuis ce matin et j'y arrive pas...
J'ai maintenant deux liens possibles : 1 et 2
En cliquant sur 1, php va récupérer dans ma bdd le membre dont id=1, et idem pour 2.
Voilà mon code. J'ai un message d'erreur qui me dit que var_i est un "Undefined index".
ajax.html:
<html> <head> <title>My first XMLHttpRequest</title> <script language="JavaScript"> var req = null; function ajax(i) { if (window.XMLHttpRequest) req = new XMLHttpRequest(); else if (window.ActiveXObject) req = new ActiveXObject("Microsoft.XMLHTTP"); else { alert ("Votre navigateur ne supporte pas les objets XMLHTTPRequest..."); return; } req.onreadystatechange = testRep; req.open("GET", "sql.php", true); data = "var_i="+i; req.send(data); } function testRep() { if (req.readyState == 4) { if (req.status == 200) { document.open(); document.write (req.responseText); document.close(); } else { alert("Problem: " + req.statusText); } } } </script> </head> <body> <a href="javascript:ajax(1);">1</a> <a href="javascript:ajax(2);">2</a> </body> </html>
et sql.php
<?php mysql_connect("localhost", "root", ""); mysql_select_db("test"); $i = $_GET['var_i']; $reponse = mysql_query("SELECT * FROM membres WHERE id='$i'"); $donnees = mysql_fetch_array($reponse); echo $donnees['nom']; mysql_close(); ?>
J'ai aussi des questions sur le code que tu as posté:
- à quoi ça sert de dire var req = null; est-ce qu'on peut pas mettre juste var req; ?
- à quoi sert le "return" après l'alerte "votre navigateur n'accepte pas..."?
- quelle est la différence entre POST et GET? est ce que c'est juste la façon dont sont envoyées les variables? (dans l'url ou pas)?
- à quoi sert le
eval(xhr_object.responseText);
et le
xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
oui, ça fait un peu beaucoup de questions...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
18 mars 2008 à 12:04
18 mars 2008 à 12:04
Questions auxquelles je répondrais après ma pause miam :)
A cet après midi.
A cet après midi.
chantaussel
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
30
18 mars 2008 à 14:25
18 mars 2008 à 14:25
Merci énormément pour toutes ces précisions kij ! Je commence à y voir plus clair.
Bon je continue à réfléchir sur mon problème de variable qui ne se transmet pas au script php, mais si quelqu'un voit où ça pêche je suis preneuse!
mille merci
Bon je continue à réfléchir sur mon problème de variable qui ne se transmet pas au script php, mais si quelqu'un voit où ça pêche je suis preneuse!
mille merci
chantaussel
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
30
18 mars 2008 à 15:31
18 mars 2008 à 15:31
Alors petit à petit on y arrive...
En cas de problème avec la transmission de variables globales, il faut s'assurer que le serveur accepte cette transmission. Par exemple avec easyphp, le variables globales sont déactivées par défaut. Chez free par contre, je viens de vérifier elle sont activées.
Tout est expliqué ici PHP - Récupération de données.
Si vous travaillez avec easyphp et que vos variables globales sont déactivées, voilà comment les activer (attention, certains disent que ça peut poser des problèmes de sécurité et qu'il vaut mieux ré-écrire ses scripts et se débrouiller sans...). Mais bon si vous êtes coincé, voilà comment faire :
- ouvrir le fichier php.ini qui se trouve dans le répertoire apache de easyphp (chez moi il y en a aussi un dans le répertoire conf_files, mais ce n'est pas le bon)
- rechercher l'expression register_globals = Off et la remplacer par register_globals = On et le tour est joué!
- relancer easyphp
Bon j'ai bien fait cette manip, mais mon script ne marche toujours pas...
En cas de problème avec la transmission de variables globales, il faut s'assurer que le serveur accepte cette transmission. Par exemple avec easyphp, le variables globales sont déactivées par défaut. Chez free par contre, je viens de vérifier elle sont activées.
Tout est expliqué ici PHP - Récupération de données.
Si vous travaillez avec easyphp et que vos variables globales sont déactivées, voilà comment les activer (attention, certains disent que ça peut poser des problèmes de sécurité et qu'il vaut mieux ré-écrire ses scripts et se débrouiller sans...). Mais bon si vous êtes coincé, voilà comment faire :
- ouvrir le fichier php.ini qui se trouve dans le répertoire apache de easyphp (chez moi il y en a aussi un dans le répertoire conf_files, mais ce n'est pas le bon)
- rechercher l'expression register_globals = Off et la remplacer par register_globals = On et le tour est joué!
- relancer easyphp
Bon j'ai bien fait cette manip, mais mon script ne marche toujours pas...
chantaussel
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
30
>
chantaussel
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
18 mars 2008 à 19:35
18 mars 2008 à 19:35
Et voilà, j'ai résolu mon problème. Tout venait de cette fameuse ligne
va savoir pouquoi, mais sans elle les variables de req.send(data) ne sont pas transmises!
Bref, voilà le code, en entier, et qui fonctionne:
ajax.html:
sql.php:
Voilà et finalement pas besoin d'activer les "register_globals" sur le serveur, avec l'array $_POST ça marche nickel!
req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
va savoir pouquoi, mais sans elle les variables de req.send(data) ne sont pas transmises!
Bref, voilà le code, en entier, et qui fonctionne:
ajax.html:
<html> <head> <title>My first XMLHttpRequest</title> <script language="JavaScript"> function ajax(i) { var req = null; //défini l'objet req de façon globale, pour qu'il soit reconnu dans tout le script req = new XMLHttpRequest(); req.onreadystatechange = testRep; // ici on attribue la fonction à req.onreadystatechange, mais on ne l'exécute pas encore, donc ne pas mettre les () req.open("POST", "sql.php", true); req.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); // je sais pas ce que ça veut dire mais c'est INDISPENSABLE pour transmettre des données au script php data = "i="+i; req.send(data); function testRep() { // cette fonction va lancer l'affichage des données reçues, une fois que la requête sera "complete" (readyState=4) if (req.readyState == 4) { if (req.status == 200) { document.open(); //ceci ouvre un nouveau flux qui va permettre l'exécution des commandes qui suivent (ici document.write) s'exécute simultanément document.write(req.responseText); // responseText contient la chaîne de caractères transmise par echo dans le script php document.close(); // ceci ferme le flux et lance l'exécutions des commandes qui precèdent } else { alert("Problem: " + req.statusText); } } } } </script> </head> <body> <a href="javascript:ajax(1);">1</a> <a href="javascript:ajax(2);">2</a> </body> </html>
sql.php:
<?php $i = $_POST['i']; mysql_connect("localhost", "root", ""); mysql_select_db("test"); $reponse = mysql_query("SELECT * FROM membres WHERE id='$i'"); $donnees = mysql_fetch_array($reponse); echo $donnees['nom']; echo "<br>"; echo $donnees['prenom']; echo "<br>"; echo $donnees['naissance']; echo "<br>"; echo $donnees['deces']; // à chaque echo on rajoute des elements à la chaine de caractères contenue dans req.responseText. Tout s'ajoute puis document.write écrit tout d'un coup en rechargeant la page. mysql_close(); ?>
Voilà et finalement pas besoin d'activer les "register_globals" sur le serveur, avec l'array $_POST ça marche nickel!
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
19 mars 2008 à 09:38
19 mars 2008 à 09:38
Oui c'est même déconseillé pour raison de sécurité de mettre register_global à on.
Je cite :
Sinon au cas où (bien que désormais tu n'en ai plus vraiment besoin), je viens de tomber sur une page sympa concernant Ajax et XMLHttpRequest : https://siddh.developpez.com/articles/ajax/
Je cite :
Lorsqu'elle est activée, register_globals va injecter vos scripts avec toutes sortes de variables, comme les variables issues des formulaires HTML. Ceci, couplé au fait que PHP ne requiert pas d'initialisation de variable signifie que la programmation de script peu sûr est possible.
Sinon au cas où (bien que désormais tu n'en ai plus vraiment besoin), je viens de tomber sur une page sympa concernant Ajax et XMLHttpRequest : https://siddh.developpez.com/articles/ajax/
chantaussel
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
30
19 mars 2008 à 15:07
19 mars 2008 à 15:07
Merci de m'avoir suivi jusqu'au bout kij! J'ai visité des tas de pages ces deux derniers jours et celle-la je ne l'avais pas trouvée. J'ajoute également
https://www.toutjavascript.com/savoir/xmlhttprequest.php3
https://openweb.eu.org/articles/objet_xmlhttprequest/
https://www.xul.fr/xml-ajax.html
Bonne continuation et encore merci!
https://www.toutjavascript.com/savoir/xmlhttprequest.php3
https://openweb.eu.org/articles/objet_xmlhttprequest/
https://www.xul.fr/xml-ajax.html
Bonne continuation et encore merci!
chantaussel
Messages postés
137
Date d'inscription
lundi 17 mars 2008
Statut
Membre
Dernière intervention
9 juillet 2014
30
22 mars 2008 à 08:58
22 mars 2008 à 08:58
Juste pour préciser, si ça peut être utile, que je viens de comprendre le pourquoi de la ligne
Indispensable si on veut envoyer des données avec la méthode POST, elle permet changer le type MIME de la requête. Sans ça le serveur ne prendra pas en compte les données envoyées avec nom_de_la_requete.send(donnees)
Les explications viennent de cette page, très claire pour comprendre le fonctionnement des requêtes:
https://developer.mozilla.org/fr/docs/Web/Guide/AJAX/Premiers_pas
req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
Indispensable si on veut envoyer des données avec la méthode POST, elle permet changer le type MIME de la requête. Sans ça le serveur ne prendra pas en compte les données envoyées avec nom_de_la_requete.send(donnees)
Les explications viennent de cette page, très claire pour comprendre le fonctionnement des requêtes:
https://developer.mozilla.org/fr/docs/Web/Guide/AJAX/Premiers_pas
Salut
J'ai essayé ton script finale , mais en cliquant sur un des liens , une autre page s'ouvre mais vide
exemple, on a la page sql qui s'ouvre mais pas sur la meme page.
A plus
J'ai essayé ton script finale , mais en cliquant sur un des liens , une autre page s'ouvre mais vide
exemple, on a la page sql qui s'ouvre mais pas sur la meme page.
A plus
bonjour à tous,
j'ai essayé ton dernier code et je tombe sur une page vide, peux-tu m'aider stp merci
j'ai essayé ton dernier code et je tombe sur une page vide, peux-tu m'aider stp merci
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
1 août 2008 à 15:37
1 août 2008 à 15:37
Bonjour,
Si tu n'as pas la base de données qui va avec tu ne risque pas d'avoir grand chose.
Si tu n'as pas la base de données qui va avec tu ne risque pas d'avoir grand chose.
rebonjour,
j'ai créer une base de donnée avec une seule table afin d'excuterr le script. et maintenant ça marche une fois sur trois!!!!
quand je lance mon fichier .php j'ai un résultat qui prouve que la connexion est bonne de la base que j'ai crée.
par contre quand je lance le fichier ajax .html ça marche pas.
j'ai créer une base de donnée avec une seule table afin d'excuterr le script. et maintenant ça marche une fois sur trois!!!!
quand je lance mon fichier .php j'ai un résultat qui prouve que la connexion est bonne de la base que j'ai crée.
par contre quand je lance le fichier ajax .html ça marche pas.
kij_82
Messages postés
4089
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
1 août 2008 à 16:36
1 août 2008 à 16:36
Re bonjour,
Ben, a toi de débuguer pour voir ce qui cloche. Si tu dis que tu as tout fait pour que ce soit pareil (ce que je doute puisque ça ne fonctionne pas) c'est que les conditions d'utilisation ne sont peut être pas les mêmes (navigateur différent, etc. ?)
Peux-tu donner ton code (celui de la page, celui du code javascript et celui du fichier de traitement, appelé par le code javascript)
Ben, a toi de débuguer pour voir ce qui cloche. Si tu dis que tu as tout fait pour que ce soit pareil (ce que je doute puisque ça ne fonctionne pas) c'est que les conditions d'utilisation ne sont peut être pas les mêmes (navigateur différent, etc. ?)
Peux-tu donner ton code (celui de la page, celui du code javascript et celui du fichier de traitement, appelé par le code javascript)
Merci pour ton aide!!!
le navigateur est IE6
le code ajax.html
<head>
<title>My first XMLHttpRequest</title>
<script language="JavaScript">
function ajax(i)
{
var req = null; //défini l'objet req de façon globale, pour qu'il soit reconnu dans tout le script
if(window.ActiveXObject) // Internet Explorer
req = new ActiveXObject("Microsoft.XMLHTTP");
else
{ // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
return;
}
// ici on attribue la fonction à req.onreadystatechange, mais on ne l'exécute pas encore, donc ne pas mettre les ()
req.onreadystatechange = testRep;
req.open("POST", "sql.php", true);
req.send("i="+i);
// je sais pas ce que ça veut dire mais c'est INDISPENSABLE pour transmettre des données au script php
req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
function testRep()
{ // cette fonction va lancer l'affichage des données reçues, une fois que la requête sera "complete" (readyState=4)
if (req.readyState == 4)
{
if (req.status == 200)
{
document.open();
//ceci ouvre un nouveau flux qui va permettre l'exécution des commandes qui suivent (ici document.write) s'exécute simultanément
document.write(req.responseText); // responseText contient la chaîne de caractères transmise par echo dans le script php
document.close(); // ceci ferme le flux et lance l'exécutions des commandes qui precèdent
}
else
{
alert("Problem: " + req.statusText);
}
}
}
}
</script>
</head>
<body>
<a href="javascript:ajax(1);">1</a>
<a href="javascript:ajax(2);">2</a>
</body>
</html>
le code sql.php
<?php
$i = $_POST['i'];
echo $i;
mysql_connect("na", "root", "root");
mysql_select_db("test");
$reponse = mysql_query(" select * from nuke_links_links where pn_date = '2005-02-01' ");
$donnees = mysql_fetch_array($reponse);
echo "salut";
echo $donnees['titre'];
echo "<br>";
echo $donnees['pn_title'];
echo "<br>";
echo $donnees['pn_url'];
mysql_close();
?>
le navigateur est IE6
le code ajax.html
<head>
<title>My first XMLHttpRequest</title>
<script language="JavaScript">
function ajax(i)
{
var req = null; //défini l'objet req de façon globale, pour qu'il soit reconnu dans tout le script
if(window.ActiveXObject) // Internet Explorer
req = new ActiveXObject("Microsoft.XMLHTTP");
else
{ // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
return;
}
// ici on attribue la fonction à req.onreadystatechange, mais on ne l'exécute pas encore, donc ne pas mettre les ()
req.onreadystatechange = testRep;
req.open("POST", "sql.php", true);
req.send("i="+i);
// je sais pas ce que ça veut dire mais c'est INDISPENSABLE pour transmettre des données au script php
req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
function testRep()
{ // cette fonction va lancer l'affichage des données reçues, une fois que la requête sera "complete" (readyState=4)
if (req.readyState == 4)
{
if (req.status == 200)
{
document.open();
//ceci ouvre un nouveau flux qui va permettre l'exécution des commandes qui suivent (ici document.write) s'exécute simultanément
document.write(req.responseText); // responseText contient la chaîne de caractères transmise par echo dans le script php
document.close(); // ceci ferme le flux et lance l'exécutions des commandes qui precèdent
}
else
{
alert("Problem: " + req.statusText);
}
}
}
}
</script>
</head>
<body>
<a href="javascript:ajax(1);">1</a>
<a href="javascript:ajax(2);">2</a>
</body>
</html>
le code sql.php
<?php
$i = $_POST['i'];
echo $i;
mysql_connect("na", "root", "root");
mysql_select_db("test");
$reponse = mysql_query(" select * from nuke_links_links where pn_date = '2005-02-01' ");
$donnees = mysql_fetch_array($reponse);
echo "salut";
echo $donnees['titre'];
echo "<br>";
echo $donnees['pn_title'];
echo "<br>";
echo $donnees['pn_url'];
mysql_close();
?>