PHP登录表单未处理重定向


PHP Login form not processing redirect

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

现场示例:http://previews.justinwidener.com/

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代码:

<?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>

我认为数据库正在进行连接,因为没有抛出错误,但问题仍然在于重定向失败。如果这是一个简单的问题,请不要把我当成白痴。我正在努力学习,但没能成功。提前谢谢。

在调用header之前,您似乎已经有了输出。输出已发送后,无法重定向。你应该会收到一条错误消息,上面写着,你可能想确认你已经启用了错误报告。

还有两件重要的事情:

  • 不要存储纯文本密码。曾经查看密码哈希
  • 不要使用mysql_*函数。看看mysqli或PDO

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

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

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

<?php 
session_start();
if (!isset($_SESSION['username'])) {
    header('Location: $redirect');
}
?>

并在打开<HTML>标签:

<?php 
session_start();
if ( ($_SERVER['REQUEST_METHOD'] != 'POST') && !isset($_SESSION['username']) ){
    header('Location: $redirect');
}

?>

在php脚本中的代码顶部编写ob_start();。或者使用此代码在php中重定向window.location.href = 'http://www.google.com';//将带您进入谷歌。像

<?php
echo "window.location.href = 'http://www.google.com'";
?>