登录表单无法正常工作

时间:2012-06-09 00:44:43

标签: php mysqli

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


    }
     ?>

1 个答案:

答案 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>

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