2013-07-17 38 views
0

我遇到查詢問題。我(使用PHP PDO和MySQL),使用以下過程中的一個表中查詢:MySQL查詢連接異常行爲

構建查詢字符串$ SQL:

SELECT * 
FROM `user` 
WHERE (`username`=:username OR `email`=:username) 
     AND `password`=:password AND `valid`='1'; 

並使用此數組$ PARAMS:

Params 
(
    [:password] => 18155dbf12503d726883784d1d9755f8d3382ba7 
    [:username] => [email protected] 
) 

呼叫這個功能:

$results_array = $database->QueryForObject($sql, $params); 

public function QueryForObject($query, $binds) 
{ 
    $stmt = $this->db->prepare($query); 

    foreach($binds as $bindKey => &$key) 
    { 
     $stmt->bindParam($bindKey, $key, PDO::PARAM_STR); 
    } 

    return $this->RunObjectQuery($stmt, NULL , "stdClass"); 
} 

我的問題是用戶名可以INCOMP lete甚至失蹤,並且它用來查找用戶的所有密碼都是...我非常確定它不應該這樣做,但我無法弄清楚原因。

作爲一個側面說明,這裏是我的表的說明:

Field   , Type           , Null ,Key ,Default , Extra 
id    , int(10) unsigned        , NO ,PRI ,NULL  auto_increment 
username   , varchar(30)         , NO ,UNI ,NULL      
email   , varchar(50)         , NO ,  ,NULL      
password   , varchar(100)         , NO ,  ,NULL      
first_name  , varchar(30)         , NO ,  ,NULL      
last_name  , varchar(30)         , NO ,  ,NULL      
rights   , enum('normal','medium','high','admin','super') , NO ,  ,NULL      
last_loggedin , timestamp          , YES ,  ,NULL      
status   , enum('current','expired','temporary')   , NO ,  ,NULL      
valid   , tinyint(1)          , NO ,  ,NULL      
other_comments , varchar(500)         , YES ,  ,NULL      
gender   , enum('male','female')       , YES ,  ,NULL      
company_position , varchar(50)         , YES ,  , NULL 

任何建議都歡迎!

+2

你有一個空白的電子郵件地址行? – jcsanyi

+0

您不通過電子郵件地址,因此任何空的電子郵件地址記錄將被退回 – DevZer0

+0

「用戶名」可以是實際的用戶名或電子郵件,所以冗餘:用戶名是故意的。它代表用戶用來填寫用戶名輸入字段的任何內容。 – Jonathan

回答

1

這不是一個明確的答案,但我相信我記得PDO和命名綁定參數的錯誤,同一個命名綁定參數出現多次。 (當我們查看它時,它看起來像命名參數被轉換爲位置參數,並且bind_param僅設置其中一個參數。

作爲一種解決方法,我們確保命名參數只出現在聲明。

在你的情況,你可以嘗試(作爲測試)修改SQL,這樣它只有兩個命名綁定參數,如

SELECT * 
    FROM `user` 
WHERE :username IN (`username`,`email`) 
    AND `password`=:password AND `valid`='1'; 

另一種方法是創建第三個命名參數,和爲第三個參數提供單獨的綁定值。

這不是一個確定的答案,只是一種可能允許您調試此問題的方法的建議。

(在本例中,我們去與解決辦法,在SQL語句中的每個命名的參數是獨一無二的,而且我們提供的每個參數單獨綁定。)

+0

嗯,兩個都是好主意!他們似乎還沒有解決這個問題,但我會繼續嘗試。感謝您的建議! **編輯**沒關係!我留下了一個冗餘的'print_r();退出;'在我添加你建議的改變的同時顯示。我拿出來了,你的建議奏效了! – Jonathan

+0

謝謝sooooo多! – Jonathan