【问题标题】:Passing data to model CI [closed]将数据传递给模型 CI [关闭]
【发布时间】:2013-02-06 21:23:27
【问题描述】:

感谢@Mischa 在这里帮助我。

答案:

型号:

function validate_login($username, $password) {
        $bcrypt = new Bcrypt(17);

        $sql = "SELECT * FROM users WHERE username = ? ";
        $loginQ = $this -> db -> query ($sql, array($username));
        $database = $loginQ->row();

        $hash = $database->password;
        if ($bcrypt -> verify($password, $hash)){
            return $loginQ;
        }
    }

控制器:

function validate_credentials() {
        $this -> load -> library('form_validation');
        $this -> load -> library('bcrypt'); 

        $this -> form_validation -> set_rules('username', 'Username', 'required|alpha_numeric|min_length[4]|max_length[15]');
        $this -> form_validation -> set_rules('password', 'Password', 'required|min_length[7]|alpha_dash|max_length[20]');

        if ($this -> form_validation -> run() == FALSE) {
            $this -> index();
        } else {
            $this -> load -> library('bcrypt');     
            $this -> load -> model('login_model');

            $username = $this -> input -> post('username');
            $password= $this -> input -> post('password');

            if ($loginQ = $this -> login_model -> validate_login($username, $password)) {
                if ($activated = $this -> login_model -> activated($username)) {
                    $session_array = array('username' => $this -> input -> post('username'), 'loggedin' => TRUE);
                    $this -> session -> set_userdata($session_array);
                    redirect('staff_controller/index');
                } else {
                    $this -> session -> sess_destroy();
                    $this -> load -> view('accessdenied_view');
                    $this -> output -> _display();
                    die();
                }
            } else {
                $this -> index();
            }
        }
    }

【问题讨论】:

  • 只有在将数据传递给视图时,您尝试执行的操作才有效。
  • 但是当我 print_r($data);在模型中,我得到一组数据(我的用户名和密码)
  • 是的,但您没有在模型中使用 $data。您正在使用未定义的 $username$password。要么将$username$password 传递给 你的模型,要么使用$data['username']$data['password'] in 你的模型。不像你现在正在做的两者兼而有之。
  • 为什么要对一个完全合理的问题投反对票? :S

标签: php mysql codeigniter select


【解决方案1】:

您尝试执行的操作仅在将数据传递给视图时有效。您只需将单独的变量传递给您的模型。像这样的:

function validate_login($username, $password) {
  $bcrypt = new Bcrypt(17);

  $sql = "SELECT * FROM users WHERE username = ? LIMIT ? ";
  $loginQ = $this -> db -> query ($sql, array($username, 1));
  $row = $loginQ->result();

  $hash = $row['password'];
  if ($brcrypt -> verify($password, $hash)){
    return $loginQ;
  }
}

当然,这意味着您还必须更改控制器代码以分别传递这些变量。

另一种选择是在您的模型中使用$date['username']$data['password'],但我不建议这样做,因为这会使您的代码更难阅读。

更新以使其更清晰:

控制器:

$username = $this->input->post('username');
$password = $this->input->post('password');
$this->login_model->validate_login($username, $password);

型号:

function validate_login($username, $password) {
  // Etc.
}

【讨论】:

  • 还是没有,我更新了原帖。
  • 您还必须更改您的控制器。不要这样做:$this->login_model->validate_login($data),而是将用户名和密码分别传递给模型。我试图解释你做错了什么。不要只是复制/粘贴我的代码。请试着理解我想告诉你的。另请参阅我上面的评论。
  • 我仍然遇到错误,原帖已更新。
  • 你必须这样做:$hash = $database->password;。默认情况下返回一个对象,而不是一个数组。如果你想要一个数组,你必须使用row_array() 而不是row()。见:ellislab.com/codeigniter/user-guide/database/results.html
  • 我希望我能给你一百万票。给您带来的麻烦,我感到非常抱歉!十分感谢你的帮助。原始帖子将根据您的答案进行更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-20
  • 2020-12-02
  • 2023-04-05
  • 2012-01-28
  • 2013-02-07
  • 1970-01-01
相关资源
最近更新 更多