PHP标头重定向无法正常工作并停留在login.php上

时间:2014-04-11 22:18:40

标签: php mysql session pdo

我正在尝试使用PHP将登录页面重定向到profile.php页面。我已经测试过代码使用会话从数据库中提取信息。一切正常,直到最后的If声明。它没有给我任何错误,但它返回空白,并且不会离开login.php文件(脚本运行的地方)。

session_start();
//print_r($_POST);

if(isset($_POST['email'], $_POST['password'])){
    require 'php_includes/db_connect.php';

    $query = $dtb->prepare("SELECT * FROM users WHERE email=:email AND password=:password");
    //$query->bindParam('ss', $_POST['email'], $_POST['password']);
    $query->bindParam(':email', $_POST['email'],PDO::PARAM_STR);
    $query->bindParam(':password', $_POST['password'],PDO::PARAM_STR);
    $query->execute();
    //die('Connection error, because: '.$query->errorInfo());

    //echo 'hi';

    //$query->close();
    if($row = $query->fetch()){
        echo 'hi';
        $_SESSION['email'] = $row['email'];
        header("location: profile.php");
    }
}

2 个答案:

答案 0 :(得分:7)

删除回音。在标题重定向之前必须没有输出。

这包括任何类型的意外空格,因此每当您在重定向之前包含另一个文件时,您必须确保在调用重定向之前没有输出。

通常的做法:

大多数编码框架将使用ob_*函数 - 这意味着它们会将浏览器的所有输出捕获到缓冲区中,并决定是否/何时应该发送输出。

在整个应用程序(例如init / bootstrap文件)上使用输出缓冲解决方案,可以更加轻松地确保cookie,会话和标头重定向正确发生,因为您可以控制应用程序中输出的确切位置发送。

小&很难找到问题:

由于此文件不输出任何内容,例如仅包含函数定义或类文件的文件,因此不应以?>结尾,因为?>后面的空格被视为输出。

文件也必须以相同的格式保存,例如ASCII或带有BOM的UTF-8或没有BOM的UTF-8,否则格式之间的差异可能被误解为输出(通常输出的1-2个字符)非常难确实找到了。

调试运行:

error_reporting()设置为E_ALLini_set('display_errors', true)。这将通过各种通知回应您可能无法看到的警告。其中一个警告将是"标题已经发送"提到第一个输出发生的特定文件/行。

如果文件/输出行看起来很熟悉,那么您可以删除该输出。如果你找不到第一个输出的地方,你可能会有一个" small&很难找到问题"。

答案 1 :(得分:2)

同时删除echo 'hi';和空格 Mihai Stancu 声明

建议在标题位置后添加exit();,如下所示:

if($row = $query->fetch()){
    $_SESSION['email'] = $row['email'];
    header("location: profile.php");
    exit();
}

仅使用header() 而不是意味着代码停止执行。每当使用header()重定向时,您需要明确调用exit()以停止执行脚本。