8791 sujets

Développement web côté serveur, CMS

Pages :
Bonjour à tous,

J'ai un formulaire de contact avec un petit système de captcha du type 3+5 = ?

Ce formulaire vérifie les données saisies avant l'envoi en JS et si tout est ok alors validation de l'envoie en ajax. Le souci c'est comment est-ce que je peux faire pour vérifier en ajax mon input qui sert à la saisie du captcha sachant que cela doit être comparé à une variable stocké en session?

Voila mon code:

La génération des nombres aléatoires en début de page
<?php
session_name("contactform");
session_start();
$_SESSION['n1'] = rand(1,20);
$_SESSION['n2'] = rand(1,20);
$_SESSION['expect'] = $_SESSION['n1']+$_SESSION['n2'];
?>
<!doctype html>


La partie captcha du formulaire (site crée à partir de Foundation 4)
<div class="row">
    <div class="columns large-6 small-12">
        <div class="row">
            <div class="columns large-8"><span class="left">Un petit test <?=$_SESSION['n1']?> + <?=$_SESSION['n2']?> =</span></div>
                <div class="columns large-4">
                    <input type="text" name="captcha" id="captcha" maxlength="10" onblur="verifCaptcha(this);" placeholder="Captcha" required/>
                    <span id="msg_captcha"></span>
                </div>
            </div>
        </div>
    </div>
</div>


Le script ajax suite au onBlur
function verifCaptcha(champ){
    dataString = $("#contact").serialize();
    $.ajax({
        type : "POST",
        url: "php/captcha.php",
        data: dataString,
        dataType: "json",
        success: function(data) {
                    if(data.captcha_check == "invalid"){
                        $('#msg_captcha').html("<p>Ok</p>");
            } else {
                        $('#msg_captcha').html("<p>Mauvais calcul?</p>");
            }
        }
    });
}


Le fichier captcha.php pour tester en ajax si la valeur saisie par l'utilisateur est bonne
<?php
    session_start();
    $captcha_check = '';
    if((int)$_POST['captcha'] == $_SESSION['expect']){
        $captcha_check = 'valid';
    }else{
        $captcha_check = 'invalid';
    }
    $return_json = '{"captcha_check":"' . $captcha_check . '",';
?>


Voila un petit aperçu du formulaire
upload/43992-contact-fo.png

Mon soucis c'est la récupération de la valeur de $_SESSION['expect'] en plus de $_POST['captcha'] afin de transmettre les deux variables en ajax.

Est-ce que quelqu'un aurait une idée de la façon de procéder?

Merci d'avance
Est-ce que ça veut dire qu'actuellement ce code ne fonctionne pas ? Pourtant, ça m'a l'air de tenir la route...
Le problème se situerait dans captcha.php ? Pourtant, dans la mesure où tu fais un session_start(), je suppose que tu n'as pas de problème pour récupérer ta variable de session ?
En fait, la seule chose qui m'intrigue dans ton code, ça n'a rien à voir avec la variable de session, désolé ! Cette ligne :
$return_json = '{"captcha_check":"' . $captcha_check . '",';

T'as coupé un bout de code pour simplifier, ou bien il manque vraiment l'accolade fermante de ton JSON ?
Bonsoir et merci pour ta réponse Smiley cligne

Non, c'est un oubli de ma part, c'est sur ça ira un peu mieux comme ça:
<?php
    session_start();
    $captcha_check = '';
    if((int)$_POST['captcha'] == $_SESSION['expect']){
        $captcha_check = 'valid';
    }else{
        $captcha_check = 'invalid';
    }
    $return_json = '{"captcha_check":"' . $captcha_check . '"},';
?>


et idem, en relisant mon code j'ai inversé les messages de réussite/échec:
function verifCaptcha(champ){
	dataString = $("#contact").serialize();
	$.ajax({
		type : "POST",
		url: "php/captcha.php",
		data: dataString,
		dataType: "json",
		success: function(data) {
			if(data.captcha_check == "invalid"){
				$('#msg_captcha').html("<p>Mauvais Calcul?</p>");
			}else{
				$('#msg_captcha').html("<p>Ok</p>");
			}
		}
	});
}


Si je regarde dans la console de développement j'ai bien mon post vers le fichier captcha.php, mais ..... toujours rien Smiley bawling
Excuse-moi si je suis long à la comprenure, mais...
- Ton problème est-il bien au niveau de $_SESSION['expect'] dans captcha.php ? Quelle valeur t'est renvoyée ?
- Il y a encore, je pense, un souci dans ton JSON avec la virgule finale. Des fois que, tu peux aussi utiliser la fonction PHP "json_encode"...
Un petit echo $return_json à la fin de ton fichier php, ça pourrait être utile, je pense ^^ Smiley ravi (et ôte la virgule après l'accolade dans le json ^^)

Après, le plus simple, ça reste de faire une variable $retour en tableau et de echo json_encode($retour) à la fin de ton script php ^^ (le echo sert à ce que le javascript sache que tu lui retournes un truc)


Et il me semble dans le javascript que c'est plutôt data['captcha_check'] que data.captcha_check. En spécifiant JSON dans la fonction $.(ajax), tu as demandé au javascript de décoder le json qui était renvoyé et il le traite automatiquement en tableau.
Modifié par Lothindil (19 Sep 2013 - 16:54)
Bonjour à tous les 2,

T'excuses pas petibato, je suis déjà content qu'on me réponde et que l'on prenne le temps de m'aider. Je vais donc pas me plaindre Smiley cligne

Merci aussi à toi Lothindil, j'ai fait tes modifications et j'ai donc ceci:
<?php
    session_start();
    $captcha_check = '';
    if((int)$_POST['captcha'] == $_SESSION['expect']){
        $captcha_check = 'valid';
    }else{
        $captcha_check = 'invalid';
    }
    $return_json = '{"captcha_check":"' . $captcha_check . '"}';
	echo $return_json;
?>


Ce qui est bizarre c'est que j'ai maintenant 2 envoies en ajax dès que je quitte mon input. Le premier à gauche du screenshot avec seulement l'envoi des données en sessions (mais pas le "expect") et le deuxième avec en plus les données du formulaire. Pour info, il y a un champ en display:none nommé "url", c'est un conseil que l'on m'a donné un jour pour éviter les spams (je fais un test dans le php d'envoi de mail, champ rempli -> erreur, champ vide ->envoie mail), qu'en pensez-vous c'est vraiment utile?

upload/43992-erreur.jpg

Sinon, j'ai aussi tenté avec if(data['captcha_check'] == "invalid"){ mais toujours rien...

Merci pour votre aide Smiley smile
Modifié par maxredphenix (19 Sep 2013 - 18:12)
Pour le doublon, ça doit être un problème avec le onblur... Personnellement, j'aurais plutôt mis le test de captcha au moment de l'envoie du formulaire, parmi les tests du formulaire.

Sinon pour le php, (int) n'existe pas ^^ La fonction pour changer une chaîne en chiffre, c'est intval().


Sinon, à la base, quand je teste un ajax avec JSON (et ça m'arrive fréquemment), je teste toujours en 3 étapes :
- données d'envoi du javascript (grâce à un alert) pour m'assurer que ce qu'envoie le javascript au php correspond bien à ce que j'attends.
- le fichier php séparément (en forçant $_POST[])
- la partie réaction du javascript.

Donc dans ton cas, je testerais d'abord le script :
function verifCaptcha(champ){
	dataString = $("#contact").serialize();
	alert(dataString);
}


Qui devrait te donner plein de choses avec entre autre Captcha=21

Ensuite le fichier PHP écrit ainsi :
<?php
    session_start();
    $_POST['captcha']= /*test 1 avec la bonne valeur; test 2 avec une autre; test 3 avec un type de valeur non prévu genre "blabla"*/
    $captcha_check = '';
    if(intval($_POST['captcha']) == $_SESSION['expect']){
        $captcha_check = 'valid';
    }else{
        $captcha_check = 'invalid';
    }
    $return_json = '{"captcha_check":"' . $captcha_check . '"}';
    echo $return_json;
?>


Ce test devrait te retourner {"captcha_check" : valid} puis sur les 2 autres test {"captcha_check" : invalid}.

Attention, ça doit te retourne ça et ABSOLUMENT rien d'autres, ni un warning, ni espace, ni un autre caractère (espace compris), ni bien sûr un fatal error.

Ensuite, quand tu es certains que le php retourne bien ce qu'il devrait, tu achèves de tester le javascript, avec le script complet ce coup-ci ^^

Pour la fonction en succes, j'aime pas, ça fait trop de décalage à mon goût, je la sors plutôt de l'ajax (j'ignore si c'est une bonne pratique, mais je sais qu'elle marche), ce qui donnerait ça :


function verifCaptcha(champ){
	dataString = $("#contact").serialize();
            function retour_php(data) 
            {
		/*juste pour le test*/ alert(data['captcha_check']);
		if(data['captcha_check'] == "invalid")
		{
			$('#msg_captcha').html("<p>Mauvais Calcul?</p>");
		}else{
			$('#msg_captcha').html("<p>Ok</p>");
		}
	}
	$.ajax({
		type : "POST",
		url: "php/captcha.php",
		data: dataString,
		dataType: "json",
		success: retour_php
	});
}



Cette technique permet de localiser exactement le problème. Parce que si le soucis est au niveau du PHP, en testant directement via l'ajax, tu ne le sauras jamais (ou plutôt tu avanceras à tâtons ^^)
Modifié par Lothindil (19 Sep 2013 - 18:32)
Une fois que le script va fonctionner, je vais faire comme tu m'as conseillé : le test au submit. Pour le intval, je ne sais pas pourquoi, mais j'étais persuadé que INT existait Smiley decu

Sinon, le premier script me donne ceci (bien sur je n'ai rempli que le champ captcha):
nom=&email=&sujet=&message=&captcha=28&url=

Ensuite si je modifie mon fichier php par ton code, j'obtiens ceci et ceux peut importe la valeur saisie...
upload/43992-erreur.jpg

Par contre j'aime bien le principe de déporter le success, c'est beaucoup plus lisible
Le echo du JSON, bon sang mais c'est bien sûr, bien vu Lothindil !

Ta remarque sur (int) m'a fait une grosse frayeur, mais j'ai été un peu rassuré en lisant ça.
Le champs captcha fait bien partie du formulaire ?

dataString = $("#contact").serialize();
alert(dataString);

Sinon :
dataString = $("#captcha").serialize();
devrait suffire ?
maxredphenix a écrit :
Une fois que le script va fonctionner, je vais faire comme tu m'as conseillé : le test au submit. Pour le intval, je ne sais pas pourquoi, mais j'étais persuadé que INT existait Smiley decu

Sinon, le premier script me donne ceci (bien sur je n'ai rempli que le champ captcha):
nom=&amp;email=&amp;sujet=&amp;message=&amp;captcha=28&amp;url=

Ensuite si je modifie mon fichier php par ton code, j'obtiens ceci et ceux peut importe la valeur saisie...
upload/43992-erreur.jpg

Par contre j'aime bien le principe de déporter le success, c'est beaucoup plus lisible
Non, je parle bien de lancer le fichier php, pas l'ajax qui va lancer le fichier php de ton ajax depuis ton navigateur ^^ (donc captcha.php )



Et pour (int), autant pour moi, on m'a toujours dit que ça marchait pas et qu'il fallait utiliser intval(). Et pour ceux que ça intéresse, la différence se situe dans le traitement des virgules flottantes et intval permet d'utiliser des bases. De plus, pour la base 10, (int) est plus rapide que intval().
Modifié par Lothindil (20 Sep 2013 - 08:21)
Bonsoir tout le monde,

J'ai lancé directement captcha.php et j'obtiens ceci:
upload/43992-erreur.png

Mais tu as dit dans ton autre message (en forçant $_POST[]), la je ne sais pas faire, en GET oui mais POST non

Comment fais-tu?

Merci
Forcer une variable $_POST, ça signifie dans mon langage tout perso lui donner une valeur de force au début de ton fichier.

Un truc genre : $_POST['captcha']=28; juste après le session_start; (pas avant le session_start , il n'aime pas si y a un truc devant).

Et là le message que tu reçois te signifie que $_SESSION['expect'] n'existe pas (ou plutôt que dans le tableau $_SESSION, tu n'as pas la clé "expect".

Donc tente de voir avec var_dump($_SESSION); juste avant l'endroit où tu fais appel à $_SESSION['expect']. Cette fonction va te retourner le contenu et le type de ta variable, ça te permettra de savoir ce qu'elle a dans le ventre.

(mais là comme ça, à vue de nez, je dirais que ton captcha a un soucis et qu'il n'envoie jamais en session la valeur qu'il devrait y avoir)
Modifié par Lothindil (20 Sep 2013 - 23:56)
OK, mais en même temps je suis *** parce que tu avais mis un commentaire :
$_POST['captcha']= /*test 1 avec la bonne valeur; test 2 avec une autre; test 3 avec un type de valeur non prévu genre "blabla"*/

Donc non, ça ne fait rien du tout et ça peut importe la valeur saisie... Smiley decu

Sinon, le var_dump
<?php
session_name("contactform");
session_start();
$_SESSION['n1'] = rand(1,20);
$_SESSION['n2'] = rand(1,20);
$_SESSION['expect'] = $_SESSION['n1']+$_SESSION['n2'];
var_dump($_SESSION);
?>


Donne ceci:
'n1' => int 6
'n2' => int 10
'expect' => int 16


Par contre si je force les 2 valeurs j'ai bien l'ajax qui fonctionne donc ça doit être le $_SESSION['expect' ] le problème.

Je pense que Fly06 doit avoir raison,
dataString = $("#captcha").serialize();
doit largement suffire non?

Encore merci à vous tous et bon week end Smiley cligne
Non, ton serialize permet de transmettre toutes les données du formulaires. Tu peux te limiter à envoyer les données du captcha, ça changera pas grand chose Smiley cligne


Quand je te parlais de faire un var_dump c'était pas là où tu détermines ta session, parce qu'on se doute bien qu'à cet endroit-là c'est correct. C'est là où tu l'utilises.

En gros pour l'instant :

Tu lances une fois ton script de base où il y a le formulaire (idée d'initialiser la session avec les valeurs qu'elle est sensée avoir).

Ensuite, tu lances le fichier captcha.php avec ceci dedans :

<?php
    session_start();
    $_POST['captcha']= /*test 1 avec la bonne valeur; test 2 avec une autre; test 3 avec un type de valeur non prévu genre "blabla"*/
   var_dump($_SESSION); /*Va servir à savoir si la session a bien été crée*/

    $captcha_check = '';
    if(intval($_POST['captcha']) == $_SESSION['expect']){
        $captcha_check = 'valid';
    }else{
        $captcha_check = 'invalid';
    }
    $return_json = '{"captcha_check":"' . $captcha_check . '"}';
    echo $return_json;
?>


Ca va permettre de savoir ce que la session php contient ainsi que si le json est correct.
Je viens de suivre ton conseil et j'obtiens ceci:
upload/43992-erreurdump.png

Donc aucun envoie de la variable en session snif...
Modifié par maxredphenix (22 Sep 2013 - 20:09)
maxredphenix a écrit :

Je pense que Fly06 doit avoir raison,
dataString = $(&quot;#captcha&quot;).serialize();
doit largement suffire non?


Oui, je confirme Smiley langue

Ca devrait résoudre ton problème (côte captcha) si le captcha ne fait pas parti du formulaire (question à laquelle tu n'as pas répondu).

maxredphenix a écrit :
Mon soucis c'est la récupération de la valeur de $_SESSION['expect'] en plus de $_POST['captcha'] afin de transmettre les deux variables en ajax.


La variable $_SESSION['expect'] n'est pas à transmettre au serveur via ajax, elle est stockée physiquement sur le serveur.

Sinon, quand tu testes le captcha depuis le formulaire, il affiche bien une réponse (Ok OU Mauvais calcul) ou il affiche rien ?
J'avais complétement zappé pour les sessions, c'est logique en plus que ce soit côté serveur...

Non avec le test du précédent post de Lothindil il y a rien, sauf si je déclare les 2 variables dans le fichier captcha.php ou là j'ai le message OK ou Mauvais calcul suivant ce que je mets:
<?php
    session_start();
   $_POST['captcha']=5;
   $_SESSION['expect']=5;
    $captcha_check = '';
    if(intval($_POST['captcha']) == $_SESSION['expect']){
        $captcha_check = 'valid';
    }else{
        $captcha_check = 'invalid';
    }
    $return_json = '{"captcha_check":"' . $captcha_check . '"}';
    echo $return_json;
?>



Sinon, voila mon code complet pour la partie formulaire, je pense qu'il y a quelques modifs à faire sur la vérification en javascript (et une fois que la vérification en ajax du captcha va fonctionner, je vais faire comme les autres, changer le background au lieu d'afficher un message)
<!-- CONTACT FORM -->
<div class="full-width wrapper">
<div class="row">
	<div class="columns large-12">
		<form action="php/mail.php" id="contact" method="POST">	
			<div class="row">
				<div class="columns large-12">
					<div class="row">
						<div class="columns large-3"><label for="nom" class="left inline">Nom*</label></div>
						<div class="columns large-9"><input type="text" name="nom" id="nom" maxlength="30" onblur="verifNom(this);" placeholder="Dupont Xavier" required /></div>
					</div>
					<span id="msg_nom"></span>
				</div>
			</div>
			<div class="row">
				<div class="columns large-12">
					<div class="row">
						<div class="columns large-3"><label for="email" class="left inline">Email*</label></div>
						<div class="columns large-9"><input type="text" name="email" id="email" maxlength="30" onblur="verifMail(this)" placeholder="dupont.xavier@gmail.com" required /></div>
					</div>
					<span id="msg_email"></span>
				</div>
			</div>
			<div class="row">
				<div class="columns large-12">
					<div class="row">
						<div class="columns large-3"><label for="sujet" class="left inline">Sujet</label></div>
						<div class="columns large-9"><input type="text" name="sujet" id="sujet" maxlength="40" onblur="verifSujet(this)" placeholder="Information" /></div>
					</div>
					<span id="msg_sujet"></span>
				</div>
			</div>
			<div class="row">
				<div class="columns large-12">
					<label for="message" class="left">Message*</label><br/>
					<textarea name="message" id="message" onblur="verifMessage()" required></textarea>
					<span id="msg_message"></span>
				</div>
			</div>
			<div class="row">
				<div class="columns large-6 small-12">
					<div class="row">
						<div class="columns large-8"><span class="left">Un petit test <?=$_SESSION['n1']?> + <?=$_SESSION['n2']?> =</span></div>
						<div class="columns large-4">
							<input type="text" name="captcha" id="captcha" maxlength="10" onblur="verifCaptcha(this);" placeholder="Captcha" required/>
							<span id="msg_captcha"></span>
						</div>
					</div>
				</div>
			</div>
			<input type="text" name="url" style="display:none"/>
			<div class="row">
			<div class="columns large-12 text-center">
				<input class="button form-button-submit" type="submit" value="Envoyer Message">
				<input class="button button-alt form-button-reset" type="reset" value="Effacer">
			</div>
		</div>
		</form>
	</div>
</div>

<div class="row">
	<div class="columns large-12 text-center">
		<span id="msg_all"></span>
	</div>
</div>


et mon javascript de vérification avant envoi:
<script type="text/javascript">
	function surligne(champ, erreur){
		if(erreur){champ.style.backgroundColor = "#F8E0E0";}
		else{champ.style.backgroundColor = "#CEF6CE";}
	}
	function verifNom(champ){
		if(champ.value.length < 2 || champ.value.length > 25){surligne(champ, true);return false;}
		else{surligne(champ, false);return true;}
	}
	function verifMail(champ){
		var regex = /^[a-zA-Z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$/;
		if(!regex.test(champ.value)){surligne(champ, true); return false;}
		else{surligne(champ, false);return true;}
	}
	function verifSujet(champ){
		if(champ.value.length < 2 || champ.value.length > 50){surligne(champ, true);return false;}
		else{surligne(champ, false);return true;}
	}
	function verifMessage(champ){
		if(champ.value.length < 2 || champ.value.length > 500){surligne(champ, true);return false;}
		else{surligne(champ, false);return true;}
	}
	function verifCaptcha(champ){
		dataString = $("#contact").serialize();
		function retour_php(data){
			if(data['captcha_check'] == "invalid"){
				$('#msg_captcha').html("<p>Mauvais Calcul?</p>");
			}else{
				$('#msg_captcha').html("<p>Ok</p>");
			}
		}
		$.ajax({
			type : "POST",
			url: "php/captcha.php",
			data: dataString,
			dataType: "json",
			success: retour_php
		});
	}
	$(function(){
		$("#contact").submit(function(event){
			var nom        = $("#nom").val();
			var sujet      = $("#sujet").val();
			var email      = $("#email").val();
			var message    = $("#message").val();
			var dataString = nom + sujet + email + message;
			var msg_all    = 'Merci de remplir tous les champs';
			var msg_alert  = 'Merci de remplir ce champ';
			if(dataString  == ''){$('#msg_all').html(msg_all);}
			else if(nom == ''){$('#msg_nom').html(msg_alert);}
			else if(sujet == ''){$('#msg_sujet').html(msg_alert);}
			else if(email == ''){$('#msg_email').html(msg_alert);}
			else if(message == ''){$('#msg_message').html(msg_alert);}
			else{
				$.ajax({
					type : "POST",
					url: $(this).attr('action'),
					data: $(this).serialize(),
					success : function(){$('#contact').html('<p>Votre email a été envoyé avec succès. Je vérifie ma boîte de réception tout le temps, donc je devrais vous répondre rapidement.</p>');},
					error: function(){$('#contact').html("<p>Erreur d'appel, le formulaire ne peut pas fonctionner</p>");}
				});
			}
			return false;
		});
	});
</script>
Donc le captcha fait bien parti du formulaire, l'erreur ne vient pas de là.

Essaye avec ce fichier captcha.php :

<?php
	session_start();
	$captcha_check = '';
	if (!isset($_POST['captcha'])) {
		$captcha_check = 'invalid_post';
	} elseif (!isset($_SESSION['expect'])) {
		$captcha_check = 'invalid_session';
	} elseif((int)$_POST['captcha'] != $_SESSION['expect']){
		$captcha_check = 'invalid_captcha';
	}else{
		$captcha_check = 'valid_captcha';
	}
	$return_json = '{"captcha_check":"' . $captcha_check . '"}';
    	echo $return_json;
?>


Le handler javacript correspondant :

function retour_php(data){
	if(data['captcha_check'] == "invalid_post"){
		$('#msg_captcha').html("<p>Erreur: $_POST['captcha'] n'est pas défini.</p>");
	}elseif(data['captcha_check'] == "invalid_session"){
		$('#msg_captcha').html("<p>Erreur: $_SESSION['expect'] n'est pas défini.</p>");
	}elseif(data['captcha_check'] == "invalid_captcha"){
		$('#msg_captcha').html("<p>Mauvais Calcul?</p>");
	}elseif(data['captcha_check'] == "valid_captcha"){
		$('#msg_captcha').html("<p>Ok</p>");
	}else{
		$('#msg_captcha').html("<p>Erreur: Valeur de retour inconnue !</p>");
	}
}


Et ajout d'un gestionnaire d'erreur ajax :

		$.ajax({
			type : "POST",
			url: "php/captcha.php",
			data: dataString,
			dataType: "json",
			success: retour_php,
                        error: function(){alert('La requête a échouée !');}
		});



J'ai juste amélioré la gestion d'erreurs...
C'est vrai qu'il y a pas mal d'info sur les erreurs Smiley smile

Par contre là j'avoue que je ne comprends pas, dès que je mets le code js le navigateur me marque l'erreur suivant dans la console:
ReferenceError: verifCaptcha is not defined

alors que ça change rien à la fonction principale verifCaptcha !!!
function verifCaptcha(champ){
	dataString = $("#captcha").serialize();
	function retour_php(data){
		if(data['captcha_check'] == "invalid_post"){
			$('#msg_captcha').html("<p>Erreur: $_POST['captcha'] n'est pas défini.</p>");
		}elseif(data['captcha_check'] == "invalid_session"){
			$('#msg_captcha').html("<p>Erreur: $_SESSION['expect'] n'est pas défini.</p>");
		}elseif(data['captcha_check'] == "invalid_captcha"){
			$('#msg_captcha').html("<p>Mauvais Calcul?</p>");
		}elseif(data['captcha_check'] == "valid_captcha"){
			$('#msg_captcha').html("<p>Ok</p>");
		}else{
			$('#msg_captcha').html("<p>Erreur: Valeur de retour inconnue !</p>");
		}
	}
	$.ajax({
		type : "POST",
		url: "php/captcha.php",
		data: dataString,
		dataType: "json",
		success: retour_php,
		error: function(){alert('La requête a échouée !');}
	});
}


Idem, j'ai l'erreur suivante au chargement de la page:
Uncaught SyntaxError: Unexpected identifier

Qui correspond à la ligne suivante:
$('#msg_captcha').html("<p>Erreur: SESSION['expect'] n'est pas défini.</p>");

Idem, pourquoi cette erreur??? aucun appel à la fonction n'a été fait...
Pages :