SyntaxError: JSON.analyser: inattendu caractère non-blanc après les données JSON
J'ai le texte suivant appel AJAX:
$('#FonykerUsernameRegister').blur(function(){
if($(this).val().length > 2) {
alert($(this).val());
$.ajax({
url: '<?php echo $html->url('/fonykers/validate_username',true); ?>' + '/' + $(this).val(),
dataType: 'json',
type: 'POST',
success: function(response) {
if(!response.ok) {
$(this).addClass('error');
error.html(response.msg);
error.fadeIn();
} else {
if($(this).is('.error')) {
alert('im in');
$(this).removeClass('error');
}
$(this).addClass('ok');
}
},
error:function (xhr, ajaxOptions, thrownError){
alert('You fail');
alert(xhr.statusText);
alert(thrownError);
}
});
} else {
error.html('Username must have at least 3 characters');
error.fadeIn();
$(this).addClass('error');
}
});
Et c'est la méthode qu'il appelle:
function validate_username($username) {
$this->layout = 'ajax';
$response = array();
$fonyker = $this->Fonyker->find('first', array(
'conditions' => array('Fonyker.username' => $username)
));
if(!strlen($username) > 2) {
$response = json_encode(array('ok' => false, 'msg' => 'Username must have at least 3 characters'));
} else if(!preg_match('"^[a-zA-Z0-9]+$"', $username)) {
$response = json_encode(array('ok' => false, 'msg' => 'Username must be alphanumeric'));
} else if ($fonyker) {
$response = json_encode(array('ok' => false, 'msg' => 'Username is already in use'));
} else {
$response = json_encode(array('ok' => true, 'msg' => ''));
}
echo $response;
}
Dans l'appel AJAX, il va toujours de l'erreur de la partie et les sorties d'erreur, et je ne vois pas d'url dans mon code PHP. Toutes les pensées?
EDIT:
Ce qui se passait, c'est que CakePHP était en écho à la vue d'ensemble de la réponse, mais pas vraiment du point de vue, mais l'écran d'erreur.
Si vous avez besoin de méthodes AJAX dans votre contrôleur qui ne nécessitent pas de vue que vous devez définir la $this->autoRender
bien sur la méthode de contrôleur de false
avant de faire quoi que ce soit.
- l'erreur est d'un caractère non-blanc, pas un caractère d'espacement. Aussi, pourriez-vous poster la résultante du json? Utiliser Firebug (ou similaire) pour observer la réponse.
- En regardant la réponse je vois que le gâteau est de renvoyer l'intégralité de la page HTML avec la réponse JSON, parce qu'il dit qu'il nécessite un point de vue.
- Vous ne devriez pas être l'écho des choses à partir de votre contrôleur de méthode. C'est ce que les vues sont pour. La façon techniquement correcte de cette approche serait de définir une variable de réponse ici, et l'écho dans la vue. C'est un peu fastidieux de créer un nouveau fichier à echo, une ligne, de sorte que vous pouvez également return $réponse à partir de cette méthode et vous aurez la réponse à votre appel ajax. Les deux sont préférables à résonner dans un contrôleur de méthode je pense.
Vous devez vous connecter pour publier un commentaire.
Basé sur des OP commentaire réponse:
Bien que je ne suis pas spécialement familier avec CakePHP manière de faire, lors de l'utilisation de ZendApplication, l'une des premières choses à faire est de faire un layout vide. Normal réponses sont placés dans la mise en page par défaut, tandis que les réponses ajax sont placés dans le vide de mise en page.
Dans votre contrôleur de méthodes, de définir
$this->layout
à votre layout vide pour remplacer la valeur par défaut le cas échéant.Voir http://www.balistupa.com/blog/2009/07/how-to-change-cakephp-layout/ pour des instructions plus spécifiques
Il peut y avoir eu un écho dans votre fonction ajax. Le vérifier et de supprimer toute echo, print, débogage à partir de la fonction ajax.
Lorsque vous revenez de données json, vous ne pouvez pas l'écho de quoi que ce soit.
Avez-vous vérifier ajax.ctp fichier dans le dossier mises à l'intérieur de la vue de dossier?
Lors de l'utilisation de ColdFusion pour le développement, veillez à activer le débogage HORS tension ou bien il peut causer ce problème
Votre client/appel ajax s'attend à un type de données JSON à partir du serveur. Maintenant, vous devez vous assurer que le serveur retourne un type de données JSON, d'autre changement de la demande à la demande, pour indiquer que le service est de retour.
Pour étudier cette question, utiliser firebug pour voir ce que vous avez trouvé comme réponse.
Je viens de recevoir ce message d'erreur et je l'ai corrigé.
j'ai eu le même problème, mais j'ai résolu avec "$this->autoRender = false;" dans la fonction!