Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP/codeigniter-exit()的使用_Php_Codeigniter - Fatal编程技术网

PHP/codeigniter-exit()的使用

PHP/codeigniter-exit()的使用,php,codeigniter,Php,Codeigniter,我有几个页面需要登录,所以所有链接到这些页面的控制器都以 $this->checkSession(); //...rest of the code CheckSession应验证会话是否仍然处于活动状态,否则将显示一条消息并停止控制器中其余代码的执行: function checkSession() { if (!$this->session->userdata('is_logged_in')) { //the session has expi

我有几个页面需要登录,所以所有链接到这些页面的控制器都以

$this->checkSession();
//...rest of the code
CheckSession应验证会话是否仍然处于活动状态,否则将显示一条消息并停止控制器中其余代码的执行:

function checkSession()
{
    if (!$this->session->userdata('is_logged_in'))
    {
        //the session has expired!
        $data['main'] = 'confirmation_message';
        $data['title'] = "Session expired";
        $this->load->vars($data);
        $this->load->view('template');
        exit();
    }
}
。 我原以为这些指令会按顺序发生,但我只得到一张空白页。
如何确保只有在加载所有视图后才能执行exit()?

我对codeigniter的工作流了解不够,但在我看来,您似乎希望重定向到登录页面,而不是尝试呈现它。显然,在调用
exit()
时,您提供的所有代码都不会将模板发送到浏览器。

exit()在那里剪切您的纸条,并且永远不会调用控制器的实际_output()函数。您需要做的是在其中一个控制器(例如用户登录屏幕)中添加操作并重定向到那里。您可以使用会话中的flashdata功能传递消息,然后在视图中捕获并显示消息

另一种不是很聪明但应该有效的方法是强制调用输出函数

function checkSession()
{
    if (!$this->session->userdata('is_logged_in'))
    {
        //the session has expired!
        $data['main'] = 'confirmation_message';
        $data['title'] = "Session expired";
        $this->load->vars($data);
        $this->load->view('template');
        $this->_output();
        exit();
    }
}
        $this->load->vars($data);
        $this->load->view('template');
        die($this->output->get_output());

在这种情况下,您不应该使用exit,如果会话无效,您应该使用以下示例重定向您的应用程序:

redirect('/init/login/','refresh');

在这种情况下,佩德罗是正确的。如果它们没有登录,只需重定向它们,如果您可以使用来停止在每个单独的受保护文件中执行此操作,那就更好了

但一般来说,如果使用exit(),它将停止输出库的运行。如果您只想停止当前控制器的执行,但允许控制器的输出,您可以使用完全相同的方式返回

function checkSession()
{
    return (bool) $this->session->userdata('is_logged_in');
}
然后简单地说:

if(!$this->checkSession())
{
        //the session has expired!
        $data['main'] = 'confirmation_message';
        $data['title'] = "Session expired";
        $this->load->vars($data);
        $this->load->view('template');
        return;
}

exit()仅在您确实希望应用程序的执行因调试、错误报告等而立即停止时使用。

实际上,手动调用输出类的最新CI函数是

$this->display->_output();
不用担心,它可以处理缓存,如果您在配置中设置了gzip,内容也会被正确压缩


我通常使用登录逻辑添加和扩展控制器,以处理登录功能,因此,如果普通控制器需要身份验证,则会自动调用登录方法,而不会显示原始内容。如果您想停留在用户试图访问的页面上而不重定向(然后将其发回同一页面),这是一个很好的解决方案。

我也遇到了类似的问题。由于没有登录,我想让用户停止登录。但我想为他们提供一个链接列表,而不是简单地将他们重定向到登录页面。我正在使用CI版本1.7.2,$this->\u output()$this->display->\u output()和$this->output->\u display()解决方案对我不起作用。但是,我需要使用$this->output->get_output()函数获得结果

function checkSession()
{
    if (!$this->session->userdata('is_logged_in'))
    {
        //the session has expired!
        $data['main'] = 'confirmation_message';
        $data['title'] = "Session expired";
        $this->load->vars($data);
        $this->load->view('template');
        $this->_output();
        exit();
    }
}
        $this->load->vars($data);
        $this->load->view('template');
        die($this->output->get_output());

这是正确的答案!多亏了萨姆·塞内特。。。它隐藏在注释中,所以我想我应该重新发布。

将代码放入变量中并编写它

$html = $this->load->view('template',null,true);
echo $html;
exit();

您需要调用exit()有什么原因吗?这似乎是一个很好的解决方案,尽管我还是一个初学者-我会记住它,以便更好地掌握CI。回答得很好。我第一次意识到exit()和return之间的区别。注意:这不是返回,如果这段代码在构造函数()中,那么也会调用index()。我认为这是错误的方法$此->输出->显示();如果我想在同一页上显示loing呢?用户登录使用(AJAX)后,页面将refresh@Joraid检查其他答案中的一个,这取决于你的问题,肯定会有一个答案。这个答案是有效的,但是如果你在构造函数上尝试重定向,并且重定向的页面在同一个控制器上,那么你可能会在无限重定向中结束。。。!!最好的答案是Sam&@Evilunix这部作品很棒,我认为这是对这个问题的正确答案。