我知道这个问题之前已经得到了回答,但每个问题都是针对每个人的代码。如果有人能告诉我为什么if和else语句都在执行,我将不胜感激。该脚本是我正在开发的一个论坛软件的登录脚本的一部分。 谢谢 罗比
<?php
$username = $_POST['username'];
$password = md5($_POST['password']);
session_start();
include($_SERVER['DOCUMENT_ROOT']."/forum/config.php");
$connect = mysqli_connect($DBHOST,$DBUSER,$DBPASS,$DBNAME);
if ($connect->connect_errno) {
die('Connection Error: ' . $connect->connect_errno);
}
$query = $connect->query("SELECT * FROM forum_users");
while($row = $query->fetch_array()){
if (($row['username'] == $username) AND ($row['password'] == $password)) {
$_SESSION['username']=$username;
echo '<script language="javascript">';
echo 'window.location.href = "../forum/"';
echo '</script>';
} else {
echo '<script language="javascript">';
echo 'window.location.href = "../forum/login?password=wrong"';
echo '</script>';
}
}
?>
答案 0 :(得分:1)
您正在从数据库中获取所有用户数据(SELECT * FROM forum_users
)。如果您有多个具有不同名称或密码的用户,else
语句将独立执行用户名和密码输入,因为用户名和密码只能匹配数据库中的一个条目。
您应该删除while
循环并将其替换为
$row = $query->fetch_array();
if ($row) {
if (($row['username'] == $username) AND ($row['password'] == $password)) {
$_SESSION['username']=$username;
echo '<script language="javascript">';
echo 'window.location.href = "../forum/"';
echo '</script>';
} else {
echo '<script language="javascript">';
echo 'window.location.href = "../forum/login?password=wrong"';
echo '</script>';
}
}
修改强>
您还可以使用
在查询中执行整个密码检查$secureUsername = mysql_real_escape_string($username);
$securePassword = mysql_real_escape_string($password);
$query = $connect->query("SELECT * FROM forum_users WHERE username='" . $secureUsername . "' AND password='" . $securePassword . "'");
并检查行数是否等于1。
答案 1 :(得分:0)
- 编辑 - 在上面的Simon的帖子中介绍了在查询中包含用户名和密码
... 然后只运行一次:
$row = $query->fetch_array();
if ($row) {
$_SESSION['username']=$username;
echo '<script language="javascript">';
echo 'window.location.href = "../forum/"';
echo '</script>';
} else {
echo '<script language="javascript">';
echo 'window.location.href = "../forum/login?password=wrong"';
echo '</script>';
}
当您将凭据放入查询时,您可以通过执行$ query的count()或者获取一行并查看它是否正确返回(如果它没有',可以轻松找出用户名和密码是否匹配t,用户名或密码错误。)