我已經被這個問題困了 3 天了。我正在嘗試制作一個登錄表單(我已經創建了一個注冊表)并且資料庫也在作業。但是現在當我嘗試制作登錄表單時,我注意到 PHP 只從資料庫中獲取最后一行。

正如您在第一張圖片中清楚地看到的那樣,我的資料庫有 3 條記錄。
但是當我嘗試登錄我的帳戶時,它只允許我登錄到最近創建的帳戶,而不是其他帳戶。這是我當前的代碼:
<div class="login-form">
<form method="POST">
<p style="float:left;">
<input type="email" class="login-input" maxlength="40" name="login-email" id="login-email" placeholder="email" required><span style="color: red;"> *</span><br><br>
<input type="password" class="login-input" maxlength="32" name="login-passw" id="login-passw" placeholder="password" required><span style="color: red;"> *</span><br><br>
<input type="submit" class="btn" name="login-btn">
</p>
<?php
$email = $_POST["login-email"];
$passw = $_POST["login-passw"];
$encrypted_passw = md5($passw);
$sql = "SELECT id, email, passw FROM users";
$result = $db->query($sql);
// if (isset($_POST["login-btn"])) {
// if ($_POST["login-email"] == $result["email"]) {
// echo "<p>Logged in</p>";
// } else {
// echo "<p>wrong</p>";
// }
// }
while ($row = $result->fetch_assoc()) {
$get_email = $row["email"];
$get_usr = $row["username"];
$get_passw = $row["passw"];
}
if (isset($_POST["login-btn"])) {
if ($_POST["login-email"] == $get_email && $encrypted_passw == $get_passw) {
echo "<p>Logged in</p>";
} else {
echo "<p> wrong</p>";
}
}
?>
</form>
</div>
uj5u.com熱心網友回復:
試試這個。首先,我會將 php 代碼放在 HTML 上方。
你只需要聽 post param login-btn。將其他帖子資料讀入 vars 并在繼續之前確認其存在。
當您輪詢資料庫時,您不需要讀取每條記錄(假設您有數千條記錄,您不會想要將它們全部拉下來)。只需使用 where 子句過濾提供的電子郵件即可。
如果電子郵件存在,它將回傳帶有散列密碼的結果。驗證此匹配,您就可以開始了。
您在使用 db 中的最后一條記錄時遇到的問題是因為在您的回圈中,您$get_email每次都覆寫 var 。
<?php
if (isset($_POST["login-btn"])) {
$email = (isset($_POST["login-email"]) ? $_POST["login-email"] : '');
$passw = (isset($_POST["login-passw"]) ? $_POST["login-passw"] : '');
if($email != "" && $passw != ""){
$encrypted_passw = md5($passw);
$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'world');
$stmt = $mysqli->prepare("SELECT email, passw FROM users where email = ?");
$stmt->bind_param($email);
$stmt->execute();
while ($row = $result->fetch_row()) {
$get_passw = $row["passw"];
if($encrypted_passw == $row['passw']){
echo "logged in";
}else{
echo 'no match';
}
}
}
}
?>
<div class="login-form">
<form method="POST">
<p style="float:left;">
<input type="email" class="login-input" maxlength="40" name="login-email" id="login-email" placeholder="email" required><span style="color: red;"> *</span><br><br>
<input type="password" class="login-input" maxlength="32" name="login-passw" id="login-passw" placeholder="password" required><span style="color: red;"> *</span><br><br>
<input type="submit" class="btn" name="login-btn">
</p>
</form>
</div>
uj5u.com熱心網友回復:
將您的查詢更改為此
"SELECT id, email, passw FROM users where email='".$row["email"]."' and password='".$row["password"]."'"
您不需要對所有行使用 foreach 此查詢僅回傳您需要的一行
uj5u.com熱心網友回復:
哥特!我使用的是陣列而不是值
<?php
session_start();
include_once "../php/db_connect.php";
if (isset($_POST["login-btn"])) {
$email = $_POST["email"];
$passw = $_POST["passw"];
$encrypted = md5($passw);
$sql = "SELECT * FROM users WHERE email = '". $email ."'";
$result = $db->query($sql);
$get_result = $result->fetch_assoc();
if ($encrypted == $get_result["passw"]) {
echo "<p>Logged in!</p>";
$_SESSION["username"] = $get_result["username"];
$_SESSION["id"] = $get_result["id"];
$_SESSION["email"] = $get_result["email"];
Header("Location:../../../");
} else {
echo "<p>Error</p>";
}
}
?>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/380083.html
