IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AJAX Discussion :

[AJAX] Retour ResponseText sur plusieurs lignes


Sujet :

AJAX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Par défaut [AJAX] Retour ResponseText sur plusieurs lignes
    Bonjour,

    Je tourne en rond... mais peut-être ce problème est-il dû à un bug des headers php (ça me permettrait de croire que je n'ai pas fait de boulette) :

    Voilà le problème que je voudrais vous faire partager :
    Le retour ResponseText du serveur vers le client est effectué sur plusieurs lignes alors que je n'envoie qu'un texte "Ok" ou "Fail". Donc ma fonction de callback ne sait pas détecter correctement (sauf si je bidouille le ResponseText évidemment) le retour serveur.
    Voilà les étapes suivies par le code (je ne peux pas balancer le code, il y a des milliers de lignes) :
    1) Client (JS): function createNewSupplier(event): appelle la requête ajax "request(...)" ci-dessous,
    2) Client (JS): function request(oSelect, callback, xhr_file, parameters)
    qui envoie une requete vers xhr_create_new_supplier.php
    qui demande callback(xhr.responseText, balise) = xhrReturn(oText, balise_active)
    3) Serveur (PHP): xhr_create_new_supplier.php: c'est lui qui produit la réponse serveur au format text/plain... sur plusieurs lignes.
    4) Client (JS): function xhrReturn(oText, balise_active): c'est lui qui récupère ResponseText renvoyé par le serveur.
    Côté client, tout va bien entre guillemets, dans le sens où le retour ResponseText est (hélas) complètement conforme à ce qu'envoie le serveur.

    J'ai effectué les vérifications suivantes côté serveur :
    1) xhr_create_new_supplier.php:
    il n'y a qu'un seul "echo" en fin de code qui émet juste un "Ok" ou un "Fail". L'entête est bien un header("Content-Type: text/plain");
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    ... fin du code ...
     
    // *************************************
    // RETOUR INFOS PHP VERS JS (SERVER VERS CLIENT)
    // *************************************
     
    	header("Content-Type: text/plain");
     
    	if ($securite && empty($_SESSION['ERROR']) ) {
    		echo "Ok";
    	}
    	else{
    		echo "FAIL";
    	}
    2) Code généré par xhr_create_new_supplier.php:
    - l'entête retournée est bien conforme à la déclaration php : text/plain
    - Le contenu html est seulement : Ok ou Fail, mais placé entre deux balises <pre> , ajoutées par je ne sais quel miracle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html><head></head><body><pre>FAIL</pre></body></html>
    3) Essai avec un header html: Si je remplace le header text/plain par un text/html, les balises <pre> disparaissent par magie, et là ça ne fonctionne pas non plus: le client récupère aussi une vingtaine de lignes vides. [edit: 23 lignes excatement..., je devais compter 23 echo qq part... mais non, y en a pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <html><head></head><body>FAIL</body></html>
    Donc la question :
    - La déclaration (émise côté serveur via php) header("Content-Type: text/plain");
    ajoute-elle des lignes vides par magie ou bien lit-elle des "echo" virtuels ou qui seraient placés entre commentaires ?

  2. #2
    Membre chevronné
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Par défaut
    En petite remarque:

    Bien sûr, si je vire (côté client) les espaces ajoutés par magie (côté serveur), ça fonctionne, mais c'est un mode dégradé : J'aimerai vraiment comprendre ce problème de header.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function xhrReturn(oText, balise_active) {
     
    	// Virer les espaces ajoutés par le serveur
    	oText = oText.replace(/\s/g, '');
     
    	if (oText == "Ok") {
    		// Mise à jour de la liste <select> des masters
    			alert('Ok: data added to dB');
    			return true;
    	}
    	else {
    		alert('NOT added to dB' + '\nDEBUG:\n' + oText);
    		return false;
    	}
    }

  3. #3
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Bonjour,
    non, les headers ne modifient pas la réponse (le contenu du responseText).

    Tu ne devrais même pas avoir les tag HTML si tu ne les ajoutes pas explicitement
    Tu ne devrait recevoir que "OK" ou "FAIL".
    Au pire, pour les retour chariots, tu pourrais avoir un problème lié aux différences Linux/Windows mais ça ne générerait pas plus d'un saut de ligne ...

    Y a un truc de louche ...

    Tu dois louper une partie du traitement PHP (un include dans tes pages, un paramétrage de ton serveur ...)

    A+

  4. #4
    Membre chevronné
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Par défaut
    Salut


    Je n'ajoute pas les tags html. C'est bien ce qui m'étonne dans le code généré (Firebug). Par contre, j'ouvre et ferme les balises php dans chaque code. Cela peut il être une raison ?

    J'effectue d'autres requêtes Ajax (soit avec un responseText, soit avec du XML selon les besoins) que celle-ci sur le même serveur et elles ne génèrent pas ce problème - même en vérifiant le code généré (j'ai bien le texte sans les lignes ajoutées *) - , donc j'aurais tendance à évacuer un problème de config serveur.

    Restent effectivement les includes et les classes en autoload (SPL) en début du code php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	include("config.php"); //  definition des constantes, pas d'echo
    	require_once("../../lib/fonctions_securite.php"); // deux fonctions avec qq "echo" affichés uniquement si probleme(s) de session et un pop js
    	require_once("../../lib/fonction_classes.php"); // Aucun echo ds le code
    	spl_autoload_register ('LoadPHPClass');
    Et les classes qui se chargent lors de leur instanciation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	// PDO Connexion db
    		if ($securite) {
    			try {
    				$connect = PDO2::getInstance();
    				$pdo = new PDO3($connect);
    			}
    			catch (PDOException $e) {
    				$_SESSION['ERROR'] .= ERR_41 .': ' .$e->getMessage().'<br/>';
    				$securite = false;
    			}
    		}
    Une petite recherche avec notepad ne me donne pas grand chose de probant. Il y a bien qq "echo" mais tous sont sous condition, avec un affichage seulement en cas de problème détecté. Et je n'ai pas vu de problème de connection (classes PDO) ou dans mes fonctions "securite.php".

    Je me suis aussi demandé s'il n'y avait pas un error_reporting un peu ambitieux qui me balancerait des warning ou des Notice, mais non rien, je suis bien en errror_reporting(NULL). Le serveur est sous Linux. (pas de wamp ou easyphp sous windows, par contre le client, si)

    Peut-être essayer avec un client sous Linux/Ubuntu.. faudrait juste que je le connecte sur mon sous réseau en tant qu'admin avec la bonne IP etc.. mais je ne crois pas trop à cette piste, puisque le client sous Windows reçoit correctement d'autres retours du même serveur. Donc le problème doit bien se trouver spécifiquement à la source serveur dans CE code là.

    Sauf que je ne trouve rien donc je n'y comprends plus rien...

  5. #5
    Expert éminent

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13 474
    Par défaut
    Comment détectes-tu ces retours chariots ?
    Dans une alert() ?
    Dans un innerHTML ?
    ...

    As-tu vérifié quels étaient les codes ASCII des caractères parasites ?

    A+

  6. #6
    Membre chevronné
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Par défaut
    Voila comment j'ai procédé :

    Après débuggage du code côté serveur, je me suis aperçu que le client ne voyait pas le retour "ok" même quand il aurait dû, en lui envoyant les mêmes paramètres d'entrée que ceux utilisés en mode debug du code côté serveur.

    => j'ai commencé par visualiser ce retour côté client par un alert, et là j'ai vu mon responseText mais après une vingtaine de lignes, en bas de la pop up "alert".

    => Je suis allé voir ce qui se passait côté serveur, et effectivement, en exécutant le code serveur directement sur le browser, le texte de retour s'affiche bien après une vingtaine de lignes. (Toujours avec mon header text/plain).

    => J'ai demandé le code généré, et là j'ai vu les balises <html> et <pre>, mais pas de code retour chariot (pas de <br/> ni de "\r\n", rien à part des lignes vides).

    Y a t il une manip pour cela sous Firebug ?

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/10/2017, 10h17
  2. Réponses: 1
    Dernier message: 07/03/2008, 12h42
  3. Réponses: 2
    Dernier message: 10/05/2004, 07h55
  4. TDBGrid - Un enregistrement sur plusieurs lignes
    Par BRODU dans le forum Bases de données
    Réponses: 2
    Dernier message: 09/05/2004, 07h53
  5. Define sur plusieurs lignes
    Par Gogoye dans le forum C
    Réponses: 6
    Dernier message: 06/10/2003, 11h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo