Code XMLHttpRequest

Fermé
Alain - 18 oct. 2009 à 02:28
lewis34 Messages postés 2557 Date d'inscription samedi 21 juillet 2007 Statut Membre Dernière intervention 30 mai 2015 - 19 oct. 2009 à 05:33
Bonjour,
voilà, j'ai trouvé sur internet un script permettant aux visiteurs de noter avec un système par étoiles.
Cependant le script ne propose que la partie client, et il nous faut faire la partie serveur.

Et justement, pour cela il faut utiliser AJAX et XMLHttpRequest, ce dont je ne connais rien du tout.

Voilà, j'aimerais que les visiteurs puissent noter tous mes articles où je met le script.
J'ai dans ma table un champs "note".
Voici le script que j'ai trouvé:
<html>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<head>
<script>
<!-- 
StarOutUrl=		'StarOut.gif';		//image par défaut
StarOverUrl=	'StarOver.gif';		//image d'une étoile sélectionnée
StarBaseId=		'Star';				//id de base des étoiles
NbStar=			10;					//nombre d'étoiles

LgtStarBaseId=StarBaseId.lastIndexOf('');

function NotationSystem() {
	for (i=1;i<NbStar+1;i++) {
		var img			=document.getElementById('Star'+i);
			
		img.onclick		=function() {alert('Vous avez donné la note de '+Name2Nb(this.id)+'.');};
		//Réaction lors du clic sur une étoile
		//Evidemment, il faudrait compléter cette fonction pour la rendre vraiment utile.
		//Par exemple, envoyer la note dans une base de donnée via un XMLHttpRequest.
		
		img.alt			='Donner la note de '+i;
		//Texte au survol
		
		img.src			=StarOutUrl;
		img.onmouseover	=function() {StarOver(this.id);};
		img.onmouseout	=function() {StarOut(this.id);};
	}
}

function StarOver(Star) {
	StarNb=Name2Nb(Star);
	for (i=1;i<(StarNb*1)+1;i++) {
		document.getElementById('Star'+i).src=StarOverUrl;
	}
}

function StarOut(Star) {
	StarNb=Name2Nb(Star);
	for (i=1;i<(StarNb*1)+1;i++) {
		document.getElementById('Star'+i).src=StarOutUrl;
	}
}

function Name2Nb(Star) {
	//Le survol d'une étoile ne nous permet pas de connaître directement son numéro
	//Cette fonction extrait donc ce numéro à partir de l'Id
	StarNb=Star.slice(LgtStarBaseId);
	return(StarNb);
} 
-->
</script>
</head>

<body onload="NotationSystem();">
<!-- 
Vous pouvez mettre un nombre quelconque d'étoiles, veillez juste à mettre à jour la variable NbStar. 
Par défaut, les étoiles sont "éteintes" : si un utilisateur a désectivé JS il ne pourra pas voter mais le script ne plantera pas
-->
<img id="Star1" src="StarOut.gif" /><img id="Star2" src="StarOut.gif" />
<img id="Star3" src="StarOut.gif" /><img id="Star4" src="StarOut.gif" />
<img id="Star5" src="StarOut.gif" /><img id="Star6" src="StarOut.gif" />
<img id="Star7" src="StarOut.gif" /><img id="Star8" src="StarOut.gif" />
<img id="Star9" src="StarOut.gif" /><img id="Star10" src="StarOut.gif" />
</body>

</html>


Voilà, donc comme il le dit dans les commentaires, il faut utiliser XMLHttpRequest pour envoyer la note dans la base de données, mais comme je ne connais rien à l'AJAX je ne sais pas du tout comment faire.
Merci de votre aide.
Bonne journée.
A voir également:

3 réponses

lewis34 Messages postés 2557 Date d'inscription samedi 21 juillet 2007 Statut Membre Dernière intervention 30 mai 2015 352
18 oct. 2009 à 10:14
je te met un p'tit bout de code à tester

img.onclick =function() {var note= Name2Nb(this.id);note_new(note);};

fonction qui va noter ton article en ajax
function note_news(note)
{

//on recupere le note et on prepare la requete ajax			
			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("GET", "note.php?note="+note  , true);//appele du ficher php qui va traiter tes infos passer en parametres get, bien sur tu peut passer d'autres pram en plus il suffit de les separer par & comme ça '&x=' +var1  + '&y=' + var2...etc
			   xhr_object.onreadystatechange = function() 
			   { 
			   
				  if(xhr_object.readyState == 4)
				  {
				  //alert(xhr_object.readyState);
				//alert(xhr_object.responseText); // DEBUG MODE decommente cette ligne pour debuger
					
					 eval(xhr_object.responseText);
//tu peut si tu souhaite afficher le resultat de ta requete dans un div
/* AFFICHAGE DE LA REQUETE AJAX */
					document.getElementById("divajax").innerHTML = xhr_object.responseText;

				  }
			   } 
			 
			  //xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			  xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		
				xhr_object.setRequestHeader("Content-type", "charset=UTF-8");
			  
			   var data = note;
			 		   
			   xhr_object.send(data);
	
}





fonction retournant l'objet XMLHttpRequest adéquat en fonction du navigateur


function getXMLHttpRequest()
{
var req = false;

try
{
   req=new XMLHttpRequest();
}

catch(e)
{
   try
   {
      req=new ActiveXObject("Msxml2.XMLHTTP");
   }
   catch (e)
   {
      try
      {
         req = new ActiveXObject("Microsoft.XMLHTTP");
      }
      catch(e)
      {
         req = false;
      }
   }
}

return req;

}


et tu n'a plus qu'a creer un fichier note.php

qui contiendra les requetes que tu souhaite faire

<?PHP

print_r($GET); // pour verifier que tu recois bien tes valeurs
/*
a partir de la c'est du php classique,insertion,modif etc
*/
?>


voila ça devrais je pense fonctionner,pour debuger utilise la console pour voir les erreurs javascript, y'en a peut etre j'ai pas tester
0
Merci beaucoup Lewis34,

cependant, je ne comprends pas trop ce code (oui, je ne connais strictement rien à l'AJAX et JavaScript).
Je pense avoir compris où placer ton code par rapport à la page de défaut:
<html>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<head>
<script>
<!-- 
StarOutUrl=		'StarOut.gif';		//image par défaut
StarOverUrl=	'StarOver.gif';		//image d'une étoile sélectionnée
StarBaseId=		'Star';				//id de base des étoiles
NbStar=			10;					//nombre d'étoiles

LgtStarBaseId=StarBaseId.lastIndexOf('');

function NotationSystem() {
	for (i=1;i<NbStar+1;i++) {
		var img			=document.getElementById('Star'+i);
			
		img.onclick		=function() {alert('Vous avez donné la note de '+Name2Nb(this.id)+'.');};
		//Réaction lors du clic sur une étoile
		//Evidemment, il faudrait compléter cette fonction pour la rendre vraiment utile.
		//Par exemple, envoyer la note dans une base de donnée via un XMLHttpRequest.
		img.onclick =function() {var note= Name2Nb(this.id);note_new(note);}; 
		function note_news(note)
{

//on recupere le note et on prepare la requete ajax			
			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("GET", "note.php?note="+note  , true);//appele du ficher php qui va traiter tes infos passer en parametres get, bien sur tu peut passer d'autres pram en plus il suffit de les separer par & comme ça '&x=' +var1  + '&y=' + var2...etc
			   xhr_object.onreadystatechange = function() 
			   { 
			   
				  if(xhr_object.readyState == 4)
				  {
				  //alert(xhr_object.readyState);
				//alert(xhr_object.responseText); // DEBUG MODE decommente cette ligne pour debuger
					
					 eval(xhr_object.responseText);
//tu peut si tu souhaite afficher le resultat de ta requete dans un div
/* AFFICHAGE DE LA REQUETE AJAX */
					document.getElementById("divajax").innerHTML = xhr_object.responseText;

				  }
			   } 
			 
			  //xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			  xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		
				xhr_object.setRequestHeader("Content-type", "charset=UTF-8");
			  
			   var data = note;
			 		   
			   xhr_object.send(data);
	
}
function getXMLHttpRequest()
{
var req = false;

try
{
   req=new XMLHttpRequest();
}

catch(e)
{
   try
   {
      req=new ActiveXObject("Msxml2.XMLHTTP");
   }
   catch (e)
   {
      try
      {
         req = new ActiveXObject("Microsoft.XMLHTTP");
      }
      catch(e)
      {
         req = false;
      }
   }
}

return req;

}
		
		img.alt			='Donner la note de '+i;
		//Texte au survol
		
		img.src			=StarOutUrl;
		img.onmouseover	=function() {StarOver(this.id);};
		img.onmouseout	=function() {StarOut(this.id);};
	}
}

function StarOver(Star) {
	StarNb=Name2Nb(Star);
	for (i=1;i<(StarNb*1)+1;i++) {
		document.getElementById('Star'+i).src=StarOverUrl;
	}
}

function StarOut(Star) {
	StarNb=Name2Nb(Star);
	for (i=1;i<(StarNb*1)+1;i++) {
		document.getElementById('Star'+i).src=StarOutUrl;
	}
}

function Name2Nb(Star) {
	//Le survol d'une étoile ne nous permet pas de connaître directement son numéro
	//Cette fonction extrait donc ce numéro à partir de l'Id
	StarNb=Star.slice(LgtStarBaseId);
	return(StarNb);
} 

-->
</script>
</head>

<body onload="NotationSystem();">
<!-- 
Vous pouvez mettre un nombre quelconque d'étoiles, veillez juste à mettre à jour la variable NbStar. 
Par défaut, les étoiles sont "éteintes" : si un utilisateur a désectivé JS il ne pourra pas voter mais le script ne plantera pas
-->
<img id="Star1" src="StarOut.gif" /><img id="Star2" src="StarOut.gif" />
<img id="Star3" src="StarOut.gif" /><img id="Star4" src="StarOut.gif" />
<img id="Star5" src="StarOut.gif" /><img id="Star6" src="StarOut.gif" />
<img id="Star7" src="StarOut.gif" /><img id="Star8" src="StarOut.gif" />
<img id="Star9" src="StarOut.gif" /><img id="Star10" src="StarOut.gif" />
</body>

</html>


Seulement maintenant je bloque.
Oui pour la page note.php, en effet, le PHP sa va je connais, cependant, j'ai un peu de mal à faire la requête convenable:
j'ai dans ma table, les champs note mais aussi ID avec chaque article ayant son propre ID.
Je souhaiterais que la note soit attribuée à l'article correspondant. Les articles sont affichés avec page_article.php?ID=#, je pense donc qu'il faille utiliser .mysql_real_escape_string($_GET['ID'])) mais comment faire car là l'ID n'est plus récupéré, il faudrait créer la variable dans la page notation (qui deviendrait .php) puis l'envoyer en GET à la page note.php.

Enfin, je m'embrouille, je ne sais pas comment faire.
En code normal en PHP j'aurais fait comme tel:
<?PHP

print_r ($GET); // pour verifier que tu recois bien tes valeurs
/*
a partir de la c'est du php classique,insertion,modif etc
*/
mysql_connect('localhost', 'PSEUDO', 'PASS') OR die('Erreur de connexion à la base');
mysql_select_db('DB') OR die('Erreur de sélection de la base');
$note = $GET;
$enr = mysql_query('UPDATE ma_table SET note = "$note" WHERE ID = '.mysql_real_escape_string($_GET['ID'])) or die ("Erreur requette ".mysql_error());
mysql_close();
?>


Enfin voilà, j'ai encore besoin d'aide, mais merci bien encore pour l'aide apportée jusqu'à présent.

Bonne journée.
0
lewis34 Messages postés 2557 Date d'inscription samedi 21 juillet 2007 Statut Membre Dernière intervention 30 mai 2015 352
19 oct. 2009 à 05:33
il ne faut pas placer le code tel quel dans ta page.. ^^
img.onclick =function() {var note= Name2Nb(this.id);note_new(note);}; 
		function note_news(note)
{

tu ecrira soit entre <head> et </head>
function note_news(note)
{
et la suite..

soit dans un fichier a part que tu appelaera comme çà
<script type="javascrispt" src="tonfichierdefonctionJS"></script>


pour ton ID tu peut le recuperer faciulement, si tes pages sont liées à l'ID.
tu met ton id dans un champ caché(met le en text pour deboguer et ensuite passe le en hidden)
cela va donner qqch comme ça <input type="text" name="id_article" id="id_article" value="<?PHP $id ?>" />

et dans la partie ajax (function note_news(note) )
tu rajoute ca au debut
var id=document.getElementById("id_article").value;

modifie ta requete ajax
xhr_object.open("GET", "note.php?note="+note +" &id=" +id  , true);

modifie ca aussi
var data = note+' '+id;

et apres php classique dans ta page note.php
0