PHP header 重定向不起作用并停留在 login.php 上

标签 php mysql session pdo

我正在尝试使用 PHP 将登录页面重定向到 profile.php 页面。我已经测试过代码使用 session 从数据库中提取信息。在最后的 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");
    }
}

最佳答案

去除 echo 。 header 重定向前不得有任何输出。

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

通常的做法:

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

在整个应用程序(例如 init/bootstrap 文件)上使用输出缓冲解决方案后,确保 cookie、 session 和 header 重定向正确发生变得更加容易,因为您可以控制应用程序中输出的确切位置已发送。

小且难以发现的问题:

因为这些不输出任何内容的文件,例如仅包含函数定义或类文件的文件,不应以 ?> 结尾,因为 ?> 后有空格> 被认为是输出。

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

调试:

将您的 error_reporting() 设置为 E_ALLini_set('display_errors', true)。这将回应您可能看不到的各种通知和警告。其中一个警告类似于“ header 已发送”,提及第一个输出发生的特定文件/行。

如果文件/输出行看起来很熟悉,那么您可以删除该输出。如果您找不到第一个输出发生的位置,您可能遇到了一个“小且难以发现的问题”。

关于PHP header 重定向不起作用并停留在 login.php 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23023517/

相关文章:

php - 如何最好地将元素添加到 PHP 中任意索引处的数组?

php - 使用PHP PDO动态查询Mysql并在Select中使用%

php - 倒计时器与php mysql交互

PHP session 重新生成安全性

c# - 在 C# 中测试 session 超时

php - Laravel 5.3 - 限制登录尝试默认 auth-Trait 方法 hasTooManyLoginAttempts 尚未应用

mysql - Laravel 跨不同数据库的关系

MySQL返回错误的搜索记录

php - 在 PHP 中销毁 session 时出错

php - 如何对recipe_id 不同的所有评级列值求和