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

时间:2017-11-06 03:02:23

标签: php mysql codeigniter activerecord subquery

我将使用此查询

在我的模型代码点火器中使用子查询
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中,我将用户输入存储在$ param中 我正在使用salt为我的登录添加安全性

password ='数据库内随机生成的salt值'+'用户输入密码' 所以我尝试使用子查询到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 个答案:

答案 0 :(得分:0)

检查是控制器中$param['email']的{​​{1}}获取值。

若然,请试试这个

echo $param['email']; exit;

答案 1 :(得分:0)

这只是回答您的问题,而不是对实施等的评论......

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

现在我看到你曾尝试使用echo $this->db->last_query();,但未能看到PHP会产生的重大错误......

你的选择字符串发生了一次事故,第一次看起来不太明显,因为它看起来应该有效。

由于电子邮件被$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();

}