繁体   English   中英

登录表单无法正常工作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM