2016-08-27 78 views
1

我用codeigniter中的sha2哈希函數編寫了一個查詢,但生成的查詢沒有正確生成。Codeigniter查詢沒有正確生成

這裏是我的模型代碼:

public function validate_user($data = NULL) 
{ 
    $email = $data["email"]; 
    $password = $data["password"]; 
    $this->db->select('user_id'); 
    $query = $this->db->get_where('users', array('sha2(username, NULL)' => $data["username"], 'password' => $password)); 
    return $query->row_array(); 
} 

而這裏的我得到(由於格式不正確的查詢)錯誤:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''FCD8FE02F495400DC020499AC31FC75ABA05005622FD7A2F01D37153724CB395' AND `password' at line 3 

SELECT `user_id` FROM `users` WHERE sha2(username, NULL) 'FCD8FE02F495400DC020499AC31FC75ABA05005622FD7A2F01D37153724CB395' AND `password` = '2668dcd9bac3c8bb60742f139876d1d6' 

爲什麼不來的=符號在sha2(username, NULL)'FCD8FE02F495400DC020499AC31FC75ABA05005622FD7A2F01D37153724CB395'之間

的實際查詢的結果會是:

SELECT `user_id` FROM `users` WHERE sha2(username, NULL) = 'FCD8FE02F495400DC020499AC31FC75ABA05005622FD7A2F01D37153724CB395' AND `password` = '2668dcd9bac3c8bb60742f139876d1d6' 

而不是:

SELECT `user_id` FROM `users` WHERE sha2(username, NULL) 'FCD8FE02F495400DC020499AC31FC75ABA05005622FD7A2F01D37153724CB395' AND `password` = '2668dcd9bac3c8bb60742f139876d1d6' 

任何想法我做錯了嗎?

+0

用戶名存儲爲普通用戶名或sha2()值? – Tpojka

+0

第二個問題,我可以檢查([這裏](http://php.net/manual/en/function.hash.php)和[這裏](http://php.net/manual/en/function)。 hash-algos.php))'sha1','sha224''sha256','sha384'和'sha512'哈希算法,但不包含'sha2'。 'sha2()'從哪裏來? – Tpojka

+0

謝謝你的回覆Tpojka。用戶名在數據庫中以純文本格式存儲,但我的客戶端將發送用戶名sha256,所以我想檢查它的唯一方法是使用mysql的sha2函數(原因是我正在檢查,我意識到sha256值的客戶端發送和由mysql生成的sha2是相同的,給定一個特定的用戶名) – mrid

回答

1

這實際上是一個簡單的查詢,使用Codeigniter方法來構建語句在這種情況下不起作用。

嘗試使用像這樣更簡單的綁定查詢。

$sql = "SELECT user_id FROM users WHERE sha2(username, 256) = ? AND `password` = ?"; 
$query = $this->db->query($sql, array($data["username"], $data["password"])); 
return $query->row_array(); 

注意我把第二個參數放到mysql sha2()調用中。我認爲這兩個參數都是必需的,如果其中一個丟失或爲空,則sha2()返回null。