2012-07-05 60 views
1

我需要我的身份驗證腳本來設置查詢,在WHERE子句中我想用'_MY_POST_VALUE' IN (Field1, Field2)笨在哪裏值IN(字段1,字段2)

最終的查詢將會是這樣的:

SELECT * FROM 'myprefix_users' WHERE '[email protected]' IN ('EMAIL','LOGIN') AND PASSWORD=SHA1('mypassword')

我試着這樣做:

$this->db->where("'" . mysql_escape_string($_POST['login']) . "' IN (EMAIL,LOGIN)", NULL, FALSE); 
$this->db->where("PASSWORD=SHA1('" . mysql_real_escape_string($_POST['password']) . "')"); 
$userdb = $this->db->get('users'); 

..但笨設置前綴我的登錄/電子郵件值和發送錯誤:

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 ''[email protected]' IN (EMAIL,LOGIN) AND PASSWORD=SHA1('123')' at line 3 

SELECT * FROM (`myprefix_users`) WHERE myprefix_'[email protected]' IN (EMAIL,LOGIN) AND PASSWORD=SHA1('123') 

我需要在表名使用db_prefix,但我並不需要它在我的WHERE子句中,即使第三參數(FALSE) - >其中,()不爲我工作:(

我該如何解決我的問題?有任何想法嗎?

+0

你可以用你的查詢俗做的一樣好:) – Suleman 2012-07-05 15:45:03

回答

2

嘗試使用Codeigniter的Input類。這將簡化代碼:

$login = $this->input->post('login', TRUE); 
$password = $this->input->post('password', TRUE); 
$this->db->where("'$login' IN ", "('EMAIL','LOGIN')", FALSE); 
$this->db->where("PASSWORD", "SHA1('$password')", FALSE); 
$userdb = $this->db->get('users'); 
+0

魔法!它現在有效,謝謝你:) – 2012-07-05 17:11:53

1

首先,您不需要數據庫語句中的所有不必要的功能。

爲什麼不這樣做:

$user = $_POST['user']; 
$pass = sha1($pass); 

$this->db->where("(email = '$user' OR username = '$user') AND password = '$pass'"); 
$query = $this->db->get('users'); 

您不必擔心MySQL的逃逸因爲笨類將自動逃避它們。

+0

其實很類似於這樣的問題: http://stackoverflow.com/questions/9870583/codeigniter-active-record-在哪裏或哪裏 – 2012-07-05 15:47:52

+0

'OR'是不好的解決方案,因爲它會使請求變慢。閱讀關於「OR」如何在低級MySQL引擎中工作的信息。爲什麼我應該爲變量分配內存,這會重複我的'$ _POST'變量? – 2012-07-05 17:04:28

+0

對不起,它使語法高亮一點。您不需要複製變量。從上面的答案來看,使用輸入類將顯着地幫助你。 – 2012-07-05 17:44:26

相關問題