使用会话变量进行CodeIgniter表单验证

时间:2013-07-23 15:03:53

标签: php codeigniter validation

如果没有传递表单数据,如何获取CodeIgniter表单验证以验证$_SESSION?我尝试手动设置$_REQUEST变量,但似乎无效。

即。我在控制器中有一个函数search,它验证传递的表单输入,并返回上一页有错误,或者让你进入下一页。但是如果您之前填写了此页面,我希望此功能也能正常工作,并且信息存储在$_SESSION变量中。

function search () {
    $this->load->library("form_validation");
    $this->form_validation->set_rules("flightID", "Flight Time", "required|callback_validFlightID");
    $this->form_validation->set_rules("time", "Flight Time", "required|callback_validFlightTime");

    $this->setRequest(array("flightID", "time"));

    // adding session check allows for inter-view navigation
    if ($this->form_validation->run()) {

        // some application logic here

        $this->load->view("seats", $data);
    } else {
        $this->logger->log($_REQUEST, "request");
        // redirect back to index
        $this->index();
    }   
}
function setRequest () {
    // make sure none of the parameters are set in the request
    foreach ($vars as $k) {
        if (isset($_REQUEST[$k])) {
            return;
        }   
    }   

    foreach ($vars as $k) {
        if (isset($_SESSION[$k])) {
            $_REQUEST[$k] = $_SESSION[$k];
        }   
    }   

}

3 个答案:

答案 0 :(得分:1)

您可以使用以下codeigniter函数

将表单发布信息存储在会话中
$formdata = array(
                    'flightID' => $this->input->post('flightID'),
                    'time' => $this->input->post('time')
                );
                $this->session->set_userdata($formdata);

可以使用以下

检索信息
$this->session->userdata('flightID')
$this->session->userdata('time')

答案 1 :(得分:0)

form_validation直接与$_POST一起使用,因此请使用该代替$_REQUEST

答案 2 :(得分:0)

您要做的是手动设置Post值,这不是本机的 CodeIgniter支持。所以我们首先要做的是扩展核心。 创建一个新文件(MY_Input.php)并将以下内容粘贴到其中:

class MY_Input extends CI_Input{

    function set_post($key, $value)
    {
        $_POST[$key] = $value;
    }

}

这是你目的的一个非常基本的实现,但它足以测试。您可能希望扩展它以使其符合您的需求(例如,允许输入数组)。

所以现在。在您的控制器中,您可以检查用户是否发布了某些内容。如果不是,您将只使用Input类的新方法手动设置post变量。

class Some_Controller extends CI_Controller{

    public function index()
    {
        // The user hasn't filled out a field?
        if(!$this->input->post('a_key'))
        {
            // Let's set the postfield to the value of a session key
            $this->input->set_post('a_key', $this->session->userdata('mystoredkey'));
        }
    }

}

手动设置postfield后,表单验证库可以按原样处理。

那应该是你要走的路:) 如果你不害怕破解核心,你真的可以做一些漂亮的事情。很多人都是,不要成为其中之一!

快乐编码