在所有 PDO 页面的开头调用 session_start() 时出现问题


Trouble with calling session_start() at the start of all PDO pages

我的大多数页面都使用会话,但我切换到PDO并在每个页面的开头调用session_start()会导致传递标题的问题。我已经做了几个小时的研究,但仍然不清楚该怎么做。

编辑 - 我一直在做什么:注册/登录文档以及身份验证.php的第 1 行是 session_start(); ,用户在注册/签名后访问的所有页面的第 1 行是require_once('auth.php');

我目前正在将用户 ID 传递给每个带有 $_SESSION['SESS_USER_ID'] 的页面

当他们注册/登录时,我像这样连接它: $member = $stmt_user->fetch(); $_SESSION['SESS_USER_ID'] = $member['user_id'];

在随后的每一页上,我都这样称呼它:

$user_id = $_SESSION['SESS_USER_ID']; 

根据手册

从 PHP 4.3.3 开始,在会话后调用 session_start() 以前启动将导致级别 E_NOTICE 的错误。也 第二个会话启动将被忽略。

这是否意味着我不再需要在每个页面上调用它,只需在用户开始会话时调用它一次?

如果没有,处理此问题的最简单方法是什么?

如果您使用的是框架,则可能只需要在该框架中调用它一次。如果你的每个请求都转到不同的php页面,那么你需要确保每个请求至少调用一次(最好是尽快)。

你需要让自己成为一个引导程序文件。
一个文件,其中包含在每个页面上执行的所有常见操作 - 会话启动、连接到数据库、设置全局变量等。
然后将此文件包含在调用的每个脚本中。
因此,您将确保拥有所需的一切,但一次调用所有内容。

虽然我不明白这个问题与PDO(以及上一个)有什么关系。
PDO只是一个数据库驱动程序,与标头,会话等没有丝毫关系。

您可以使用

ob_startob_end_flush来缓冲输出,因此实际上可以这样做:

<?php
ob_start();
echo '42';
session_start(); // still works because output is buffered
ob_end_flush();
?>