2015-12-11 1 views
0

J'ai récemment mis mon serveur dev de PHP 5.4 à PHP 5.6 et j'ai une erreur étrange en essayant de le tester. Tout mon code PHP renvoie des données sous forme de tableau ou de chaîne via ma vue principale, qui utilise le code suivant pour renvoyer les données en tant que JSON à toute requête Ajax. (J'ai désactivé le type MIME à des fins de test)Jquery.Ajax ajoute des guillemets et une nouvelle ligne à ma réponse JSON

public static function SendData($data) 
{ 
    $response = array(
     'status' => true, 
     'message' => $data 
    ); 
    //header('Content-type: application/json'); 
    exit(json_encode($response, JSON_HEX_APOS)); 
} 

De que mon code Javascript utilise ces données, normalement parse immédiatement à JSON car le type MIME indique JQuery de le faire et le traiter. Il a fonctionné fin en PHP 5.4, mais depuis que j'ai mis à jour, ma réponse est modifiée par Jquery. En regardant la Reponse du serveur dans Firebug, je vois qu'il est JSON valide (testé avec JSONlint)

{"status":true,"message":"Didier Tartempion|[email protected]|Gestion de commerce"} 

Mais quand je vérifie le code Jquery suivant dans Firebug

$.ajax({ 
     url:"Connect.php", 
     type : 'POST', 
     data : data, 
     success:function(result) 
     { 
      //JSON processing, for now I debugg with 
      alert (result); 
     }, 
     error: function(qXHR, textStatus, errorThrown) 
     { 
      alert(textStatus); 
     } 
}); 

La variable de résultat dans le succès contient en fait ma réponse étrangement formaté, il ressemble à ceci lorsque vous utilisez montre firebug:

"\n{"status":true,"message":"Didier Tartempion|[email protected]|Gestion de commerce"}" 

En tant que tel, JQuery ne peut pas analyser cela et JSONlint dit que ce n'est pas valide. Y at-il quelque chose de PHP5.6 de peut-être même le nouveau serveur qui pourrait causer ce comportement étrange?

Merci

+1

vous devez définir le dataType dans votre ajax sinon le résultat retourné serait un texte brut. dataType = 'json' – DinoMyte

+0

Ne devrait pas l'en-tête ('Content-type: application/json'); " fait le travail? De toute façon, j'ai essayé avec les deux et je reçois toujours une erreur d'analyse puisque le JSON JSON n'est pas valide tant que ma réponse est. – GPierre

Répondre

0

J'ai demandé à l'un des programmeurs expérimentés où je travaillais et il m'a suggéré d'enregistrer en hexadécimal si un caractère caché était ajouté à la réponse. lors de la conversion en hexadécimal en PHP, aucun caractère caché n'a été trouvé, mais un est apparu en essayant d'alerter dans JS.

J'ajouté ce code à ma fonction de succès

function toHex(str) { 
        var hex = ''; 
        for(var i=0;i<str.length;i++) { 
          hex += ''+str.charCodeAt(i).toString(16); 
        } 
        return hex; 
      } 

      alert(toHex(result)); 

et je remarquai que le caractère hexagonal « feff » ont été ajoutés dans le nouveau serveur. En regardant à travers l'Internet, j'ai découvert que c'est le caractère BOM pour remarquer le navigateur que le fichier est encodé. J'ai dû utiliser ce small PHP script et l'exécuter sur le serveur pour se débarrasser de l'erreur.

Apparemment, des choses de ce genre se produisent lorsque vous ouvrez le fichier dans le bloc-notes ++ par exemple et le sauvegardez, cela peut gâcher l'encodage.

0

écho juste les données

echo json_encode($response, JSON_HEX_APOS); 
+0

echo ajoute en fait un autre \ n à la fin de la chaîne JSON reçue par Jquery.Je deviens: '" \ n {"état": vrai, "message": "Didier Tartempion|[email protected]|Gestion de commerce"} \ n "' – GPierre

+0

avec l'en-tête ajouté? – madalinivascu

+0

Oui, avec l'en-tête mon code JS entre dans la fonction d'erreur et alerte "parseError", en utilisant une montre sur l'erreur lancée, je vois la même chaîne – GPierre

0

Je vous suggère d'utiliser return au lieu de exit

public static function SendData($data) 
{ 
    $response = array(
     'status' => true, 
     'message' => $data 
    ); 
    //header('Content-type: application/json'); 
    return json_encode($response, JSON_HEX_APOS); 
} 

Dans votre ajouter appel ajax dataType et ajoutez console.log()

$.ajax({ 
     url:"Connect.php", 
     type : 'POST', 
     data : data, 
     dataType : 'json' 
     success:function(result) 
     { 
      //JSON processing, for now I debugg with 
      console.log(result); 
     }, 
     error: function(qXHR, textStatus, errorThrown) 
     { 
      console.log(textStatus); 
     } 
}); 

Inspectez et vérifiez la console de votre navigateur après avoir reçu une réponse. Tout votre problème a été résolu.

+0

Retour ne renvoie rien à l'appel Ajax, exit ou echo fait, mais il ajoute les guillemets doubles et le \ n – GPierre