2012-08-15 54 views
0

目前我使用下面的代碼:檢查用戶登錄2個數據庫表

$sql = sprintf("SELECT * FROM users WHERE email = '%s' and password = '%s'", $email, $password); 

我要做到以下幾點:

$sql = sprintf("SELECT * FROM database1.users AND database2.users WHERE email = '%s' and password = '%s'", $email, $password); 

我需要檢查該用戶存在的可能性在任一表中。

有關如何處理此問題的任何建議?

+0

我確定有一個聰明的方法來做到這一點在SQL中,但你*可以*只是在你的PHP代碼中做到這一點......這也將更容易處理有效的情況下用戶在*兩個*表中。 – 2012-08-15 20:31:34

+1

請不要這樣做。 **總是**使用[適當的SQL轉義](http://bobby-tables.com/php),否則你最終會陷入嚴重的麻煩。 'sprintf'不是組裝查詢的正確方法。 – tadman 2012-08-15 20:35:01

+0

這只是一個代碼示例。變量先前已經通過這個函數傳遞過來了:函數sanitize($ variable){variable = mysql_real_escape_string(trim($ variable)); return $ variable; } ' – Mike 2012-08-15 20:45:04

回答

2

可以使用UNION這兩個查詢組合:

SELECT * FROM database1.users WHERE email = '%s' and password = '%s' 
UNION 
SELECT * FROM database2.users WHERE email = '%s' and password = '%s' 
0

您的查詢可以如下:

SELECT table1.*, table2.* FROM table1 JOIN table2 
ON table1.userID=table2.userID WHERE email=? AND password=? LIMIT 1 

這是非常危險的變量追加到一個SQL查詢,而你是善意使用sprintf,它沒有達到你想要的。使用prepared statement可以妥善防範SQL注入。

0
SELECT IF(A.UserFound*B.UserFound=0,'No','Yes') Authenticated 
FROM 
(
    SELECT COUNT(1) UserFound FROM database1.users 
    WHERE email = '%s' and password = '%s' 
) A, 
(
    SELECT COUNT(1) UserFound FROM database2.users 
    WHERE email = '%s' and password = '%s' 
) B;