我正在嘗試實現(xiàn)一個登錄系統(tǒng),除了這個返回 0 的 PHP 腳本外,它主要工作:// $username_err & $password_err is empty, gets reset every time as "".if(empty($username_err) && empty($password_err)){ $query = "SELECT rowid, username, password FROM admin_login WHERE username = ?"; if($stmt = mysqli_prepare($db, $query)){ mysqli_stmt_bind_param($stmt, "s", $param_username); $param_username = $username; if(mysqli_stmt_execute($stmt)){ mysqli_stmt_store_result($stmt); // Doesn't work here, works up until here. if(mysqli_stmt_num_rows($stmt) == 1){ mysqli_stmt_bind_result($stmt, $rowid, $username, $hashed_password); if(mysqli_stmt_fetch($stmt)){ if(password_verify($password, $hashed_password)){ session_start(); $_SESSION["loggedin"] = true; $_SESSION["id"] = $rowid; $_SESSION["username"] = $username; header("location: index.php"); }else{ $password_err = "Invalid password"; } } }else{ $username_err = "No such account exists."; } }else{ echo "An error occurred."; } }mysqli_stmt_close($stmt);}mysqli_close($db);這永遠(yuǎn)不會奏效,因為它卡住了,因為它不滿足條件 mysqli_stmt_num_rows == 1,而是返回 0。它確實通過 MySQL 直接通過 Workbench 工作:SELECT rowid, username, password FROM admin_login WHERE username = "admin";確實返回具有匹配條件的 1 行。** 編輯:這是我的新代碼;**<?phprequire_once "_php/login/config.php";$username = $password = "";$err = "";它拋出:致命錯誤:未捕獲錯誤:在目錄/login_script.php:25 中的布爾值上調(diào)用成員函數(shù) fetch_assoc()堆棧跟蹤:#0目錄/login.php(2): require() #1 {main} 拋出目錄/第 25 行的 login_script.php作為參考,login_script 是PHP 腳本,login 是php 的前端。
1 回答

瀟湘沐
TA貢獻(xiàn)1816條經(jīng)驗 獲得超6個贊
你永遠(yuǎn)不需要那個無用的 num_rows 東西。您已經(jīng)有來自 fetch() 的一行。在您有使用 num_rows 的想法的任何地方使用它。
當(dāng)它為 0 時(或者更確切地說,唯一獲取的行是假的),這意味著您的查詢沒有找到給定輸入值和當(dāng)前數(shù)據(jù)庫內(nèi)容的行。就如此容易。這是你的問題的答案。簡單、直接、合乎邏輯。
也就是說,這段代碼比它需要的要膨脹三倍。請參閱我為使用 mysqli 檢查密碼而編寫的規(guī)范代碼。驗證您的輸入值、數(shù)據(jù)庫內(nèi)容并檢查錯誤 - 它將完美運行。
- 1 回答
- 0 關(guān)注
- 413 瀏覽
添加回答
舉報
0/150
提交
取消