2013-10-29 43 views
0

所以我想做一個簡單的登錄,它的工作原理,但是當我使用bind_param,它總是顯示0行。使用mysqli登錄時通過bind_param incerrting值worngng

下面是代碼:

session_start(); 
include("config.php"); 
$email = $_POST['email']; 
$password = $_POST['password']; 

if ($sql = $mysqli->prepare("SELECT email FROM user WHERE email='?' AND password LIKE SHA1('?')")) { 

    $sql->bind_param('ss',$email, $password); 

    $sql->execute(); 

    $sql->store_result(); 

    $num = $sql->num_rows; 

    $sql->close(); 

    if($num>0){ 
     echo "true"; 
    }else{ 
     echo "false"; 
    } 
} 

我確定收到電子郵件和密碼字段,但查詢只得到結果時,我手動輸入的,而不是「?」並刪除bind_param。

我知道這很簡單,但我無法弄清楚什麼是錯的。

在此先感謝。

+2

你'' '?':這不是一個參數,它的字面''? –

+0

我需要使用'?'否則查詢將不起作用;) – Th3lmuu90

+1

您是否嘗試過'$ password = sha1($ _ POST ['password']);'然後在您的查詢中輸入'... AND password LIKE?' – Kender

回答

1

從刪除單引號?,

if ($sql = $mysqli->prepare("SELECT email FROM user WHERE email='[email protected]' AND password LIKE SHA1(?)")) { 

    $sql->bind_param('s', $password); 

相反LIKE SHA(?)的,

你可以使用支票,

$sql = $mysqli->prepare("SELECT email FROM user WHERE email='[email protected]' AND password = SHA1(?)"); 
+0

需要引號才能正常工作。 – Th3lmuu90

+0

謝謝,我已經找到解決方案;) – Th3lmuu90

+1

?參數不需要引用th3lmuu90。 Ref -link:http://www.php.net/manual/en/mysqli.prepare.php –

0

請在usage example仔細看看:

$mysqli->prepare("SELECT District FROM City WHERE Name=?") 
                ^

如果引用佔位符,它不再有任何特殊的含義:它成爲一個字面問號。

+0

謝謝,我已經找到了解決方案;) – Th3lmuu90

0

第一次使用

$password = sha1($_POST['password']); 

然後用

... AND password LIKE ?... 
+0

那麼MySQL的SHA1()函數有什麼問題? –

+0

爲什麼常見的散列函數如md5()和sha1()不適合密碼?散列算法(如MD5,SHA1和SHA256)的設計非常快速和高效。使用現代技術和計算機設備,爲了確定原始輸入,將這些算法的輸出「暴力」變得微不足道。 由於現代計算機能夠「反轉」這些散列算法的速度有多快,因此許多安全專家強烈建議不要使用密碼散列。 – Kender

+0

以上取自 - http://www.php.net/manual/en/faq.passwords.php#faq.passwords.fasthash – Kender