提问者:小点点

代码点火器子查询活动记录


我将使用这个查询在我的模型代码点火器中使用子查询

SELECT KTP, EMAIL, NAMA, PASSWORD, SALT, CONTENT, PERNR, ACTIVE
    FROM ref_user
    WHERE EMAIL = 'fahmi@gmail.com' AND PASSWORD = (SELECT SALT FROM ref_user WHERE EMAIL = 'fahmi@gmail.com') + 'mi'

在我的CI中,我将用户输入存储在$参数中,我使用盐来增加登录的安全性

password='random generated salt value inside database''user input password',所以我尝试使用子查询对CI中的那些进行查询

function signin_user($param){
        $this->db->select('ktp,email,nama,password,salt,content,pernr,active');
        $this->db->from('ref_user');
        $this->db->where('email',$param['email']);
        $this->db->where('password',MD5("SELECT salt FROM ref_user WHERE email=$param['email']" . $param['pass']));
        $query = $this->db->get();
        //echo $this->db->last_query();
        return $query->row();
    }

共2个答案

匿名用户

这只是对您的问题的回应,对实施等没有任何评论。。。

此外,还有更好的方法可以做到这一点,但我会让其他人对此发表评论。

现在我看到你试图使用echo$this-

您的Select字符串出现了问题,第一次出现这种情况并不完全明显,因为它看起来应该可以正常工作。

由于电子邮件在$param['email']中被引号括起来,这会使事情变得混乱,您将得到一个解析错误。

$this->db->where('password', MD5(
    "SELECT salt FROM ref_user WHERE email=$param['email']" . $param['pass'])
     );

有两种解决办法

方法1:通过使用{}包装变量来指示变量的位置来帮助PHP。所以,$param['email']变成了{$param['email']}就像这样。。。

$this->db->where('password', MD5(
    "SELECT salt FROM ref_user WHERE email={$param['email']}" . $param['pass'])
     );

方法2:走老路,使用连接。

$this->db->where('password', MD5(
       "SELECT salt FROM ref_user WHERE email=" . $param['email'] . $param['pass'])
       );

方法3:不好:你可以放弃单引号-但我个人非常不喜欢这样,所以我们甚至不要去那里,因为它会助长坏习惯。

更新:使用CI查询生成器CI的更好方法允许您创建编译选择...所以你可以这样做...

public function signin_user($param) {
    //Precompile the Sub query
    $this->db->select('salt')->from('ref_user');
    $this->db->where('email', $param['email'] . $param['pass']);
    $sub_query = $this->db->get_compiled_select();
//        echo $sub_query;
//        echo'<br>';
    $this->db->select('ktp,email,nama,password,salt,content,pernr,active');
    $this->db->from('ref_user');
    $this->db->where('email', $param['email']);
    $this->db->where('password', MD5($sub_query));

    $query = $this->db->get();
//        echo $this->db->last_query();

    return $query->row();

}

匿名用户

检查您是否通过echo$param['email']获取$param['email']的值;退出在控制器中。

如果是这样,试试这个

$query_password = $this->db->get_where('ref_user', array('email' => $param['email']));
$val = $query_password->result_array();
$password = $val[0]['salt'];

function signin_user($param){
        $this->db->select('ktp,email,nama,password,salt,content,pernr,active');
        $this->db->from('ref_user');
        $this->db->where('email',$param['email']);
        $this->db->where('password', $password));
        $query = $this->db->get();
        //echo $this->db->last_query();
        return $query->row();
    }