在codeigniter中使用flashdata的奇怪行为

时间:2017-12-07 20:19:16

标签: php codeigniter codeigniter-3

我发现了非常奇怪的行为"如果" codeigniter中的条件和会话flashdata,

public function edit_equip($equip_id, $company_id) {
        $this->data['section_title'] = 'Edit Equipment';
        $this->data['equip_detail'] = $equip_detail = $this->common->select_data_by_id('equipment', 'id', $equip_id, '*', array());
        if (empty($equip_detail)) {
            $this->session->set_flashdata('error', 'Error Ouccrred. Try Again!');
            redirect('Company/equipment/' . $company_id, 'refresh');
        }
       //some other code
        $this->load->view('company/edit_equip', $this->data);
    }

这是我的Equipment类的功能。现在,当我打电话给下面的网址时, http://localhost/scale/Equipment/edit_equip/1/2

然后编辑视图将正确打开。但现在当我按F5按钮或浏览器刷新按钮时,它显示"错误Ouccrred。再试一次!"如果条件,我在上面设置的flash消息。我不明白为什么会发生这种情况,因为$ equip_detail包含数据而且我也试图在其中死亡但是如果哪个是正确的则不会进入,所以为什么只有$this->session->set_flashdata('error', 'Error Ouccrred. Try Again!'); 提供效果?

总之我的代码没有运行if block但是如果我在第一次加载视图后按F5或浏览器刷新按钮它会显示错误消息,如果条件设置,但是我的代码不会转到它它必须重定向,但它正在加载带有flash消息的视图页面。

我只按照上面的代码在一个地方设置了此flash消息。我正在使用codeigniter 3.1.6

请有人能解释一下吗?

3 个答案:

答案 0 :(得分:1)

the CI manual says:

  

CodeIgniter支持“flashdata”,或者只支持会话数据   下一个请求可用,然后自动清除。

F5正在发送新请求,因此flashdata已清除

答案 1 :(得分:1)

这不是解决方案,而是更多的调查来满足自己的工作方式......

因此,当事情变得“棘手”时,它总是回归基础的好时机。因此,看到你确信你的代码正确执行但是给你意想不到的结果这里是一些测试代码,只是为了检查flashdata的行为。

<强> Flash_session_test.php

class Flash_session_test extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
        $this->load->library('session');
        $this->load->helper('url');
    }

    public function index()
    {
        echo "This is " . __METHOD__;
        $this->test_display();
    }

    /**
     * Mockup code derived from sample code
     *  to test the behavior of the flash data.
     *
     * @param $equip_id
     */
    public function edit_equip($equip_id)
    {
        echo "This is " . __METHOD__;

        // Set up our Fail / Pass for the If statement below.
        if (isset($equip_id)) {
            if ($equip_id == 'fail') {
                // Create a Fail Condition
                $equip_detail = null;
            } else {
                // Create a Pass Condition
                $equip_detail = array('fred' => 1);
            }
        }
        // The code we are testing.
        if (empty($equip_detail)) {
            $this->session->set_flashdata('error', 'Error Occurred. Try Again!');
            // Redirect and display the flashdata error message
            redirect('/flash_session_test', 'refresh');
        }
        $this->test_display();
    }

    /**
     * Our Test "View" put here for simplicity
     */
    public function test_display()
    {
        echo '<br>';
        echo '<a href="/flash_session_test/edit_equip/pass" >Click here to Create a PASS</a>';
        echo '<br>';
        echo '<a href="/flash_session_test/edit_equip/fail" >Click here to Create an ERROR</a>';
        echo '<br>';
        echo '<br>';
        // Only display the message if we have one
        $error = $this->session->flashdata('error');
        if ($error === null) { // If null, then It doesn't exist
            echo '<div style="color:green">';
            echo "Not An Error in Sight!";
            echo '</div>';
        } else {
            echo '<div style="color:red">';
            echo $this->session->flashdata('error');
            echo '</div>';
            echo "Now Refresh the page!";
        }
    }
}

注意:这将独立运行,而不依赖于您现有的代码。

答案 2 :(得分:0)

不要使用 $this->session->set_flashdata(),而是使用 $this->session->mark_as_flash(),它对我有用!