Ajax // Ordre d'execution // Gros soucis

Ajax // Ordre d'execution // Gros soucis - HTML/CSS - Programmation

Marsh Posté le 29-04-2007 à 01:50:23    

Salut tout le monde,
 
Bon alors voilà, je vais rentrer direct dans le vive du sujet, en vous explicitant avec des images mon problème...
 
-J'ai crée une interface ou des utilisateurs peuvent se logguer.
-A chaque page est attribué un code; ce code est associé à une action. Celà sert à voir, dans la page d'accueil du site, les actions que sont en train d'entreprendre les membres (personnes ayant un cookie sur leur bécane). (pour l'exemple, on verrait "Aguila73 est en train d'ecrire un post" ).
 
-Explication du systeme:
1) la personne se loggue
2) un cookie est transmis pour retenir l'etat "connecté"
3) selon la page ou il est, un code est envoyé à la BDD pour dire où est le membre
 
Extrait de la page d'accueil:

Code :
  1. if ($ligne_modo[5] == 0){echo "<font color='#aa0000'>Déconnecté</font>";}
  2. if ($ligne_modo[5] == 1){echo "<font color='#006600'>Connecté</font>";}
  3. if ($ligne_modo[5] == 2){echo "<font color='#000066'>Visite le blog</font>";}
  4. if ($ligne_modo[5] == 3){echo "<font color='#000066'>Gère les sous-rubriques</font>";}


 
Extrait de la BDD:
http://aguila73.free.fr/hardware/1.jpg
 
 
Bon OK, jusque là, rien de bien compliqué, on se demande même pourquoi le mot Ajax est dans le titre...
Voila le réel problème:
Quand l'utilisateur clique sur "déconnexion", le cookie se barre, et le code dans la BDD est mis à jour (déconnecté).
MAIS, il arrive souvent de s'en aller SANS cliquer sur "deconnexion"... Le cookie n'est pas trop un probleme, a la limite, je lui mets une durée de vie limitée... mais de toute maniere, chaque page effectue d'abord un test du genre:
 

Code :
  1. if (isset ($_COOKIE['id'])){
  2. require_once ("fichier_de_conn.php" );
  3. $sql = "UPDATE table SET enligne_membre='1' WHERE id_membre='".$_COOKIE['id']."'";
  4. $requete = @mysql_query ($sql);
  5. }


...donc meme si le cookie est là, mais que dans la BDD j'ai noté la personne déconnectée, elle sera reconnectée d'un point de vue base de donnée dès son arrivée sur une page (code précédent).
 
Dans le cas ou le membre quitte la fenetre sans cliquer sur "deconnexion", je ne peux afficher que son dernier statut retenu... (genre la, je quitte, et on verrait: "aguila ecrit un post", meme 10 jours apres...moyen moyen quand meme...).
 
Le principe: L'utilisateur quitte la page pour une autre, ou pour fermer la fenetre : un JS est lancé, il appelle un PHP qui remet en mode "deconnecté" dans la BDD > Si l'utilisateur quitte la fenetre, il sera bien en "deconnecté", et si il quitte la page pour une autre page du site, celle-ci renverra les informations à la BDD, car cookie toujours existant (cf code précédent).
 
Codes:
 
J'ai donc penser a faire un:

Code :
  1. <body onunload="Deconnexion('deconnexion.php')">

...sur chaque page...
 
 
Script javascript appelé:

Code :
  1. function Deconnexion (fichier){
  2. var xhr_object = null;
  3. if(window.XMLHttpRequest) { // Firefox  
  4.  xhr_object = new XMLHttpRequest();
  5.  xhr_object.overrideMimeType('text/xml');
  6. }
  7. else if(window.ActiveXObject) { // Internet Explorer  
  8.  xhr_object = new ActiveXObject("Microsoft.XMLHTTP" );
  9. }
  10. else { // XMLHttpRequest non supporté par le navigateur  
  11.  alert("Ton navigateur ne supporte pas les objets XMLHTTPRequest..." );
  12.  return;
  13. }
  14. xhr_object.open("POST", fichier, true);
  15. xhr_object.onreadystatechange = function() {
  16.  if (xhr_object.readyState == 4) {
  17.   alert(xhr_object.responseText); //Normalement, je ne traite pas la reponse, mais j'ai mis une alert pour le debug
  18.  }
  19. };
  20. xhr_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded" );
  21. xhr_object.send(null);
  22. }


 
Fichier PHP:

Code :
  1. <?php
  2. header('Content-type: text/html; charset=iso-8859-1');
  3. if (isset ($_COOKIE['id'])){
  4. //pour le debug - statut membre avant requete
  5. require_once ("fichier_connexion.php" );
  6. $sql = "SELECT * FROM table WHERE id_membre='".$_COOKIE['id']."'";
  7. $requete = mysql_query ($sql);
  8. $resultat = mysql_fetch_row ($requete);
  9. echo $resultat[5]."\n\n\n";
  10. //actions
  11. $sql2 = "UPDATE table SET enligne_membre='0' WHERE id_membre='".$_COOKIE['id']."'";
  12. $requete2 = mysql_query ($sql2);
  13. echo $sql2."\n\n\n";
  14. //pour le debug, toujours... - statut membre après requete
  15. $sql3 = "SELECT * FROM table WHERE id_membre='".$_COOKIE['id']."'";
  16. $requete3 = mysql_query ($sql3);
  17. $resultat3 = mysql_fetch_row ($requete3);
  18. echo $resultat3[5]."\n\n\n";
  19. }
  20. ?>


 
Donc vous pouvez constater que j'ai voulu debugger...
Voici ce que j'obtiens, en images:
 
Accueil = code 1
Blog = code 2
 
Je suis sur l'accueil, je veux me rendre sur la page blog:
http://aguila73.free.fr/hardware/2.jpg
 
 
Je suis sur blog, je repasse sur accueil:
http://aguila73.free.fr/hardware/3.jpg
 
 
Trois valeurs apparaissent:
-l'etat précédent
-la requete envoyée
-l'etat suivant (toujours egal à 0=déconnecté, normal)
 
Mais regardez la première valeur : elle change!!!
Ce qui signifie qu'à priori mon script fonctionne, et que le code Ajax est exécuté APRES le chargement de la page!
Pourtant:
page1, quittée >> appel du script pour mettre le statut "déconnecté"
page2, arrivée >> injection code correspondant à la page
 
Voila, j'espere que vous avez tous compris mon problème, j'ai essayé d'être le plus compréhensible possible, et que vous allez m'éclairer un peu plus sur Ajax ou je ne sais quoi qui fais foirer mon idée... Et si vous avez d'autres idées d'ailleurs...  :D  
 
Merci d'avance, je compte sur vous! :jap:


Message édité par Aguila_73 le 29-04-2007 à 01:52:28
Reply

Marsh Posté le 29-04-2007 à 01:50:23   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed