PHP登录表单未处理重定向

PHP登录表单未处理重定向,php,forms,redirect,login,Php,Forms,Redirect,Login,我刚刚开始使用PHP尝试获取一个表单,该表单将根据用户数据库配置文件中的重定向URL重定向用户。但是,我目前拥有的代码不能正常工作。登录表单提交并打开本应处理信息的PHP页面,但之后什么也没有发生。我将包括所有代码和一个更简单的解决方案现场测试 实例: HTML代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitio

我刚刚开始使用PHP尝试获取一个表单,该表单将根据用户数据库配置文件中的重定向URL重定向用户。但是,我目前拥有的代码不能正常工作。登录表单提交并打开本应处理信息的PHP页面,但之后什么也没有发生。我将包括所有代码和一个更简单的解决方案现场测试

实例:

HTML代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Testing</title>
<link href="styles.css" rel="stylesheet" type="text/css" />
</head>

<body>

    <form name="custlogin" id="custlogin" action="custlogin.php" method="post">
        <input class="custlogin_input" name="username" type="text" placeholder="Username" /><br />
        <input class="custlogin_input" name="password" type="password" placeholder="Password" /><br />
        <input class="custlogin_sub" name="log_btn" type="submit" value="LOGIN" />
    </form>
</body>
</html>
<?php 
session_start();
if ( ($_SERVER['REQUEST_METHOD'] != 'POST') && !isset($_SESSION['username']) ){
    header('Location: $redirect');
}
?>
<?php 
error_reporting(E_ALL); ini_set('display_errors', 1);
    $host="localhost";
    $username="********";
    $password="**********";
    $db_name="************";
    $tbl_name="testtable";

    mysql_connect("$host", "$username", "$password")or die("cannot connect");
    mysql_select_db("$db_name")or die("cannot select DB");

    $username=$_POST['username'];
    $password=$_POST['password'];

    $username = stripslashes($username);
    $password = stripslashes($password);
    $username = mysql_real_escape_string($username);
    $password = mysql_real_escape_string($password);
    $sql = "SELECT * FROM $tbl_name WHERE username='$username' and password='$password'";
    $result = mysql_query($sql);

    $count = mysql_num_rows($result);

    if($count == 1){
        $_SESSION['username'] = $username;
        $_SESSION['password'] = $password;

        $result = mysql_fetch_array($result);

        $redirect = trim($result['redirect']);
        if ($redirect == '') {
            echo "No redirect value was set!";
        }
        else {
            header('Location: $redirect');
            exit;
        }
    }
    else {
        echo "Wrong password!";
    }

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Widener Web Designs - Preview</title>
<link href="styles.css" rel="stylesheet" type="text/css" />



</head>

<body>


</body>
</html>

测试


PHP代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Testing</title>
<link href="styles.css" rel="stylesheet" type="text/css" />
</head>

<body>

    <form name="custlogin" id="custlogin" action="custlogin.php" method="post">
        <input class="custlogin_input" name="username" type="text" placeholder="Username" /><br />
        <input class="custlogin_input" name="password" type="password" placeholder="Password" /><br />
        <input class="custlogin_sub" name="log_btn" type="submit" value="LOGIN" />
    </form>
</body>
</html>
<?php 
session_start();
if ( ($_SERVER['REQUEST_METHOD'] != 'POST') && !isset($_SESSION['username']) ){
    header('Location: $redirect');
}
?>
<?php 
error_reporting(E_ALL); ini_set('display_errors', 1);
    $host="localhost";
    $username="********";
    $password="**********";
    $db_name="************";
    $tbl_name="testtable";

    mysql_connect("$host", "$username", "$password")or die("cannot connect");
    mysql_select_db("$db_name")or die("cannot select DB");

    $username=$_POST['username'];
    $password=$_POST['password'];

    $username = stripslashes($username);
    $password = stripslashes($password);
    $username = mysql_real_escape_string($username);
    $password = mysql_real_escape_string($password);
    $sql = "SELECT * FROM $tbl_name WHERE username='$username' and password='$password'";
    $result = mysql_query($sql);

    $count = mysql_num_rows($result);

    if($count == 1){
        $_SESSION['username'] = $username;
        $_SESSION['password'] = $password;

        $result = mysql_fetch_array($result);

        $redirect = trim($result['redirect']);
        if ($redirect == '') {
            echo "No redirect value was set!";
        }
        else {
            header('Location: $redirect');
            exit;
        }
    }
    else {
        echo "Wrong password!";
    }

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Widener Web Designs - Preview</title>
<link href="styles.css" rel="stylesheet" type="text/css" />



</head>

<body>


</body>
</html>

加宽网页设计-预览

我假设数据库正在建立连接,因为没有抛出错误,但问题仍然在于重定向失败。如果这是一个简单的问题,请不要让我成为一个白痴。我正在努力学习,但没有任何运气让它发挥作用。提前感谢。

看起来您在调用
标题之前已经有了输出。输出已发送后,无法重定向。您应该会收到一条错误消息,上面说,您可能希望确认已启用错误报告

还有两件重要的事情:

  • 不要存储纯文本密码。曾经查看密码散列
  • 不要使用
    mysql.*
    函数。查看mysqli或PDO
    • 写入
      ob_start()位于php脚本中代码的顶部。或者使用此代码在php
      window.location.href='class2'中重定向http://www.google.com';//将带你去谷歌。
      像


      首先,重定向将不起作用,因为在重定向代码之前已经有HTML输出

      其次,即使重定向有效,您当前的代码也将无法插入提交的数据并将“用户名”添加到会话超级全局数组,因为您的测试
      if(!isset($\u session['username')){
      位于处理表单提交并创建$\u session['username]的代码之前变量。因此,它将始终返回false,并且您的用户将不断被重定向

      要解决这些问题,请从当前位置删除此代码:

      <?php 
      session_start();
      if (!isset($_SESSION['username'])) {
          header('Location: $redirect');
      }
      ?>
      
      
      
      并将此替换代码放在文件顶部的开始标记之前:


      您是否打开了
      display\u errors
      ?您应该看到PHP抱怨“无法修改标题信息,标题已经发送”始终在开发和测试代码时,使用
      error\u reporting(E\u ALL);ini\u set('display\u errors',1)
      位于脚本顶部。您与
      header()
      的一个常见错误相冲突。在调用
      header()
      之前,必须没有任何类型的输出,但是您的HTML标记的开头已经写入了输出缓冲区。^That,this
      if(!isset($\u SESSION['username')){header('Location:$redirect');}
      -目前,
      $redirect
      尚未定义。它只在脚本的下一步定义,因此,一旦您将
      会话开始();
      移到顶部,它也将失败。同时执行
      $result=mysql\U查询($sql)或死亡(mysql\U错误())
      查看SQL端是否有其他错误。您可以稍微重新构造逻辑,将消息存储为
      未设置重定向值
      到变量中,而不是直接到
      echo
      。将所有PHP db检查代码放在
      之前,以便设置变量。然后在HTML块中输出变量,所有这些都是在PHP代码的关闭标记
      ?>
      之后出现的。我解开了错误报告行,看到了这样一个令人困惑的混乱:警告:无法修改标题信息-标题已经发送(输出开始于/home/wwdadmin15/public\u html/previews/custlogin.PHP:20)在/home/wwdadmin15/public_html/previews/custlogin.php联机中54@MichaelBerkowski…在钱上是对的^;-)我建议不要使用OBSART作为一个创可贴来解决在标题之前发送输出的问题。最好是将处理与UI分开。同样的事情也适用于使用JavaScript重定向。它只是一个不解决潜在问题的补丁。