8721 sujets

Développement web côté serveur, CMS

Bonjour !

Je travaille sur un projet qui tourne sous codeigniter.
Mon problème relevant plus de logique que d’une question sur ce framework, je me permet de poser ma question ici.

La situation :
Je suis sur un formulaire. Pour éviter de générer un capcha laborieux a remplir, mon idée est de partir sur une question aléatoire avec une réponse évidente :
- Quelle est la couleur des fraises ?
- Quelle est la couleur du cheval blanc d’Henri IV ?
Etc …

Le script :
Voici comment j’ai fait les choses :
Sur le controleur du formulaire, je commence par importer mes librairies :
            $this->load->library('form_validation');
            $this->load->library('random_question'); 


Je mets en place les règles de validation :
     $this->form_validation->set_message('required', 'Le champ %s est requis');
                             […]
            $this->form_validation->set_rules('bot', 'bot', 'callback_anti_bot');


Je choisis ensuite une question aléatoire : (je reviendrais plus bas pourquoi le date(‘U’))

            if ($this->form_validation->run() == FALSE)
            {
                $num = rand() % 5;
                $dateU = date('U');
                $question = $this->random_question->question($num).$dateU;
                $reponse = $this->random_question->reponse($num);

            }


Ma classe random_question est très simple :

class random_question {
	function question($num)
	{	
		$questions = array(
			"Quelle est la couleur du ciel ? ",
			"Quelle est la couleur des bananes ?",
			"Quelle est la couleur des fraises ?", 
 			"Quelle est la couleur du cheval blanc ?",
			"Quelle est la couleur du bois ?",
		); 
		return $questions[$num];
	}

 	function reponse($num)
	{
		$reponses = array(
			"bleu",
			"jaune",
			"rouge",
			"blanc",
			"marron",
		);
		return $reponses[$num];
	}
}

Une fois que j’ai ma question, de retour dans le contrôleur du formulaire, je le mets en session :
   $this->session->set_flashdata('reponse', $reponse);


Puis j’envoie la question piochée dans la vue :
$data = array();
            $data['MessageOk'] ="";
            $data['question'] = $question;

            $this->layout->view('/themes/contact', $data);


Pour info, voila le callback pour verifier la question :
        if ($str == $this->session->flashdata('reponse'))
        {           
            return TRUE;
        }
        else
        {
            $this->form_validation->set_message('anti_bot', 'fail à la question anti-bot');
            return FALSE;
        }


Le problème :

Le résultat obtenu me désarçonne complètement. J’ajoute ceci en fin de mon controleur :
 var_dump($question);
    	       echo "<br>";
                    var_dump($reponse);

                   echo "<br> flashdata question ";
                   var_dump($this->session->flashdata('question'));
      echo "<br> flashdata reponse ";
                   var_dump($this->session->flashdata('reponse'));

Juste pour ètre sur et essayer de comprendre.
Ici se justifie la date en time stamp en fin de question.
Voici ce qui s’affiche au premier chargement :

Mes premier var_dump :
string(45) "Quelle est la couleur des bananes ? 1422442444"
string(5) "jaune"


Verification de ce que j’ai en session :
flashdata question bool(false)
flashdata reponse bool(false)


Jusque-là, tout va bien. (False, car selon la doc de flashdata de codeigniter, l’appel est possible uniquement a la prochaine requête)
Je submit, (les bananes, c’est jaune), et voila ce que me donnent mes var_dump :

string(41) "Quelle est la couleur du bois ?1422442503"
string(6) "marron"


flashdata question string(45) "Quelle est la couleur des fraises ?1422442446"
flashdata reponse string(5) "rouge"



Juste en regardant le time stamp à la fin des questions, on voit qu’il a été généré 2 nouvelles questions… je ne comprends pas ce qu’il se passe.

Comment est-ce possible ?

Merci de m’avoir lu, et merci d’avance pour toute l’aide que vous pourriez m’apporter.

PS : vous pouvez trouver ici : http://pastebin.com/t0NLXH0n l'ensemble du contrôleur si ca peut vous aider a comprendre mon problème.
Modifié par saajuck (09 Feb 2015 - 13:55)
Aucune réponse ?
Je pense manquer de clarté.
http://pastebin.com/t0NLXH0n
A nouveau, le script cette fois commenté, exposant le problème à la ligne 38.

N'hésitez pas a me dire si je peux vous donner d'avantage d'explication.

Merci d'avance,
Modifié par saajuck (09 Feb 2015 - 13:58)