2009-07-22 7 views
1

J'utilise Kohana PHP Framework pour une application. Maintenant, je rencontre un problème, quand jQuery fait une requête AJAX à un certain fichier, cela fonctionne, mais quand ce fichier lance une exception PHP, jQuery échoue et n'affiche pas la sortie du fichier.La requête jQuery AJAX échoue sur l'exception PHP

Un petit exemple, c'est le morceau de Javascript:

$.post($('#' + e.currentTarget.id).attr('action'), $('#' + e.currentTarget.id).serialize(), function (data) 
{ 
    alert (data); 
}/*, 'json' */); 

Maintenant, cela fonctionne lorsque le fichier PHP que cela (la zone d'alerte apparaît):

<?php echo 'Test'; ?> 

Mais quand quelque part dans le fichier PHP cela se produit:

<?php throw new Exception ('Test'); ?> 

jQuery échoue et ne montre pas l'erreur HTML émis, un LSO il y a une différence dans les en-têtes de PHP (généré par PHP?):

Avec l'écho PHP (bien):

. Connection:Keep-Alive 
. Content-Encoding:gzip 
. Content-Length:544 
. Content-Type:text/html; charset=UTF-8 
. Date:Wed, 22 Jul 2009 14:22:43 GMT 
. Keep-Alive:timeout=15, max=100 
. Server:Apache/2.0.59 (Unix) PHP/5.2.6 DAV/2 
. Vary:Accept-Encoding 
. X-Powered-By:PHP/5.2.6 

À l'exception de PHP (échec):

. Connection:close 
. Content-Encoding:gzip 
. Content-Length:1896 
. Content-Type:text/html; charset=UTF-8 
. Date:Wed, 22 Jul 2009 14:23:11 GMT 
. Server:Apache/2.0.59 (Unix) PHP/5.2.6 DAV/2 
. Vary:Accept-Encoding 
. X-Powered-By:PHP/5.2.6 

maintenant Je ne vois pas vraiment de problème, à la fois en PHP et en HTML. Quelqu'un a déjà eu ce problème, et comment avez-vous résolu cela?

Merci pour l'aide!

+0

Quel est votre niveau error_reporting fixé à PHP?Si ce n'est pas configuré pour afficher des exceptions (bien que cela devrait être le cas), vous ne verrez aucune sortie. – inkedmn

+0

Il affiche des erreurs, lorsqu'une exception est levée, il affichera toute la trace (HTML) en tant que message d'erreur. Et si PHP ne montre pas d'erreurs (ce qu'il fait), Javascript vu de manière logique devrait apparaître une boîte d'alerte vide? – Stefan

Répondre

2

Pour afficher l'erreur, vous pouvez le faire dans votre appel ajax. Cela devrait vous alerter avec le même code html que lancer une exception PHP vous donnerait sur une page normale.

+0

Ce travail, toute personne ayant ce problème, voir le code que j'ai posté ci-dessous, merci! – Stefan

1

Si vous souhaitez conserver le niveau actuel de signalement des erreurs, mais que vous envoyez un message d'erreur à jQuery, vous pouvez envelopper votre code dans un bloc try-catch.

try { 
    // your code 
} catch(Exception $e) { 
    echo $e->getMessage(); // formatted nicely or a generic message or something. 
} 
+0

Je suppose que Kohana le fait de cette façon, lorsqu'une exception se produit, Kohana retournera le backtrace entier comme message d'erreur (HTML). Seuls les en-têtes diffèrent. – Stefan

+0

Même si vous le faites vous-même, il se peut qu'il ne fasse pas de bulles jusqu'au sommet et que Kohana change les en-têtes? Juste jeter ça là-bas. –

0

+1 avec Brian. Si vous voulez connaître la cause, le voici: jQuery s'attend à recevoir des données JSON. Lorsque PHP affiche son erreur, il sort du HTML et du texte brut non inclus entre guillemets, et ce n'est pas un JSON valide, donc jQuery échoue. Si vous commentez le paramètre 'json', alors si rien ne se passe, c'est parce que votre serveur a envoyé un code de statut représentant une erreur (tout code de statut> 500). Si vous pouviez nous fournir cette information, ce serait bien.

+0

Mais quand JSON est mis en commentaire (comme dans mon exemple et la version live), il afficherait simplement la sortie HTML entière? – Stefan

+0

Il devrait, à moins que votre serveur envoie un code de statut 500. – FWH

0

Je vous encourage à essayer l'addon Firebug pour Firefox. Firebug vous permettra facilement de regarder la requête AJAX et de voir quelles données sont retournées par votre application.

+0

Je vais chercher ça en cas de nouveaux problèmes, Firefox est lent sur Mac, dommage pour certains plugins pratiques – Stefan

0

Comme certains l'ont déjà deviné, le gestionnaire d'exceptions par défaut de Kohana définit l'état de réponse HTTP sur "500 Internal Server Error". Si vous voulez renvoyer des erreurs à votre JavaScript, vous devrez saisir les exceptions et les messages d'erreur de sortie manuellement.

+0

C'était le problème après tout, oui – Stefan

0

Solution grâce à goreckm:

$.ajax({ 
    type : 'POST', 
    url  : $('#' + e.currentTarget.id).attr('action'), // http://www.... 
    dataType: 'json', 
    data : $('#' + e.currentTarget.id).serialize(), // Data to be sent 
    success : function (data) 
    { 
     alert (data); 
    }, 
    error : function (ajax_response) 
    { 
     alert (ajax_response.responseText); 
    } 
}); 
Questions connexes