【问题标题】:How can I persist data for a redirect with CodeIgniter?如何使用 CodeIgniter 为重定向保留数据?
【发布时间】:2015-08-26 21:29:45
【问题描述】:

我正在尝试验证用户的登录尝试并通知他们

  • 他们的用户名错误或
  • 他们的密码错误(因为我个人非常讨厌网站没有告诉我密码是什么,但那不是重点)。

我已经阅读了很多关于这个问题的 SO 帖子,但我发现的那些帖子已经有好几年了,我正在与 CodeIgniter 3.0.1 打交道。

这是我已有的代码。我正在使用Eclipse PDT 作为我的 IDE,我非常喜欢它(但这已经偏离了轨道),所以我已经能够逐步执行并观察它完全失败了。

IF (!$this->User->login( //Testing shows this works fine - the SWITCH statement gets executed as it should and the BADUSERNAME case is followed through.
    addslashes(strtolower($this->input->post('username', TRUE))),
    addslashes($this->input->post('password', TRUE)),
    $this->getIP())){
        SWITCH($this->User->ID){
            CASE 'BADUSERNAME':
                $this->session->set_flashdata('user_msg', 'Invalid Username');
                BREAK;
            CASE 'BADPASSWORD':
                $this->session->set_flashdata('user_msg', 'Invalid Password');
                BREAK;
            CASE 'ALREADYLOGGEDIN':
                $this->session->set_flashdata('user_msg', 'You are logged in elsewhere.');
                BREAK;
            DEFAULT:
                $this->session->set_flashdata('user_msg', 'Something has gone terribly wrong. Please try logging in again.');
                BREAK;
            }
            redirect(base_url());
        }

然后再往下一点,我加载页眉、正文和页脚视图 - 正文是应该显示错误消息的位置,但 不是。

<div id="contentarea">
    <div class="container">
        <?PHP
        ECHO $this->session->flashdata('show_validation') ? validation_errors() : ''; 
        $error = $this->session->flashdata('user_msg'); //This is where it's supposed to get it...
        IF ($error) //And this is where it's supposed to show it...
            ECHO "<div class='error'>$error</div>";
        ?> //But the value is wiped so it only ever grabs NULL.

我在设置闪存数据后调用重定向后遵循执行路径,我注意到在重定向完成后它的执行链,它调用exit;

然后从index.php 文件再次加载所有内容,当 Session 最终弹出时……值“user_msg”已无处可寻。

很明显我在这里做错了什么 - 我在这里做错了什么? flash_data 是否只会持续到调用重定向?甚至 session_data 值(调用$this-&gt;session-&gt;value = 'some arbitrary user message' 也无法持久化)。

如何在下次加载正文元素时保留该消息,以便它可以告诉用户“嘿,没有找到你”或“嘿,您的密码不正确”?

编辑 1

所以事实证明我不需要重定向我正在做的事情,因为 POST(提交用户名和密码)会为我处理。

我将把这个问题留给其他可能需要回答的人 - 也许答案只是 Flash 数据无法在重定向中存活?

【问题讨论】:

  • @ODelibalta“你使用的方法”——你指的是哪个?
  • 我认为您应该考虑到许多网站没有告诉您用户名和/或密码不正确的原因。这是一个安全问题。如果您告诉攻击者他们的用户名很好但密码错误,那么您已经为他们提供了成功攻击您所需的 50%。

标签: php codeigniter session


【解决方案1】:

刷出的数据只对下一个http请求可用,如果你再次重新加载页面,数据就消失了。 要在会话中保留数据,您需要在会话中设置变量。

Codeigniter

添加会话数据 假设某个特定用户登录到您的网站。一旦通过身份验证,您可以将他们的用户名和电子邮件地址添加到会话中,从而使您可以在全球范围内使用该数据,而无需在需要时运行数据库查询。 与任何其他变量一样,您可以简单地将数据分配给$_SESSION 数组。或作为$this-&gt;session 的属性。 或者,也可以使用将其分配为“用户数据”的旧方法。但是,将包含新数据的数组传递给 set_userdata() 方法:

$this->session->set_userdata($array);
$this->session->set_userdata('username', 'username is wrong');

在视图中

$this -> session ->userdata('username');

$this ->session -> username;

参考会话库Codeigniter。 希望这有帮助。

【讨论】:

  • 我在我的问题中确实说过我曾尝试按照您的建议进行操作,但这也不起作用($this->session->foo = 'bar' 也不会持续存在)。跨度>
  • @您会阅读 Codeigniter 会话文档以及如何使用它。 $this -&gt; session -&gt; foo = bar 不会在会话中设置变量。但这确实是正确的语法$this -&gt; session -&gt;set_useradata('key','value')。再次阅读文档。
【解决方案2】:

您所要做的就是使用$this-&gt;session-&gt;keep_flashdata('user_msg')$this-&gt;session-&gt;unset_userdata('user_msg')

这里是解决方案(查看文件)

<?php
$error = $this->session->flashdata('user_msg');
if (isset($error)) {
    echo '<div class="error">' . $error . '</div>';
     $this->session->unset_userdata('user_msg');
}

?>

之后在您的控制器construct 函数中(在您重定向的那个控制器中)

public function __construct() {
  parent::__construct();
  //.....
  $this->session->keep_flashdata('user_msg');
}

我遇到了同样的问题,这很有效。尝试或在其他浏览器中尝试时不要忘记清除缓存

【讨论】:

  • 感谢您的提示 - 但是,在构造函数消失的初始运行中,尝试调用 keep_flashdata 会导致异常。我相信我可以解决这个问题。这似乎更符合正确的轨道。
  • 在此处发布您的完整 exception 消息
  • 这是我的错误 - 我调用了错误的函数。我能够找到解决方案,但不是这样。
【解决方案3】:

您可以使用codeigniter的flashdata单独显示错误。

这是我通常使用的。

控制器:

$errors = array();
foreach ($this->input->post() as $key => $value){
    $errors[$key] = form_error($key);
};
$response['errors'] = array_filter($errors);
$this->session->set_flashdata($response['errors']);
redirect('your-page', 'refresh');

并使用 来显示错误

<?php echo $this->session->flashdata('field_name'); ?>

【讨论】:

    猜你喜欢
    • 2012-01-29
    • 2014-12-21
    • 2015-02-05
    • 1970-01-01
    • 2017-07-23
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多