Responsetext renvoie le script et pas le traitement

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Responsetext renvoie le script et pas le traitement

par mere-teresa » 13 oct. 2008, 11:15

Modération :
fitz7689, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.

par sadeq » 11 oct. 2008, 15:42

Mais il ne faut pas avoir honte d'apprendre. On apprend tous au fil du temps.
Il faut aller chercher le savoir même jusqu'en Chine. :wink:

par fitz7689 » 11 oct. 2008, 12:03

Quand je parlais d'un truc évident que j'avais la sensation de rater je ne sentais bien que j'étais sur une piste. Pour tester le fichier php, j'utilisais le menu [fichier]->[ouvrir un fichier]. Du coup, il ne risquait pas d'interpréter le code. En ouvrant par 127.0.0.1 puis en suivant les liens, le script fonctionne. Merci pour le cours d'Ajax, je pense en effet ne pas avoir suivi les phases dans le bon ordre. Je vais essayer de travailler quelques jours sur ces scripts afin de m'assurer de les avoir correctement assimilés et je reviendrai vous indiquer si tout est résolu. Merci pour votre patience.

ps : pour ce genre de bug, il faudrait tout de même prévoir un forum PHP pour mentalement déficient. J'ai honte, mais j'ai honte...

par mere-teresa » 10 oct. 2008, 10:57

Sans rapport direct avec le script, si tu travailles avec Firefox, je te conseille l'extension Firebug
http://getfirebug.com/

Dans la partie Réseau > filtre XHR, tu verras la response de ton serveur.

par sadeq » 10 oct. 2008, 10:46

Travailles-tu sous Linux ? Si oui, il faut revoir la procédure d'installation de Lamp et démarrer ton serveur Apache.

Par ailleurs et sur la base du code Ajax que tu as posté, je pense que tu as quelques erreurs logiques.
Il faut savoir que Ajax effectue un appel asynchrone (parallèle et en arrière-plan) au serveur Web et donc reçoit la réponse du serveur d'une manière asynchrone. C'est à dire que ton navigateur ne sait pas quand-est-ce qu'il recevra la réponse d'une requête Ajax asynchrone. C'est pour cette raison que l'on est obligé de déléguer la tâche de réception d'une réponse attendue à une fonction résidente qui se comporte comme un écouteur et qui reste active jusqu'à la réception de la réponse du serveur préalablement appelé par Ajax.

Pour ce faire, Ajax déploie l'événement onReadyStateChange qui écoute le canal de communication entre Ajax et le serveur et retourne les changements d'état et notamment si une réponse est renvoyée par le serveur.
Quand la propriété readyState est à la valeur 4, Ajax a déjà contacté le serveur Web et se met en attente de sa réponse et si la propriété status est à 200, la réponse tant attendue est en vue.

Code : Tout sélectionner

xhr.onreadystatechange = function() { if(xhr.readyState == 4) { // En attente d'une réponse du serveur if (xhr.status == 200){ // Réponse reçue alert(xhr.responseText); window.status = "Ajax a reçu une réponse du serveur."; } else { // Toujours en attente window.status = "En attente..."; } // fin if 2 }// fin if 1 } // fin de l'écouteur d'états
Cette fonction ne sera bien sûr exécutée qu'après avoir démarrer l'appel d'Ajax au serveur Web par:

Code : Tout sélectionner

// Démarrage de l'appel Ajax xhr.open("GET", "PHP_Jours_Fermeture.php", true); xhr.send(null);
La méthode Open construit l'entête HTTP d'appel, elle précise l'url du serveur, la méthode de postage (GET ou POST) et le mode de communication (TRUE = communication asynchrone ou FALSE = communication non asynchrone)
La méthode Send envoie la requête HTTP en passant éventuellement les paramètres de postage. C'est cette méthode qui démarre finalement l'appel Ajax.
Après la méthode Send aucune autre instruction Ajax n'est effective car il est trop tard puisque l'appel est déjà effectué et Ajax bascule en mode écoute du serveur appelé.
Exactement comme si on tape une url dans navigateur, quand on valide l'url, le navigateur appelle le serveur, et reste en attente de sa réponse. Et tant que le serveur n'a pas répondu, le navigateur reste figé.
D'ailleurs c'est tout l'intérêt de l'usage d'Ajax : éviter de figer le navigateur. Le processus Ajax s'occupe en arrière-plan de la communication avec le serveur et de récupérer des données dynamiques alors que le navigateur reste actif pour permettre à l'utilisateur de faire autres choses.

Je pense que c'est cette partie fondamentale du fonctionnement d'Ajax qui manque dans ton script.

Voici le récap:

Code : Tout sélectionner

<script type="text/javascript"> // Tentative de création de l'objet XMLHTTPRequest d'Ajax (XHR) var xhr; try { xhr = new ActiveXObject('Msxml2.XMLHTTP'); } catch (e) { try { xhr = new ActiveXObject('Microsoft.XMLHTTP'); } catch (e2) { try { xhr = new XMLHttpRequest(); } catch (e3) { xhr = false; }//fin try/catch }//fin try/catch } //fin try/catch // Si l'objet XHR est bien construit, programmer alors la fonction qui recevera la réponse Ajax xhr.onreadystatechange = function() { if(xhr.readyState == 4) { if(xhr.status == 200) { // La réponse est prête et reçue alert (xhr.responseText); window.status = "Ajax a reçu une réponse du serveur."; } else { // Sinon, Ajax est toujours en attente de la réponse window.status = "Ajax est en attente d'une réponse du serveur..."; } //fin if status } //fin if readyState }; //fin onReadyStateChange // Démarrage de l'appel Ajax xhr.open("GET", "http://localhost/Ajax/test.php", true); xhr.send(null); </script>
Je rappelle le script PHP (PHP_Jours_Fermeture.php):
<?php
// début de connexion
  $link = mysql_connect('localhost', 'root', 'tsstsstss') or die("Connexion non établie");
  mysql_select_db("Planning", $link) or die("Base de données non ouverte");
  $sql = "SELECT * FROM T_Fermeture LIMIT 0,30";
  $resultat = mysql_query ($sql, $link) or die("Erreur de requête");
  $tab = array();
  // si il y a résultat non vide
  if ($resultat && mysql_num_rows($resultat) >0){
       // parcourir le résultat pour en extraire les enregistrements (lignes)
       while ($row = mysql_fetch_array($resultat)){
           // dans cet exemple, on stocke l'enregistrement lu dans un tableau $tab
           $tab[] = $row;
       }
       // affiche tout le tableau $tab
       print_r($tab);
  }
  // sinon : le résultat est vide
  else echo "Réponse vide!";

// fin de connexion
mysql_close($link);
?> 

par Berzemus » 09 oct. 2008, 23:33

Tu accèdes bien à ta page à travers le serveur ?

http://localhost/chemin/vers/PHP_Jours_Fermeture.php
ou
http://127.0.0.1/chemin/vers/PHP_Jours_Fermeture.php
?

(fait un copier-coller de ton url sinon, qu'on voie)

Essaye avec un fichier le plus simple possible. Tu verras bien. (et regarde la source du fichier, si tu y vois du php, c'est qu'il y a un souci).

Genre:
<?php
// ça tu le vois pas
echo "<p>Mais moi tu me vois!</p>";
$var = "et hop! <br>";
for ($i=0;$i<6;$i++) { echo $var; }
?>

par fitz7689 » 09 oct. 2008, 21:21

j'ai essayé de lancer la requête dans phpmyadmin mais je pense ne pas avoir trouvé la bonne façon de procéder. J'ai finalement lancé une requête sur la table pour m'assurer que la table n'était pas vide (elle ne l'est pas) et que la syntaxe était bonne. PHPmyadmin me donne cette syntaxe :

Code : Tout sélectionner

SELECT `T_Fermeture`.`D_Fermeture` FROM T_Fermeture
lorsque je lance le code avec cette requête (avec ou sans accents) je reprends la même erreur. J'ai la sensation que le code php n'est simplement pas interprété. J'ai essayé de lancer directement la page php (sans passer par la page appelante), firefox me demande si je veux enregistrer la fichier comme s'il ne reconnaissait pas les balises php. J'ai pourtant placé mes pages dans mon répertoire var\www\ Je dois dire que je suis perplexe car j'ai de plus en plus la sensation qu'un truc absolument évident m'échappe.

A priori, si phpmyadmin peut se lancer on peut imaginer que mon install lamp est correctement configurée ou au minimum, qu'il m'est possible de lancer des scripts php. Mon problème est que n'ayant accès à aucun message d'erreur je ne peux même pas deviner d'où vient le problème ou faire une recherche sur le net. C'est dur de désapprendre 12 ans de mauvaises habitudes acquises sous access.

par Berzemus » 07 oct. 2008, 22:36

D'accord, d'accord..

Quant tu testes cette requête dans phpmyadmin:

Code : Tout sélectionner

SELECT * FROM T_Fermeture
(qui devrait marcher, s'il y a du contenu dans T_Fermeture) Inutile d'utiliser le limit, phpmyadmin l'utilise pour ne pas devoir tout afficher sur une même page.

Alors, ça donne des résultats ? Oui ? C'est que le souci est dans le code. Non ? C'est que la table est vide ou qu'elle n'existe pas.

Si c'est dans le code, qu'affiche le code de sadeq ? Il a pris le soin de le rendre assez bavard pour qu'il puisse nous dire ce qui cloche de son côté..

par fitz7689 » 07 oct. 2008, 21:40

Mes biens chers frères,

La requête SQL était en fait un copier coller de ce que me renvoyait phpmyadmin lorsque je visualisais le contenu de la table. J'ai essayé d'enlever les apostrophes sans résultats. J'ai essayé les accents sans résultat. J'ai ensuite décidé qu'il était plus sage de carrément copier l'intégralité du code proposé en substituant le mot de passe. J'ai revérifié login et mots de passe étaient corrects, que les prises étaient branchées, que les plombs n'avaient pas sauté et que ma soeur battait le beurre. J'obtiens encore et toujours le même message d'erreur. Je vous propose donc de vous recueillir avec moi autours de ce qui ne sera bientôt plus qu'un minuscule tas de cendre s'il me sort pas cette foutu requête pask'on est trois, kilé tout seul et qu'on a l'arrogance discrète quand on mesure 40 centimêtres de haut !!!!!!!!!!!!!

par sadeq » 07 oct. 2008, 12:43

Le code php doit être :
<?php
// début de connexion
  $link = mysql_connect('localhost', 'root', 'tsstsstss') or die("Connexion non établie");
  mysql_select_db("Planning", $link) or die("Base de données non ouverte");
  $sql = "SELECT * FROM T_Fermeture LIMIT 0,30";
  $resultat = mysql_query ($sql, $link) or die("Erreur de requête");
  $tab = array();
  // si il y a résultat non vide
  if ($resultat && mysql_num_rows($resultat) >0){
       // parcourir le résultat pour en extraire les enregistrements (lignes)
       while ($row = mysql_fetch_array($resultat)){
           // dans cet exemple, on stocke l'enregistrement lu dans un tableau $tab
           $tab[] = $row;
       }
       // affiche tout le tableau $tab
       print_r($tab);
  }
  // sinon : le résultat est vide
  else echo "Réponse vide!";

// fin de connexion
mysql_close($link);
?> 

par Berzemus » 07 oct. 2008, 10:28

Lors d'un pèlerinage en Alaska, ou un moine tibétain m'a enseigné quelque particularités du langage SQL, j'ai aussi du mettre ma tête dans un sac en papier. C'était plutôt son conseil pour éviter de se mouiller les cheveux, mais le principe était le même. D'autant que ça marchait pas. Un sac en papier sous une chute d'eau, ça craint.

En changeant de religion, tu aurais pu t'apercevoir de quelques aspects persistants, a travers les religions et les ages. C'était un savoir inquantifiable mais absolu, le cœur de toute croyance, qui te poursuivait à travers les poulets, les cierges et des incantations. C'était la parole de Michael Widenius lui-même qui tentait de venir à toi. Il à échoué, mais me voilà.

Regarde bien ta requête:

Code : Tout sélectionner

SELECT * FROM 'T_Fermeture' LIMIT 0 , 30
L'as-tu essayé sous phpmyadmin ? As-tu fais un dump des résultats (avec print_r plutôt qu'avec echo) ? (il s'agit de quelques trucs pour voir vraiment ce qui se passe dans le code. C'est un bon réflexe, car souvent, l'erreur est si insidieuse que la seule façon de le trouver c'est de rendre le code très bavard).

En fait, l'apostrophe ' délimite un texte dans une requête. SQL interprète donc T_Fermeture comme du texte, plutôt que comme le nom d'une table. Pour délimiter le nom d'une table (qui n'est utile que si, pour des raisons historiques, les noms de tables contiennent des caractères exotiques ou sont des mots clés du langage SQL), on utilise l'accent ` (grave ou aigu, sacrifie un âne le jour ou la lune apparaitra trois fois entre 12H et 5h35 pour connaitre la réponse).

Donc, ta requête devrait plutôt ressembler à ceci:

Code : Tout sélectionner

SELECT * FROM `T_Fermeture` LIMIT 0 , 30

par fitz7689 » 07 oct. 2008, 09:26

fichtre, c'est si grave que ça docteur. Ce silence ne me dit rien qui vaille. Dois-je préparer des funérailles ?

par fitz7689 » 04 oct. 2008, 16:31

Bonjour,

voici les dernières nouvelles du front. Suivant ton conseil je me suis documenté. Après avoir enfouie ma tête dans un sac en papier pour masquer ma honte au reste du monde, je me suis documenté sur mysql_fetch_array. J'ai alors réécrit le script php comme suit :
<?php

  $link = mysql_connect('localhost', 'root', 'tsstsstss');
  mysql_select_db("Planning");
  $sql = "SELECT * FROM 'T_Fermeture' LIMIT 0 , 30 ";
  $resultat = mysql_query ($sql);
  for($i=0;$i<mysql_num_rows($resultat);$i++){
	$tab= mysql_fetch_array($resultat);
  }
  echo $tab[0];
?>
La console d'erreur de firefox me retourne : "aucun élément trouvé" en surlignant vers "?<" lorsque je veux vérifier la source. j'ai également essayé avec $tab[1]. J'ai revérifié que la table comportait des champs, contrôlé autant que je pouvais la syntaxe, placé des cierges autours de l'écran, récité des incantations, changé 7 fois de religions, sacrifié un poulet et lancé trois dés six pour réduire le PV de l'ordi. [/php]

par Berzemus » 03 oct. 2008, 09:36

Au fait, maintenant que je scrute un peu plus loin.

ça:
$resultat = mysql_query ($sql); 
ça marche pas. Essaie un echo sur $résultat, tu verras. C'est un pointeur vers un résultat, pas un résultat en tant que tel.

regarde la doc de fonctions telles que mysql_fetch_assoc() et associés.

par fitz7689 » 03 oct. 2008, 00:01

Un accès direct au fichier me donne le message prévu ("bidibulle"). Par contre, dès que j'essaie la conversion du résultat de la requête au format json j'obtiens un peu moins que pas grand chose.