2012-12-10 15 views
-2

enter image description here的MySQLi抱怨說, 「唯一的變量應該按引用傳遞」

代碼:

$stmt->bind_param("s", md5($input['user'] . $config['salt'])); 

PHP錯誤消息:

只有變量應參考

傳遞

我一直在做這個項目但我現在卡住了。我是PHP新手。該怎麼辦?

+6

請不要粘貼的代碼截圖。相反,粘貼代碼本身。當行號很重要時,只需指出壞行。 – Charles

+0

http://php.net/language.references.pass – hakre

回答

6

感謝您使用MySQLi準備好的語句!他們是一種痛苦,但它是值得的。

bind_param取值爲參考。它通過查看你傳遞的並直接指向內部的變量來實現。

在您的調用中,您將返回函數調用的字符串結果 - md5。因爲沒有涉及變量,所以沒有內部指向。 PHP因爲不能通過引用傳遞數據而抱怨。

您需要將函數調用的結果粘貼到變量中,然後將該變量傳遞給綁定。

BIG FAT WARNING!md5不是不再是安全哈希,而應該使用而不是來存儲密碼。當你有機會時,你應該更新到更好的散列格式,如bcrypt, PBKDF2, scrypt, etc

+0

謝謝@charles。現在錯誤消失了,但即使我的密碼和用戶名正確,我仍然不會登錄系統。當我點擊提交時,它會引導我進入成員頁面(第54行)。相反,它在第60行顯示錯誤消息。 $ stmt->執行(); $ stmt-> store_result(); if($ stmt-> num_rows> 0){//設置會話變量$ _SESSION ['username'] = $ input ['user']; header(「Location:members.php」); // line 54} else {//用戶名/密碼不正確$ error ['alert'] =「用戶名或密碼不正確!」; // line60 - –

2

bind_param method的每個參數(但第一個)必須是一個變量,而不是你的情況,一個函數返回值。只有變量可以是passed by reference。記住

有了這個,你可以很容易地修改代碼擺脫錯誤消息:

$input['hash'] = md5($input['pass'] . $config['salt']); 
$stmt->bind_param("ss", $input['user'], $input['hash']); 
+0

謝謝@hakre。現在錯誤消失了,但即使我的密碼和用戶名正確,我仍然不會登錄系統。當我點擊提交時,它會引導我進入成員頁面(第54行)。相反,它在第60行顯示錯誤消息。 \t \t \t $ stmt-> execute(); \t $ stmt-> store_result(); \t \t 如果($ stmt-> NUM_ROWS> 0) \t { \t //設置會話變量 \t $ _SESSION [ '用戶名'] = $輸入[ '用戶']; \t \t 標題( 「位置:members.php」); //線54 \t} \t別的 \t { \t //用戶名/密碼不正確 \t $錯誤[ '警報'] =「用戶名或密碼不正確!「; // line60 –

+0

如果您確信用戶名和密碼是正確的,那麼很明顯,他們的處理必須包含的問題。看到這裏的一些一般信息http://php.net/manual/en/faq.passwords.php也請在這裏改進你的問題,並明確你的實際/後續問題。你已經有一些評論昨天,我做我自己的一些局部修改,但請繼續,我停了下來。 – hakre

相關問題