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
Bonjour,
Je débute avec AJAX, et j'aimerais faire la chose suivante:
- récupérer des données dans une base lorsqu'on clique sur un lien.
- afficher ces données sur le navigateur.

J'ai créé deux fichiers:
- ajax.html qui affiche le lien à cliquer et lance la requête.
- sql.php qui récupère les données dans la base et les affiche.

Malheureusement ça ne marche pas, je reste bloquée au readyState=1...

Je sais qu'il manque des lignes pour le cas ou navigateur=IE, mais ça sera pour plus tard.

Si quelqu'un peut m'éclairer? Merci d'avance!

ajax.html:
<html>
<head>
<title>My first XMLHttpRequest</title>
<script language="JavaScript">
function ajax()  {
    req = new XMLHttpRequest();
    req.onreadystatechange = testRep;
	req.open("GET", "sql.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>


sql.php:
<?php
mysql_connect("localhost", "root", "");
mysql_select_db("test");
$reponse = mysql_query("SELECT * FROM membres WHERE id='2'");
$donnees = mysql_fetch_array($reponse);
echo "<script language='JavaScript'>document.write ('".$donnees['nom']."');</script>";
mysql_close();
?>

14 réponses

kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
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 :
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é.
1
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
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.
0
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
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.
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!
0
kij_82 Messages postés 4088 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
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.
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
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).
<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>
0
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
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:

<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
0
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
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!

<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!
0
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
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:

<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!
0
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
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 :
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();
?>

0
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
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

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...



0

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

Posez votre question
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
18 mars 2008 à 12:04
Questions auxquelles je répondrais après ma pause miam :)
A cet après midi.
0
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
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
0
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
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...
0
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
Et voilà, j'ai résolu mon problème. Tout venait de cette fameuse ligne
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!
0
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
19 mars 2008 à 09:38
Oui c'est même déconseillé pour raison de sécurité de mettre register_global à on.
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/
0
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
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!
0
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
Juste pour préciser, si ça peut être utile, que je viens de comprendre le pourquoi de la ligne
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
0
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
0
Salut
ok c'est bon , j'ai modifié tout ça et c'est ok !
A bientôt
0
bonjour à tous,

j'ai essayé ton dernier code et je tombe sur une page vide, peux-tu m'aider stp merci
0
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
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.
0
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.
0
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
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)
0
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();
?>
0
merci beaucoup ça marche j'ai elevé le dcoument .open. et document.close
Boncourage a tout le monde
0