3 回答

TA貢獻1828條經驗 獲得超3個贊
這是一個很好的問題,因為根據現代安全和應用程序設計標準,這些行大多是錯誤的或無用的。我從來沒有想過僅僅兩行代碼就會有這么多錯誤。
mysqli_query()
將您的查詢發送到 MySQL 服務器。但是,這不是您使用 variables運行 mysql 查詢的方式。一個事先準備好的聲明必須代替。die(mysqli_error($connection))
目的是在查詢執行失敗并顯示mysql錯誤時停止代碼執行(特別是or die()
做了很多有趣的事情,我有一篇文章解釋了這一點。然而,這不是你在PHP中報告mysql錯誤的方式。單一配置必須使用 option 來代替。這在很多方面都會更好,從編寫的代碼量到更好的用戶體驗。mysqli_num_rows($result)
告訴您有多少行返回了您的查詢。一個本質上沒用的函數,你總是可以使用返回的數據代替WHERE username='$username' and password='$password'
不是您在數據庫中檢查密碼的方式。甲散列密碼必須從數據庫中檢索,然后使用password_verify()函數檢查
這是應該的樣子
$stmt = $mysqli->prepare("SELECT * FROM dataforlogin WHERE username = ?");
$stmt->bind_param("s", $username);
$stmt->execute();
$result= $stmt->get_result()
$user = $result->fetch_assoc();
if ($user && password_verify($password, $user['password']))
{
// write some info into the session
header("location: ../staudal/dashboard/index.php");
exit;
} else {
echo "invalid";
}
在第一行中,我們正在準備 sql 查詢,其中問號放在變量應該去的地方(所以它被稱為占位符)。
在第二行中,我們將實際變量綁定到占位符,因此它將被發送到與查詢分離的 mysql 服務器,它們將無法干擾。
然后查詢被實際執行。
然后我們得到了
mysqli_result
舊 mysql 或新 mysqli 查詢的所有用戶都熟悉的變量 - 查詢返回的實際數據源。然后我們試圖獲取選定的行。
然后我們同時檢查兩件事,
我們的查詢是否返回任何行
如果是,從表單發送的密碼是否與使用 password_verify() 函數存儲在數據庫中的密碼相同
其余的與您的代碼相同,但有兩件事
在重定向用戶之前,您應該將有關他們的一些信息寫入會話,以便在其他頁面上識別他們
exit
在發送 Location 頭之后添加是一個很好的做法。
希望這些解釋對你的老師來說已經足夠了
說真的,這個問題應該提高人們對 PHP 教育狀況的認識。大多數來源,在線和離線,都在教導,就好像它仍然是 PHP3 一樣,只有在不推薦使用的功能方面進行了輕微的改頭換面。但是這種方法在很多方面都是錯誤的,但仍然保持不變。

TA貢獻1785條經驗 獲得超4個贊
首先我想說,請使用準備好的語句。
$result = mysqli_query($connection, $query) or die(mysqli_error($connection));
該mysqli_query()
函數對數據庫執行查詢,$connection
變量打開一個到您已經在db_connect.php 中創建的 MySQL 服務器的新連接,并檢查連接是否已建立。如果沒有,則die()
函數將運行。它用于打印消息并退出當前的 php 腳本。
$count = mysqli_num_rows($result);
mysqli_num_rows()
函數將返回結果集中的行數,您將該數字存儲到$count
變量中。
希望這對你有幫助

TA貢獻1776條經驗 獲得超12個贊
我是一名初級開發人員,但我希望這個答案會根據您的代碼有所幫助:
$result = mysqli_query($connection, $query) 或 die(mysqli_error($connection));
$result 是一個 php 變量
mysqli_query($connection, $query) 表示 mysqli_query 將使用你的 db_connect.php 中聲明的數據庫連接數據庫來運行查詢 [$query = "SELECT * FROM dataforlogin WHERE username='$username' and password='$password' ";]
或死(mysqli_error($connection)); 意味著如果mysqli_query沒有找到指定的數據庫或表,在這種情況下(dataforlogin),它會顯示你的db_connect.php中指定的連接錯誤
$count = mysqli_num_rows($result);
$count 是一個 php 變量
mysqli_num_rows($result); 表示 $count 等于在運行 mysqli_query($connection, $query) 時 $result 在表 (dataforlogin) 中找到的行數。
注意:請避免使用 --- or die(mysqli_error($connection) 行,因為它可能會阻止頁面加載,這不是必需的。
- 3 回答
- 0 關注
- 246 瀏覽
添加回答
舉報