登录重定向不正确


Login not redirecting properly

我正试图登录一个网站,该网站连接到数据库,并对其进行检查,但重定向不起作用(login.php到loggedin.php)。我在阅读自己的代码时感到震惊,并且已经兜圈子一段时间了。如果有人能帮忙,我将不胜感激!提前谢谢。

登录_页面.inc.php

<?php # Script 11.1 - login_page.inc.php
// this page prints any errors associated with logging in
//and creates te entire login page, including the fom
//include the header:
$page_title = 'Login';
include ('includes/header.html');
//print any error messages if they exist:
if (!empty($errors)) 
{
echo '<h1>Error!</h1>
<p class="error">The following error(s) occurred:</br>';
foreach ($errors as $msg)
    {
    echo "- $msg</br>'n";
    }
echo '</p><p>Please try again.</p>';
}
//display form
?>
<h1>Login</h1>
    <form action=login.php" method="post">
        <p>Email Address: <input type="text" name="email" size="20" maxlength="80"/></p>
        <p>Password: <input type="password" name="pass" size="20" maxlength="20"/></p>
        <p><input type="submit" name="submit" value="Login"/></p>
        <input type="hidden" name="submitted" value="TRUE"/>
    </form>
<?php //include the footer:
include ('includes/footer.html');
?>

已记录.php

<?php # loggedin.php
//this is where the user is directed from login.php
session_start(); 
//if no cookie is present redirect the user:
//if (!isset($_COOKIE['user_id']))
if (!isset($_SESSION['user_id']))
{
    //the functions need to create an absolute url
    require_once ('includes/login_functions.inc.php');
    $url = absolute_url();
    header("Location: $url");
    exit(); //exit script
}
//set the page title and include the header
$page_title = 'Logged in.';
include ('includes/header.html');
//welcome message
echo "<h1>Logged in!</h1>
<p>You have successfully logged in, {$_SESSION['first_name']}!</p>
<p><a href='"logout.php'">Logout</a></p>";
include ('includes/footer.html');
?>

Login.php

<?php # login.php
//this page processes the login form submission
//upon successful login the user's redirected
//two include files are needed for this
//send nothing to the web browser prior  to the setcookie() lines
//check if  the form has been submitted:
if (isset($_POST['submitted']))
{
    //for processing the login:
    require_once ('includes/login_functions.inc.php');
    //need the database connection:
    require_once ('includes/mysqli_connect.php');
    //check the login
    list ($check, $data) = check_login($dbc, $_POST['email'], $_POST['pass']);
    if($check)
    {
        /*ok, set cookies to last one hour after it is set
        setcookie ('user_id', $data ['user_id'], time()+3600, '/', '', 0, 0);
        setcookie ('first_name', $data ['first_name'], time()+3600, '/', '', 0, 0);*/
        session_start();
        $_SESSION['user_id'] = $data['user_id'];
        $_SESSION['first_name'] = $data['first_name'];
        //redirect
        $url = absolute_url ('loggedin.php');
        header("Location: $url");
        exit(); //quit the script 
    }
    else
    {
        //assign errors to $data for error reporting in the login_page.inc.php
        $errors = $data;
    }
    mysqli_close($dbc); //close the database connection
} //end of main submit condition
include ('includes/login_page.inc.php');

?>

Login_functions.php

<?php #- login_functions.inc.php
//this page defines two functions used by the login/logout process.
/*this function determines and returns an absolte URL
*takes one argument: the page that concludes the URL
*the arguement defaults to index.php
*/
function absolute_url ($page = 'index.php')
{
//start defining the URL. . .
//URL is http:// plus the host name plus current directory:
$url = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']);
//remove any trailing slashes:
$url = rtrim($url, '/''');
//adding the page. . .
$url.= '/' . $page;
//return to the url
return $url;
} //end of the absolute_url function
/* this function validates the form data (the email address and password)
*if both are present the database is queried
*this function requires a database connection
* the function returns an array of information. including:
* - a TRUE or FALSE variable indicating a success or failure
* - an array of either errors or the database return result
*/
function check_login($dbc, $email = '', $pass = '')
{
    $errors = array(); //starting error array
    //validate email address
    if (empty($email))
    {
    $errors[] = 'You forgot to enter your email address.';
    }
    else
    {
    $e = mysqli_real_escape_string($dbc, trim($email));
    }
    //validate the password
    if (empty($pass))
    {
    $errors[] = 'You forgot to enter your password.';
    }
    else
    {
    $p = mysqli_real_escape_string($dbc, trim($pass));
    }
    if (empty($errors))
    {
    /*if everything's okay
    *retrieve the user_id and the first_name for that
    *email+password combination:
    */
    $q = "SELECT user_id, first_name FROM site_users WHERE email='$e' AND pass=SHA1('$p')";
    $r = @mysqli_query ($dbc, $q); //run the query
    //check the result and making sure that both fields are in the same row
    if(mysqli_num_rows($r) ==1)
    {
    //fetch the record
    $row = mysqli_fetch_array ($r, MYSQLI_ASSOC);
    //return true and the record:
    return array(true, $row);
    }
    else
    {
    //not a match
    $errors[] = 'The email address and password entered do not match those on file.';
    }
    }//end of empty($errors) IF.
    //return false and the errors:
    return array(false, $errors);
} //end of check_login() function
?>

如果任何文件包含任何发送到浏览器的代码,PHP会自动发送所有标头。在发送了标头之后,您就不能再发送新的标头,并且它会丢弃您的Location:标头。PHP应该发出通知,在日志中查找它和/或设置正确的error_reporting标志。

这包括换行符或空格或?>标记块之后的任何内容。

据我所见,您的脚本没有任何问题。。。这里,但不确定的内容

includes/header.htmlindex.php

您还需要更换

<form action=login.php" method="post">

带有

<form action="login.php" method="post">

如果你能粘贴你看到的错误。。也许我可以帮你更好的

谢谢:)

不要在标题前包含任何空行("位置:$url")。因为这会阻止发送标头,并且您无法重定向到您想要的位置。

问题发生在SHA1与数据库的对话中,其中SHA1是(40)强,数据库设置为(20)。这是一个令人讨厌的问题,但尚未解决。Var_dump被用来与数据库对话,以证明输入的信息是正确的,但它确实显示数据库中的密码是(20),登录时输入的密码为(40)。