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 :
Je mets en place les règles de validation :
Je choisis ensuite une question aléatoire : (je reviendrais plus bas pourquoi le date(‘U’))
Ma classe random_question est très simple :
Une fois que j’ai ma question, de retour dans le contrôleur du formulaire, je le mets en session :
Puis j’envoie la question piochée dans la vue :
Pour info, voila le callback pour verifier la question :
Le problème :
Le résultat obtenu me désarçonne complètement. J’ajoute ceci en fin de mon controleur :
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)
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)