[英]Login form is not working correctly
我的登录表单有一个小问题。 我认为问题出在mysqli代码上,因为当代码是旧的mysql代码时,登录可以正常工作,但是由于我将其更改为mysqli,因此无法正常运行。
可能发生的情况是,用户将在登录表单中输入其用户名和密码,当用户单击“登录”按钮时,它将在数据库中检查用户名和密码是否正确。 如果正确,则导航到menu.php页面,否则,如果登录不正确,则显示一条消息,指出登录不正确,然后重试。
相反,下面的代码正在执行的操作是,当用户输入用户名和密码并单击“登录”按钮时,无论用户名和密码是否正确,它只会刷新来源,而不会导航到菜单。 php页面或显示登录错误消息。
所以我的问题是,为什么会这样,为什么登录后不导航用户或显示错误的登录消息?
下面是代码:
<?php
session_start();
$username="xxx";
$password="xxx";
$database="xxx";
$mysqli = new mysqli("localhost", $username, $password, $database)or die( "Unable to select database");
foreach (array('teacherusername','teacherpassword') as $varname) {
$$varname = (isset($_POST[$varname])) ? $_POST[$varname] : '';
}
?>
<form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post" id="teachLoginForm">
<p>Username</p><p><input type="text" name="teacherusername" /></p> <!-- Enter Teacher Username-->
<p>Password</p><p><input type="password" name="teacherpassword" /></p> <!-- Enter Teacher Password-->
<p><input id="loginSubmit" type="submit" value="Login" name="submit" /></p>
</form>
<?php
if (isset($_POST['submit'])) {
$query = $mysqli->prepare("
SELECT * FROM Teacher t
WHERE
(t.TeacherUsername = '".mysqli_real_escape_string($teacherusername)."')
AND
(t.TeacherPassword = '".mysqli_real_escape_string($teacherpassword)."')
");
$query->bind_result($Teacher);
$num = $query->num_rows($result = $query->execute());
$loged = false;
while($row = $result->fetch())
{
if ($_POST['teacherusername'] == ($row['TeacherUsername']) && $_POST['teacherpassword'] == ($row['TeacherPassword']))
{
$loged = true;
}
$_SESSION['teacherforename'] = $row['TeacherForename'];
$_SESSION['teachersurname'] = $row['TeacherSurname'];
$_SESSION['teacherusername'] = $row['TeacherUsername'];
}
if ($loged == true){
header( 'Location: menu.php' ) ;
}else{
echo "The Username or Password that you Entered is not Valid. Try Entering it Again.";
}
}
?>
出于多种原因,这段代码确实很糟糕。 让我尝试为您重写此内容并解释原因。
首先,您正在获取并遍历数据库的所有行并检查是否存在匹配,您应该在SQL查询中执行此操作。
其次,您尝试在发送输出之后发送标头。 如果您启用了错误报告功能,则此操作将无效,并会引发错误。
第三, $teacherusername
定义变量$teacherusername
和$teacherpassword
,甚至不要始终使用它们。
第四,您似乎无缘无故地开始会议。
第五,您的查询不必要地复杂。
第六,正如Mike所指出的,您将用户密码以纯文本形式存储在数据库中。
我会这样写:
<?php
// There can be nothing (HTML, whitespace, anything) above this php tag.
if(isset($_POST['teacherusername']) && isset($_POST['teacherpassword']))
{
// Connect to Database
$username="xxx";
$password="xxx";
$database="xxx";
$mysqli = new mysqli("localhost", $username, $password, $database)or die( "Unable to select database");
// Build Query
$q = sprintf('SELECT * FROM Teacher t');
$q.= sprintf(' WHERE t.TeacherUsername = %s', mysqli_real_escape_string($_POST['teacherusername']));
$q.= sprintf(' AND t.TeacherPassword = %s', mysqli_real_escape_string($_POST['teacherpassword']));
// Run Query
$query->bind_result($Teacher);
$res = $query->execute();
$num = $query->num_rows();
if($num == 1)
{
header('Location: menu.php' );
}
else
{
session_start(); // Do you need this?
echo "The Username or Password that you Entered is not Valid. Try Entering it Again.";
}
}
?>
<form action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>" method="post" id="teachLoginForm">
<p>Username</p><p><input type="text" name="teacherusername" /></p> <!-- Enter Teacher Username-->
<p>Password</p><p><input type="password" name="teacherpassword" /></p> <!-- Enter Teacher Password-->
<p><input id="loginSubmit" type="submit" value="Login" name="submit" /></p>
</form>
现在,这不能解决您仍将密码以纯文本形式存储在数据库中这一事实。 这是不好的做法,但超出了今天的课程范围:-)
在这里,首先运行PHP,并且header()
或session_start()
是发送输出的第一件事-这很重要,因为它们都必须是发送输出的第一件事。
我还解决了您的验证循环。 如果查询返回行,则数据库中存在匹配项,并且用户名和密码正确,无需循环。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.