簡體   English   中英

代碼點火器子查詢活動記錄

[英]Code Igniter subquery Active record

我將使用此查詢在模型代碼點火器中使用子查詢

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 ='數據庫內部隨機生成的鹽值'+'用戶輸入密碼',所以我嘗試使用對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();
    }

通過echo $param['email']; exit;檢查您是否獲得了$param['email']echo $param['email']; exit; 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();
    }

這僅是對您的問題的答復,對實施等沒有評論。

此外,還有更好的方法可以做到這一點,但我會讓其他人對此發表評論。

現在,我看到您已經嘗試使用echo $this->db->last_query(); 但未能看到PHP會產生的大錯誤...

您的Select String遇到了麻煩,並且第一次看起來並不正常,因為它看起來應該可以工作。

由於電子郵件用$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 的更好方法 Query Builder 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();

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM