代码之家  ›  专栏  ›  技术社区  ›  fahmi hammadi

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

  •  0
  • fahmi hammadi  · 技术社区  · 8 年前

    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为我的登录添加安全性

    密码='数据库内随机生成的盐值'+'用户输入密码' 所以我试着用子查询来实现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 回复  |  直到 8 年前
        1
  •  0
  •   TimBrownlaw    8 年前

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

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

    现在我看到你试图使用 echo $this->db->last_query(); 但是没有看到PHP会产生的大错误。。。

    您的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();
    
    }
    
        2
  •  0
  •   Yadhu Babu    8 年前

    检查您是否获得价值 $param['email'] 通过 echo $param['email']; exit; 在控制器中。

    如果是这样,试试这个

    $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();
        }
    
    推荐文章