PHP & MySQL 登录认证数据库检查不能正常工作?
Posted
技术标签:
【中文标题】PHP & MySQL 登录认证数据库检查不能正常工作?【英文标题】:PHP & MySQL login authentication database check not working properly? 【发布时间】:2016-01-08 19:22:09 【问题描述】:我正在使用 php/html 和 mysql 进行测试登录检查。我得到它的工作很棒;它成功连接到数据库,它可以获取我的数据库值并将它们保存在变量中等,但我遇到了一个小问题。
我正在使用两个 PHP 页面进行检查。 login.php
页面,仅包含论坛,welcome.php
页面,进行数据库连接。当我运行一个测试页面以让它回显数据库信息时,它会正确打印出来(testUser、testEmail@email.com、testPassword、1/1/1900)。因此,当我尝试运行登录身份验证检查时,它只会显示“未知用户!”两次,即使我尝试使用用户名“usr”、“testUser”和“testUser2”(我制作了两个表,第二个表相同,最后添加了 2)。这是我的代码。
<html>
<head>
<?php
$title = ucfirst(basename($_SERVER['PHP_SELF'], ".php"));
echo "<title>$title</title>";
?>
</head>
<body>
<form name="form" accept-charset="utf-8" action="welcome.php" method="post">
<span class="header">Username</span><input type="text" name="usr" value="usr"></input><br>
<span class="header">Password</span><input type="text" name="pass" value="pass"></input>
<input type="submit">
</form>
</body>
</html>
<?php
$servername = removed;
$username = removed;
$password = removed;
$dbname = removed;
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error)
die("Connection failed: " . $conn->connect_error);
$sql = "SELECT ID, USER, PASSWORD FROM usrdatabase";
$result = $conn->query($sql);
if ($result->num_rows > 0)
// output data of each row
while($row = $result->fetch_assoc())
// the given info from the form
$usrUser = $_POST["usr"];
$usrPass = $_POST["pass"];
// convert the findings to uppercase to get rid of sensitivity
if (strtoupper($usrUsr) == strtoupper($row["USER"]) && strtoupper($usrPass) == strtoupper($row["PASSWORD"]))
echo "Welcome $usrUser!<br>Your login was successful! ?>";
elseif (strtoupper($usrUsr) == strtoupper($row["USER"]) && strtoupper($usrPass) != strtoupper($row["PASSWORD"]))
echo "Login failed as $usrUser!";
else
echo "Unknown user!";
else
echo "0 results";
$conn->close();
?>
这总是会产生“未知用户!”我的支票有问题吗?我希望它通过数据库中的每个用户来检查每个现有用户的信息。
【问题讨论】:
请使用 PHP 的built-in functions 来处理密码安全问题。如果您使用的 PHP 版本低于 5.5,您可以使用password_hash()
compatibility pack。
您真的应该只从数据库中检索单个用户,而不是让所有用户都循环通过。这确实效率低下,并且随着用户数量的增加会让人头疼。
在数据库中存储纯文本密码会使这个问题明确不道德地回答。
在打开<?php
标签error_reporting(E_ALL); ini_set('display_errors', 1);
后立即将错误报告添加到文件顶部
如果是我,我会把我的条件句弄得很小,看看它在哪里。取出除第一个条件之外的所有内容并减少该条件,直到您看到发生了什么。
【参考方案1】:
改变
strtoupper($usrUsr) == strtoupper($row["USER"])
到
strtoupper($usrUser) == strtoupper($row["USER"])
使用用户名从数据库中获取单个用户,因为它们对于每个用户都是唯一的。
$sql = "SELECT ID, USER, PASSWORD FROM usrdatabase WHERE USER = '" . mysqli_real_escape_string($_POST['usr']) . "' AND PASSWORD = '" . mysqli_real_escape_string($_POST['pass']) . "'";
【讨论】:
【参考方案2】:嘿,我看到你的 if else 包含 $usrUsr
不应该是 $usrUser
吗? (忘记了e)
【讨论】:
以上是关于PHP & MySQL 登录认证数据库检查不能正常工作?的主要内容,如果未能解决你的问题,请参考以下文章