2013-06-23 175 views
0

我正在爲一個站點建立一個簡單的登錄功能,並且遇到了一些麻煩。當我嘗試登錄該網站時,我不斷收到用戶名和密碼不匹配的錯誤。這當然是我自己定義的錯誤,但問題是我不應該在這種情況下得到它。MySQL查詢雖然PHP不返回值

我打印計算出來的密碼散列,並確保這一步正確執行,它是。在此之後,我跑

SELECT * FROM members WHERE user='username' AND pass='hashed_password'; 

直接朝我的MySQL數據庫,直接提供用戶名和哈希值。這返回了所需的值。我的PHP代碼如下所示:

$dsn = "mysql:host=localhost;dbname=my_db"; 
$u = "localhost"; 
$pdo = new PDO($dsn,$u); 
$query = $pdo->prepare("SELECT * FROM members WHERE user=':username' AND pass=':hashed_pass'"); 
$query->execute(array(':username'=>$username,':hashed_pass'=>$hashed_pass)); 
$result = $query->fetch(); 
if($result){ 
    //Log in user 
}else{ 
    //Print error 
} 

這不返回任何東西,即使我提供正確的價值觀,它不斷給我的錯誤。我不確定什麼可能會導致這個問題,但是如果我猜測,我會說它與這些字符集有關。我的數據庫使用UTF-8。儘管如此,當通過編碼直接查詢數據庫時,我仍然從MySQL獲得期望的結果。編碼爲ISO-8859。所以我真的不確定。任何幫助將非常感激!

+0

$ username和$ hashed_pa​​ss從哪裏來,你確定它們包含正確的值嗎?使用回聲來確認這一點。 –

+0

這是完全不相關的,但你最好用用戶名選擇用戶,然後將結果用戶表的密碼與使用PHP的散列密碼相匹配。 – CreativityKills

+0

@CreativityKills不確定我同意這一點。 –

回答

2

嘗試刪除引號。如果用引號括起來,PDO不會替換給定的參數。

例子:

$st = $db->prepare('INSERT INTO users (name, surname) VALUES(:name, ":surname")'); 
$st->execute(array(':name' => 'John', ':surname' => 'Carlo')); 

結果:

- >約翰:姓

您還可以使用debugDumpParams看參數是正確或不。 http://www.php.net/manual/en/pdostatement.debugdumpparams.php

+0

這樣做!非常感謝你! – Psyberion