Partage
  • Partager sur Facebook
  • Partager sur Twitter

Chat en ajax et php

Sujet résolu
    7 juin 2007 à 14:46:32

    Bonjour,

    Je viens de découvrir le tutoriel qui explique le fonctionnement d'Ajax avec php (<lien url="http://www.siteduzero.com/tuto-3-7876-1-application-ajax-facile-avec-php-et-xajax.html" />). J'ai tenté de faire l'exercice mais malheuresement j'ai des erreurs lors du lancement de l'appli sur le navigateur que voici :
    Image utilisateur
    Je travaille essentiellement sous Opéra 9 mais j'ai testé aussi sous Firefox.
    Je me suis demandé si ça ne venait pas de la librairie Xajax car j'ai vérifié plusieurs fois le code et même copier/coller celui du tuto...
    Merci de vos réponses :D
    • Partager sur Facebook
    • Partager sur Twitter
      7 juin 2007 à 15:28:09

      Bin là ton script php exécuté via Ajax retourne une erreur. C'est clair et net : notice, undefined variable...

      Et xAjax est apparemment plus sensible à ce genre d'erreurs qu'Ajax lui-même (Du html dans du xml, ça passe pas ^^ )
      • Partager sur Facebook
      • Partager sur Twitter
        7 juin 2007 à 15:38:32

        Merci pour ta réponse rapide !
        Selon toi, c'est le script php qui est en cause ?

        Pour information, j'utilise la version 0.2.5 d'Xajax (celle disponible sur le site officiel)
        • Partager sur Facebook
        • Partager sur Twitter
          7 juin 2007 à 15:52:37

          Oui, c'est le php qui est en cause. Pour t'en assurer, exécute le script toi-même, sans passer par Ajax.
          • Partager sur Facebook
          • Partager sur Twitter
            7 juin 2007 à 16:24:15

            Je n'arrive pas à trouver d'erreur au niveau du code php.
            Voici un copier/coller du code du tutoriel. J'ai bien installé les fichiers de la librairie xAjax dans la racine. ça ne doit pas poser de problème si je l'utilise en local avec esayphp ?


            <?php
            //
            //Notre fonction PHP pour afficher les messages
            //
            function afficher()
            {
                    $reponse = new xajaxResponse();//Création d'une instance de xajaxResponse pour traiter les réponses serveur
                    $chat = '';//Initialisation de la variable $chat
                    $fichier_texte = fopen('./chat.txt', 'r');//On ouvre notre fichier texte en lecture seule
                    $chat = fread($fichier_texte, filesize('./chat.txt'));//On lit notre fichier et on le stocke dans la variable $chat
                    fclose($fichier_texte);//On ferme notre fichier texte   
                    $reponse->addAssign("block", "innerHTML", $chat);//Enfin, on change le contenu du div block par le contenu de $chat
                    return $reponse->getXML();
            }

            //
            //Notre fonction PHP envoyer pour envoyer un message
            //
            function envoyer($posteur, $message)
            {
                    $reponse = new xajaxResponse();//Création d'une instance de xajaxResponse pour traiter les réponses serveur
                    $fichier_texte = fopen('./chat.txt', 'a');//On ouvre notre fichier texte en ecriture seule
                    fwrite($fichier_texte, addslashes('<strong>'.htmlentities($posteur).':</strong>'.htmlentities(utf8_decode($message)).'<br />'));//On stocke dans notre fichier
                    fclose($fichier_texte);//On ferme notre fichier texte
                    $reponse->addAssign("message", "value", "");//On vide le champ contenant le message du posteur
                    $reponse->addScript("xajax_afficher();");//On appelle la fonction afficher pour afficher les messages et que le posteur voit son message à l'écran
                    return $reponse->getXML();
            }

            //
            //Ouverture de la librairie xajax
            //Instanciation d'un objet de la classe xajax, puis déclaration de nos fonctions php
            //
            require("./xajax.inc.php");
            $xajax = new xajax(); //On initialise l'objet xajax
            $xajax->registerFunction("afficher");//on enregistre nos fonctions
            $xajax->registerFunction("envoyer");
            $xajax->processRequests();//Fonction qui va se charger de faire les requetes APRES AVOIR DECLARE NOS FONCTIONS
            ?>


            Merci pour ton aide !
            • Partager sur Facebook
            • Partager sur Twitter
              7 juin 2007 à 16:34:27

              L'erreur vient d'un autre morceau du script (La fonction xajax_afficher() a priori)

              En fait, Ajax se déroule en 3 temps :

              - Génération de la page en php, classique, en glissant quelques bouts de javascript ici et là (de l'Ajax en fait)
              - Lors d'un évènement Javascript (Par exemple, poster un message), Ajax envoie une requête vers le serveur.
              - Le serveur exécute un script, et renvoie le résultat à Ajax

              Je pense que tu m'as montré le code source de la première étape. xAjax se charge de la 2ème étape. Mais la 3ème étape, qui fait appel à l'une de tes fonctions (ajax_afficher(), je pense), c'est elle qui bug. C'est donc ta fonction ajax_afficher() qui a une erreur, et c'est elle que tu devrais tester.

              (Je connais pas xAjax, j'ai juste quelques notions d'Ajax, donc je peux pas vraiment te dire en détails où chercher ni quoi corriger exactement... Mais je pense que mes pistes sont les bonnes ^^ )
              • Partager sur Facebook
              • Partager sur Twitter
                7 juin 2007 à 17:00:19

                Voila la fonction afficher (dans la partie HEAD) que j'utilise :


                <?php $xajax->printJavascript(); /* Affiche le Javascript */?>
                function refresh()//script javascript qui va appeler le fonction afficher toutes les 5 secondes
                {
                  xajax_afficher(); //fonction créé à partir registerFunction qui affiche le contenu de chat.txt
                  setTimeout(refresh, 5000); //Minuteur qui va rafraîchir le bloc ajax toutes 5 secondes
                }
                </script>


                Je l'apelle dans la partie BODY :

                <script type="text/javascript">
                  refresh();//On appelle la fonction refresh() pour lancer le script
                </script>
                • Partager sur Facebook
                • Partager sur Twitter
                  7 juin 2007 à 17:05:26

                  C'est donc xajax_afficher (Qui est une fonction javascript, par contre, et pas une fonction php) qui se charge d'appeler le script php. Très bien, c'est l'étape 2, ça. On avance ^^

                  Mais c'est toujours l'étape 3 qui bug :p Ton fichier chat.txt, il est récupéré par php, qui le renvoie vers Ajax, normalement (A moins que javascript le lise directement, mais dans ce cas Ajax ne sert plus à rien, donc j'en doute :p ). Allez, cherche encore un peu, je suis sûr que tu connais ce script php ^^
                  • Partager sur Facebook
                  • Partager sur Twitter
                    7 juin 2007 à 17:26:05

                    Je pense à la fonction php qui permet de lire un fichier : fread() mais elle est déjà utilisé dans la fonction php afficher()

                    Je vais récapituler pour voir si j'ai bien compris le fonctionnenement :p .
                    1- fonction php afficher()
                    elle renvoie le contenue du fichier "chat.txt" dans la variable $reponse qui sera au format XML

                    2- on instancie l'objet xajax puis grâce à la fonction registerFunction, la fonction php afficher() devient une classe de xAjax nommé xajax_afficher()

                    3- On appelle la classe printJavascript() qui permettra d'afficher le contenu en javascript dans la page HTML

                    est-ce que j'ai bien tout compris ? :D
                    • Partager sur Facebook
                    • Partager sur Twitter
                      7 juin 2007 à 19:35:04

                      Bon, on va reprendre le problème depuis le début : le message d'erreur.

                      Il dit quoi ?

                      Citation : Pas de titre

                      undefined variable : sResponse in ...xajax.inc.php on line 747



                      Ouvre ce fichier et copie quelques lignes autour de la 747. Le contexte en particulier (Nom de la fonction, paramètres, ligne où la variable sResponse est appelée). Ca fait partie de la lib, mais on va remonter à partir de là jusqu'à un code à toi (Je doute que le bug vienne de la lib, mais p'tet que si. Mais on va partir du principe que non :p )
                      • Partager sur Facebook
                      • Partager sur Twitter
                        7 juin 2007 à 19:56:36

                        Ligne 747 à 750 de xajax.inc.php


                        if (is_string($sResponse)) {
                          $oResponse = new xajaxResponse();
                          $oResponse->addAlert("No XML Response Was Returned By Function $sFunctionName.\n\nOutput: ".$oResponse);
                        }


                        sinon dans le raisonnement j'ai juste ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          7 juin 2007 à 21:46:07

                          Essaie de trouver un peu de code au dessus (Je te laisse fouiller ^^ ) qui indiquerait comment sReponse est censée être définie (Fais une recherche sur sReponse au dessus de la ligne 747).

                          Si tu vois par exemple sReponse définie à l'intérieur d'un if, montre le if (C'est probablement un test qui n'est pas exécuté).

                          (Je sens que ça va être long et compliqué... Accessoirement, je déteste les libs externes/téléchargées xD )

                          Si quelqu'un connaissant la lib pouvait regarder, je laisserais volontier ma place sur le coup ^^ (Sinon je téléchargerai la lib demain et je regarderai comment ça marche... en espérant qu'elle soit pas trop grosse :p )
                          • Partager sur Facebook
                          • Partager sur Twitter
                            7 juin 2007 à 22:08:08

                            Je te remercie beaucoup pour ton aide Veldryn mais je viens enfin de trouver l'erreur. Elle se situait bien dans la lib, dans le fichier xajax.inc.php à la ligne 747. Le bug est connue des développeurs d'xajax (j'ai d'ailleurs trouvé la solution sur leur forum).

                            Voici la solution :
                            Code actuel (ligne 747 à 756)

                            if (is_string($sResponse)) {
                              $oResponse = new xajaxResponse();
                              $oResponse->addAlert("No XML Response Was Returned By Function $sFunctionName.\n\nOutput: ".$oResponse);
                            }
                            else if ($sPreResponse != "") {
                              $oNewResponse = new xajaxResponse($this->sEncoding, $this->bOutputEntities);
                              $oNewResponse->loadXML($sPreResponse);
                              $oNewResponse->loadXML($oResponse);
                              $oResponse = $sNewResponse;
                            }


                            Et le code à remplacer (ligne 747 à 757)

                            if (is_string($oResponse)) {
                              $oNewResponse = new xajaxResponse();
                              $oNewResponse->addAlert("No XML Response Was Returned By Function $sFunctionName.\n\nOutput: ".$oResponse);
                              $oResponse = $oNewResponse;
                            }
                            else if ($sPreResponse != "") {
                              $oNewResponse = new xajaxResponse($this->sEncoding, $this->bOutputEntities);
                              $oNewResponse->loadXML($sPreResponse);
                              $oNewResponse->loadXML($oResponse);
                              $oResponse = $oNewResponse;
                            }


                            Je suis content que ça marche enfin :D après une journée de recherche o_O
                            En espérant que ça en aidera certain, je rappelle que j'utilise la version 0.2.5 d'xAjax
                            @++
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Chat en ajax et php

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown