由于某种原因,$ password(从表单发送的密码)显示为空白。
我使用以下代码手动检查:
echo "<p>$username does not match $firstandlast</p>";
echo "<p>$password does not match $dbpassword</p>";
这是我的代码......
<?php
if(isset ($_POST['submit'])) {
$username = $_POST['name'];
$password = $_POST['pw'];
if ($username&&$password){
require('includes/cxn.php');
$login_query = "SELECT * FROM users WHERE username='$username'";
$result = mysqli_query($cxn,$login_query) or die("Couldn't execute query.");
$numrows = mysqli_num_rows($result);
if($numrows!=0){
while ($row = mysqli_fetch_assoc($result))
{
$firstandlast = $row['firstName'] . " " . $row['lastName'];
$dbpassword = $row['password'];
$userID = $row['userid'];
if ($username==$firstandlast&&$password==$dbpassword){
echo "You are now logged in! <a href='profile.php?userID=" . $userID . "'>Click Here</a> to continue.";
$_SESSION['username'] = $dbusername;
$_SESSION['id'] = $userID;
}
else {
echo "<p>$username does not match $firstandlast</p>";
echo "<p>$password does not match $dbpassword</p>";
echo "Password does not exist.";
}
}
} else {
echo "This user doesn't exist.";
}
} else {
die("You Must Enter both a username and password");
}
} else {
echo "
<div id='login'>
<form action='login.php' method='post' id='loginform'>
<table>
<tr>
<td width='90'>Name:</td>
<td width='825'><input type='text' name='name' /></td>
</tr>
<tr>
<td>Password:</td>
<td><input type='password' name='pw' /></td>
</tr>
<tr>
<td> </td>
<td><button type='submit' name='submit'>Sumbit</button></td>
</tr>
</table></form></div>";
}
?>
答案 0 :(得分:3)
需要考虑的一些事项:
if(isset ($_POST['submit'])) {
仅当表单中的提交按钮具有name="submit"
输入元素时才有效,但情况可能并非总是如此。您可能忘记将其添加到提交按钮中。更好的检查是:
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
如果表单是POST,则无论提交了哪些字段或点击了按钮,都是如此。
if ($username&&$password){
可以更好地重写为:
if(!empty($username) && !empty($password)) {
最好明确说明你希望它们是非空的,以便日后其他人更容易理解。
$ login_query =“SELECT * FROM users WHERE username ='$ username'”;
这只是要求一些SQL注入优点来破坏你的系统。关于SQL注入是什么以及如何解决它有很多资源,所以我不会在这里重复它。请在解决之前进行修复(并考虑如果有人尝试使用' OR 1=1
作为用户名登录时会发生什么。
while ($row = mysqli_fetch_assoc($result))
假设您的表格构建正确,查询中只有两个可能的结果。没什么,因为用户名不存在;或一行,表示该用户的数据。没有必要循环来获取所有匹配的用户名。当然,也许您允许多个“John Smith”帐户,并通过他们的密码识别它们,但这是相当不安全的。如果约翰史密斯#1的密码与约翰史密斯#2的密码非常相似,并且两个“猜测”其中一个通过输入错误怎么办?现在你有一个人登录到另一个人的帐户。
如果有任何不匹配的内容,而不是die()
,则重新显示已提交的表单以便用户可以重试,这被认为是礼貌的做法。您的系统要求用户点击后退以返回登录表单,然后才能再次尝试。您应该重新构建代码,以便在出现错误时显示该错误,并使用登录表单ALONG。
echo "
<div id='login'>
....
</table></form></div>";
生成这样的长文本字符串很痛苦,特别是如果你必须在其中使用引号。请改用HEREDOC,专门用于构建多行字符串。作为奖励,它的作用类似于双引号字符串,因此您可以在构建字符串时将变量插入到字符串中:
echo <<<EOL
<div id="login">
....
</table></form></div>
EOF
不是显示“您现在已登录”,而是显示配置文件页面的链接,为什么不自动将用户重定向到个人资料页面?
所以,毕竟,你的脚本看起来像这样:
<?php
$error = NULL;
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$username = $_POST['name'];
$password = $_POST['pw'];
if (!empty($username) && !empty($password) {
$qusername = mysql_real_escape_string($username);
$qpassword = mysql_real_escape_string($password);
$query = <<<EOL
SELECT *
FROM users
WHERE (username = $qusername) AND (password = $qpassword)
EOL;
$stmt = mysql_query($query);
if (mysql_num_rows($stmt) == 1) {
// store user details in session here
redirect("profile.php?userID=$id");
} else {
$error = "Invalid username or password";
}
} else {
$error = "Must specify both username and password";
}
}
?>
<html>
<body>
<?php if (!empty($error)) { ?>
<h3><?php echo $error ?></h3>
<? } ?>
<form ...>
<table ...>
<tr>
<td><input type="text" name="name" value="<?php echo htmlspecialchars($name) ?>" /></td>
</tr>
<tr>
<td><input type="password" name="pw" /></td>
</tr>
<table>
<input type="submit" value="Login" />
</form>
答案 1 :(得分:0)
查看代码,我认为您的格式和语法可能存在问题。学习在代码中使用空格。当您编写类似的内容时:$username&&$password
PHP可能正在使用&$password
作为变量的引用,而不是$password
变量。所以仔细检查代码并添加空格:
if ($username && $password){
if ($username == $firstandlast && $password == $dbpassword){
这可能会解决您的问题。