沒有資料庫的架構,不好判斷是否為程式碼的問題。
可能的原因有很多,舉例來說(已排除資料庫連線的問題):
使用 mysqli_num_rows
函式,如果查詢條件不具唯一性,那麼 1
就不會是 mysqli_num_rows
的回傳值。
只是確認查詢是否成功(資料表是否存有資料),將 mysqli_num_rows($result) === 1
改為 $result
即可。
從程式碼能看出,資料表有 帳號
欄位,但是使用 mysqli_fetch_assoc
函式取得查詢結果時,卻是指定 password
欄位。
一般而言,欄位名稱會全部使用英文,不會一下中文一下英文,因此請檢查欄位名稱是否有誤。
儘管只有提問密碼錯誤的問題,但是這裡還是列出未來程式碼可能遇到的問題:
mysqli_query
會有 SQL 注入的風險:如果 Client 的請求包含值為 ‘ OR '1
的 username
參數,就能達成注入的效果。mysqli_fetch_assoc
會自查詢結果取得下一行的資料:程式碼調用 2 次,將會導致第 2 次回傳 null
或其他資料。username
或 password
參數,直接取得 $_POST
變數就會丟出錯誤。題外話,其實 3~5 行的程式碼沒有作用。
不好意思還是沒有成功,我附上資料庫的結構!
目前登入的code
你的欄位是 id、accountname、 pass
但你程式是用 username password 等KEY值來取值。
當然拿不到值啊!!!
我一開始就是用我設的 accountname、pass 來取值結果不管帳號對不對都可以登入,然後新增帳號跟密碼傳到資料庫都是空的
不應該在 $_SESSION
儲存密碼,只要儲存唯一識別碼就好了。此外,記得 mysqli_fetch_assoc
不要調用 2 次嗎?怎麼現在變成 3 次了…
調用 mysqli_fetch_assoc($result)
時,一直指定 ['password']
當然會有問題,因為資料表沒有 password
欄位,程式碼一開始就沒有取得 pass
的值。
先改成這樣再說:
/* 替換第 2 行 */
- $conn = require_once 'mysql.inc.php';
+ require_once 'mysql.inc.php;
/* 刪除第 4 行 */
- include 'mysql.inc.php';
$row = mysqli_fetch_assoc($result);
if ($result && $password === $row['pass']) {
session_start();
$_SESSION['username'] = $row['accountname'];
}
感謝您,懂您的意思了也成功改好了!
我會再去磨練一下資料庫的基本概念跟應用!!
另一個除錯法
在13-15列之間寫
/* fetch associative array */
while ($row = mysqli_fetch_assoc($result)) {
printf("%s (%s)\n", $row["帳號"], $row["password"]);
}
看看資料庫有沒有成功撈出來你預期的帳號密碼
參考資料來源
認真來說,從各位大大們給你的答案。跟你的回答來看。
我發現你完全沒理解大大們跟你說的事。
如果你是初學資料庫操作的話。我會建議你重新再來一次。
並且學習使用PDO的方式來操作。
並去了解一下資料庫的應用為何。
不要東抄西抄的。然後還抄個四不像出來。
認真來說,在PHP8已經預設不使用 mysqli 的相關函式了。
(當然還是可以再掛模組進來使用就是了,只是預設不在是預設需要掛入的模組了)
所以學習mysqli的函數已不太適合了。建議你還是直接學習PDO的應用。