【问题标题】:Can't redirect to controller dashboard无法重定向到控制器仪表板
【发布时间】:2020-04-14 00:24:21
【问题描述】:

这是登录脚本,当我登录时,我应该被定向到控制器仪表板。但是重定向不起作用。我使用 codeigniter 和最新版本的 xampp。

function do_login()
    {
        $username = $_POST["username"];
        $password = $_POST["password"];
        $cek = $this->m_login->cek_user($username,md5($password)); 
        if(count($cek) == 1){ //cek data berdasarkan username & pass
            foreach ($cek as $cek) {
                $level = $cek['level']; 
                $nama = $cek['nama_mhs'];
                $nim = $cek['nim'];
                $id_user = $cek['id_user'];
            }

            $all_userdata = $this->session->set_userdata(array(
                'isLogin'   => TRUE, 
                'uname'  => $username, 
                'nama'  => $nama,
                'nim'  => $nim, 
                'lvl'      => $level,
                'id_user'      => $id_user,
            ));

            $_SESSION['isLogin']   = TRUE;
            $_SESSION['uname']   = $username;
            $_SESSION['nama']   = $nama;
            $_SESSION['lvl']   = $level;
            $_SESSION['id_user'] = $id_user;
            $_SESSION['nim']   = $nim;

            print_r($this->session->all_userdata());           

            redirect('dashboard','refresh');
        }else{ //jika data tidak ada yng sama dengan database
            echo "<script>alert('Gagal Login!')</script>";
            redirect('login','refresh');
        }

    }

【问题讨论】:

  • 删除重定向前的print_r() 和echo。重定向请求时,总是确保在它之前没有输出。没有任何。甚至没有空格或换行符。
  • 警告! 不要使用 md5 进行密码散列! The manual 甚至声明:“警告 - 由于此散列算法的快速特性,不建议使用此功能来保护密码”。您应该使用 PHP 的 password_hash() 来创建安全散列。然后你可以使用password_verify() 来根据哈希验证密码。
  • 谢谢,但我应该回应什么?
  • 你有什么错误吗?
  • 你不应该回应任何东西。就像我说的:“总是确保它之前没有输出。从来没有。甚至没有空格或换行符”。如果你回显某些东西,它就是一个输出。重定向作为标头发送到客户端。标头在内容之前发送。如果您回显某些内容(这是一个输出),则会先发送标头,然后再发送输出。这意味着您不能在之后添加更多标头(例如位置(重定向)标头)。而且由于您告诉浏览器重定向,所以输出内容没有意义。

标签: php codeigniter authentication redirect codeigniter-3


【解决方案1】:

除了像 cmets 中建议的那样在重定向之前删除任何和所有输出(因为重定向使用 http 标头),redirect 函数应该接收以下两个参数之一:

1.- 重定向到外部资源时包含协议(即redirect('https://www.example.com/');)的完整 URL 或

2.- 重定向到内部资源时的完整控制器/方法对(即redirect('controller/method');

在您的代码中,您似乎只重定向到控制器名称,这在某些情况下可能有效,但不能保证有效。如果控制器名称为dashboard,方法名称为something,请尝试将重定向更改为redirect('dashboard/something');(并删除print_r 语句和所有其他可能在实际@987654328 之前向浏览器发送标头的输出到达@线)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 2017-07-11
    • 2018-08-28
    • 2017-11-19
    相关资源
    最近更新 更多