我的登录表单有点问题。我认为问题是mysqli代码,因为当代码是旧的mysql代码时,登录工作正常,但由于我将其更改为mysqli,它还没有完全正常工作。
当用户点击"登录"用户将在登录表单中输入用户名和密码时,用户将输入他们的用户名和密码。按钮,如果用户名和密码正确,它将检查数据库。如果正确则导航到menu.php页面如果登录不正确,则显示一条消息,说明登录不正确,请重试。
相反,下面的代码是当用户输入用户名和密码并点击"登录"按钮,无论用户名和密码是否正确,它只是刷新来自,它不会导航到menu.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.";
}
}
?>
答案 0 :(得分:3)
由于多种原因,此代码非常糟糕。让我试着为你重写一遍并解释原因。
首先,您正在获取并循环遍历数据库行的 所有 并检查匹配项,您应该在SQL查询中执行此操作。
其次,您在发送输出后尝试发送标头。如果您启用了错误报告,这将无效并且应该抛出错误。
第三,你没有真正的理由定义变量$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()
是发送输出的第一件事 - 这很重要,因为它们都需要首先发送输出。< / p>
我也解决了你的验证循环。如果查询返回行,则数据库中存在匹配项,用户名和密码正确,无需循环。