[英]PHP strange behaviour using mysqli
我在PHP中實現了以下代碼:
function attemptDBConnection($shouldRedirect){
$con=mysqli_connect("localhost","root","root","mydb");
if ($con->connect_errno && shouldRedirect)
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
header("Location: ./errorPages/nodbconnection.html");
}
return $con;
}
function isAlreadyRegistered($con){
$email=$_POST["email"];
$testSelectUser=$con->stmt_init();
$testSelectUser->prepare("SELECT * from User WHERE email=?;");
$testSelectUser->bind_param("s",$email);
$testSelectUser->execute();
$resultUser=$testSelectUser->get_result();
$rowsUser=mysqli_num_rows($resultUser);
return $rowsUser>0;
}
$con=attemptDBConnection(true);
if(isAlreadyRegistered($con)){
header("Location: ./errorPages/alreadyregistered.html");
mysqli_close($con);
exit;
}
並且發生了以下事情:當調用tryDBConnection時,mysqli_connect執行ok並且沒有為$ con設置errno,此時$ con-> affected_rows為0。$ con-> connect_errno為零,因此從不輸入if,但是在條件設置為$ con-> affected_rows設置為-1 dunno為什么!
然后返回$ con。
當isAlreadyRegistered函數執行時,execute調用返回true,但$ testUserSelect-> affected_rows設置為-1,但errno為0。 下一次對get_result()的調用永不返回。
是什么導致這種情況發生? 我究竟做錯了什么?
PHP對我來說還很新,我一直無法弄清這里發生了什么。 謝謝。
編輯:
我進行了一些測試:如果我為此替換isAlreadyRegistered()函數:
function isAlreadyRegistered($con){
$email=$_POST["email"];
$testSelectUser=$con->stmt_init();
$testSelectUser->prepare("SELECT * from User WHERE email='myemail@gmail.com';");
$testSelectUser->execute();
$resultUser=$testSelectUser->get_result();
$rowsUser=mysqli_num_rows($resultUser);
return $rowsUser>0;
}
然后我得到相同的結果。
相反,如果我這樣做:
function isAlreadyRegistered($con){
$email=$_POST["email"];
$testSelectDoc="SELECT * from ask2doc.Medico WHERE email='myemail@gmail.com';";
$resultDoc=mysqli_query($con,$testSelectDoc);
$rowsDoc=mysqli_num_rows ($resultDoc );
return $rowsDoc>0;
}
然后就可以了。 知道為什么嗎?
根據mysqli_affected_rows的文檔,-1表示在最后一個查詢中有錯誤。
檢查$testSelectUser->error
但是您使用的查詢很可能是錯誤的。
試試這個快速代碼(未經測試,我希望它能工作..):)
function isAlreadyRegistered($con){
$email= !empty($_POST["email"]) ? $_POST["email"] : '';
$testSelectUser=$con->stmt_init();
$testSelectUser->prepare("SELECT * from User WHERE email=?;");
$testSelectUser->bind_param("s",$email);
$testSelectUser->execute();
$testSelectUser->store_result();
return $testSelectUser->num_rows > 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.