0

我的登录表单有一点问题。我认为问题在于 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.";
    }


    }
     ?>
4

1 回答 1

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()是第一个发送输出的东西——这很重要,因为它们都需要成为第一个发送输出的东西。

我还解决了你的验证循环。如果查询返回行,则数据库中有匹配项并且用户名和密码正确,无需循环。

于 2012-06-09T01:03:50.800 回答