即使使用错误的用户名和密码(PHP/mySql),登录也会指向主页
我的登录表单即使使用错误的用户名和密码也能正常工作。我试着寻找答案,但找不到我的错误。代码如下:即使使用错误的用户名和密码(PHP/mySql),登录也会指向主页,php,mysql,Php,Mysql,我的登录表单即使使用错误的用户名和密码也能正常工作。我试着寻找答案,但找不到我的错误。代码如下: <?php include 'database.php'; ?> <?php if($_SERVER["REQUEST_METHOD"] == "POST"){ $username = mysqli_real_escape_string($connect,$_POST['username']); $password = mysqli_re
<?php
include 'database.php'; ?>
<?php
if($_SERVER["REQUEST_METHOD"] == "POST"){
$username = mysqli_real_escape_string($connect,$_POST['username']);
$password = mysqli_real_escape_string($connect,$_POST['password']);
$query = "SELECT username, password FROM tbl_membership WHERE username =
'$username' AND password = '$password'";
$result = mysqli_query($connect, $query);
$row = mysqli_fetch_array($result,MYSQLI_ASSOC);
$active = $row['active'];
$count = mysqli_num_rows($result);
if(mysqli_num_rows($query) > 0){
$_SESSION["username"] = $username;
$_SESSION["password"] = $password;
header("location: welcome.php");
exit();
}if (mysqli_num_rows($query) != 0){
echo "Invalid.";
}
}
?>
1:
请看这一行:
if(mysqli_num_rows($query) > 0) {
变量$query
在这里是一个字符串。您需要使用刚刚设置的$count
变量
// Check if we have a result and just one result
if($count == 1) {
2:
如果行有一个结果,则只需要获取行内容
$count = mysqli_num_rows($result);
if ($count == 1) {
$row = mysqli_fetch_array($result,MYSQLI_ASSOC);
$active = $row['active'];
}
3:
尽量使用准备好的语句来避免SQL注入。在这种情况下,转义字符串是一个好的开始
$stmt = $conn->prepare("SELECT username, password FROM tbl_membership WHERE username =? AND password =?");
$stmt->bind_param('ss', $username, $password);
$stmt->execute();
$get_result = $stmt->get_result();
$row_count = $get_result->num_rows;
if ($row_count == 1) {
$row = $get_result->fetch_assoc();
$active = $row['active'];
$_SESSION["username"] = $username;
header("location: welcome.php");
exit();
} else {
echo "Invalid.";
}
4:
不要将密码保存为纯文本。强烈建议不要这样做,这会给您的客户/访客带来安全问题。使用某种形式的散列 永远不要以明文形式存储密码!。只存储密码哈希!使用PHP的和。如果您运行的PHP版本低于5.5(我真的希望您不是),您可以使用来获得相同的功能。了解防止SQL注入的准备语句在If
mysqli\u num\u rows($query)
中使用$count而不是mysqli\u num\u rows($query)$query
是一个字符串…您是否检查了错误日志?一个好主意是在本地PHP环境中打开display\u errors
。请在此处阅读更多:。这很可能会给你一些错误和警告。没有任何解释吗?一个好的答案包括一个关于你改变了什么,为什么以及如何解决这个问题的解释。不要仅仅发布一段代码,因为它不是建设性的。顺便说一句,OP不应该使用这两种方式,因为它没有使用预先准备好的语句,并且仍然依赖于使用明文密码。@MagnusEriksson我的老师告诉我没有不好的问题和好的答案。答案“回答”问题时有效。不过,有些解释很有用:)@Peter不是那个家伙,但我强烈反对你的老师。:-)
$stmt = $conn->prepare("SELECT username, password FROM tbl_membership WHERE username =? AND password =?");
$stmt->bind_param('ss', $username, $password);
$stmt->execute();
$get_result = $stmt->get_result();
$row_count = $get_result->num_rows;
if ($row_count == 1) {
$row = $get_result->fetch_assoc();
$active = $row['active'];
$_SESSION["username"] = $username;
header("location: welcome.php");
exit();
} else {
echo "Invalid.";
}