2013-07-26 19 views
1

我想查詢一個數據庫,以檢查用戶的詳細信息後是否已經註冊一個電子郵件。嚴格標準:只有變量應該通過引用傳遞 - 爲什麼這仍然有效,我該如何糾正它?

不過,我得到一個「嚴格的標準:只有變量應該按引用傳遞」錯誤與下面的代碼(節選):

} else if (isset($_POST['srSubmit']) && $_POST['srEmail']) { 

    //check if email already taken 
    if ($stmtreg = $mysqli->prepare("SELECT user_email FROM users WHERE user_email = ?")) { 
     $stmtreg->bind_param("s", strtolower($_POST['srEmail'])); 
     $stmtreg->execute(); 
     $stmtreg->store_result(); 
     $num_rows = $stmtreg->num_rows(); 
     $stmtreg->bind_result($email); 
     $stmtreg->fetch(); 
     $stmtreg->close(); 
    } 

我有兩個問題:1)爲什麼腳本仍然工作,即使有這個錯誤? ii)是什麼原因造成的,我該如何解決?

感謝

+0

「嚴格標準」是不是一個錯誤,這是一個警告/通知,所以這就是它工作的原因。他們爲最佳實踐提供諮詢服務,而不是「某些工作無法正常工作」。也就是說,我在這裏看不到任何參考 - 你確定這與錯誤的行號相匹配嗎? – ceejayoz

+0

可能重複[嚴格標準:只有變量應該通過引用傳遞](http://stackoverflow.com/questions/2354609/strict-standards-only-variables-should-be-passed-by-reference) –

回答

4

設置一個臨時變量strtolower($_POST['srEmail']),是這樣的:

$email = strtolower($_POST['srEmail']); 

然後通過$email到您的bind_param。即使strtolower()返回一個字符串,PDO不能引用它,因爲它不是一個變量。

1

不能回答你的第一個問題,但在這裏是你如何通過引用傳遞:

//check if email already taken 
if ($stmtreg = $mysqli->prepare("SELECT user_email FROM users WHERE user_email = ?")) { 
    $email = strtolower($_POST['srEmail']); 
    $stmtreg->bind_param("s", &$email); 
    $stmtreg->execute(); 
    $stmtreg->store_result(); 
    $num_rows = $stmtreg->num_rows(); 
    $stmtreg->bind_result($email); 
    $stmtreg->fetch(); 
    $stmtreg->close(); 
} 

爲了通過引用傳遞變量,你需要前把一個&變量的名稱(例如&$email

+0

謝謝,這會導致致命錯誤:呼叫時傳遞引用已被刪除(第3行)。這可能是我的代碼中的其他地方的錯誤? – alias51

+0

@ alias51,這不會解決你的問題。他正在回答一個在這種情況下不會幫助你的另一個問題。刪除傳入'bind_param'的'$ email'中的&,它會正常工作 – Prisoner

0

看這句話:

$stmtreg->bind_param("s", strtolower($_POST['srEmail'])); 

由於php manual for bind_param說:

bool mysqli_stmt::bind_param (string $types , mixed &$var1 [, mixed &$... ]) 

此功能需要通過引用傳遞的變量。雖然你沒有給它傳遞價值:strtolower函數的結果。

要看到差距看看這個代碼:

<?php 
function foo(&$var) 
{ 
    $var .= "!"; 
} 

$a = "1"; 
foo($a); 
print $a; 
print "\n"; 

$b = "1"; 
foo(strtolower($b)); 
print $b; 
?> 

它會打印:

1! 
1 

$ B沒有被修改,因爲PHP不具有可變修改。 http://www.php.net/manual/en/language.references.pass.php

所以,你的結果保存到一個變量,並通過它來代替:

$email = strtolower($_POST['srEmail']); 
$stmtreg->bind_param("s", $email); 

"why does the script still work, even with this error?"

因爲你只需要與值替換爲參數,而不是修改bind_param功能的輸入變量。

0

問:爲什麼這個腳本仍然工作?

因爲這是一個警告,不是一個真正的錯誤。

問:是什麼原因造成的?

這是導致錯誤的線。

$stmtreg->bind_param("s", strtolower($_POST['srEmail'])); 

bind_param期待VARIABLE作爲第二個參數。函數strtolower返回一個字符串,而不是一個變量。

問:我該如何解決這個問題?解決這個問題

的方法之一是分配從用strtolower一個變量返回,然後引用變量bind_param:

$lower_email = strtolower($_POST['srEmail']); 
$stmtreg->bind_param("s", $lower_email); 
相關問題