Я пытаюсь добавить captcha для моей формы входа в codeigniter.
Капча отображается хорошо. и проблема заключается в ее проверке. Когда validate_captcha вызывается, значение из входного сообщения правильное, но значение сеанса - это новое значение страницы. Например, если на первой странице загрузочная загрузка была 12345 (допустим, что во второй загрузке это будет 54321), а затем при первой загрузке пользовательские входы 12345 будут проверяться с помощью 54321.
Что я могу сделать?
Вот что я пробовал
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Login extends CI_Controller
{
public function index()
{
$capCode = rand(10000, 99999);
$this->session->set_userdata(array('captcha'=>$capCode));
echo $this->session->userdata['captcha'];//for debug only
$this->load->helper('captcha');
$vals = array(
'word' => $capCode ,
'img_path' => CAPTCHA_PATH,
'img_url' => base_url().CAPTCHA_PATH,
'img_width' => '150',
'img_height' => 30,
'expiration' => 1200
);
$cap = create_captcha($vals);
$data = array('un' => $un,'defTab'=>'','captcha'=>$cap);
$this->load->library('form_validation');
//I need to load different data if form is result of a post($data['defTab'])
if($this->input->post('submit'))
{
$this->form_validation->set_rules('email', 'Email', 'required|valid_email');
$this->form_validation->set_rules('captcha', 'Captcha', 'required|callback_validate_captcha');
if ($this->form_validation->run() == FALSE)
{
$data['defTab'] = 'what i need';
$this->load->view('login',$data);
}
else
{
print_r($this->input->post());
}
}
else
{
$this->load->view('login',$data);
}
}
public function validate_captcha()
{
$sss=$this->input->post('captcha');
//I Use this line to find problem
$this->form_validation->set_message('validate_captcha', 'session:'.$this->session->userdata['captcha'].'\nPosted val:'.$sss);
if($sss!= $this->session->userdata['captcha'])
{
return false;
}
else
{
return true;
}
}
}
Перед вызовом метода create_captcha используйте приведенный ниже код, чтобы установить предыдущий код
$this->session->set_userdata('prev_captcha',$this->session->userdata('captcha_word'));
при условии, что captcha_word содержит текущий код и проверьте, как показано ниже.
function checkCaptcha($str){
$word = $this->session->get('prev_captcha');
if(strcmp(strtoupper($str),strtoupper($word)) == 0){
return true;
}else{
return false;
}
}
Вы должны установить сеанс во время создания своей формы:
.
.
.
} else {
if (isset($cap["word"])) {
$this->session->set_userdata("word", $cap["word"]);
}
$this->load->view('login',$data);
}
И во время проверки проверьте его:
if($this->input->post("word", TRUE) == $this->session->userdata("word")){
// do something
}