PHP会话已经开始[重复]
Posted
技术标签:
【中文标题】PHP会话已经开始[重复]【英文标题】:PHP session has already been started [duplicate] 【发布时间】:2019-09-16 00:50:12 【问题描述】:我的网站上有一个使用 ajax 调用 php 文件的页面。我要求用户登录以访问任一页面,并在调用 php 文件的页面上使用session_start()
(假设main.php
调用bg.php
)。我在bg.php
上也包含了session_start()
,因为我需要访问会话变量。但是,我收到垃圾邮件的 php 通知说
A session had already been started - ignoring session_start()
所以,我尝试使用
if (!isset($_SESSION)) session_start();
但是,我一直收到错误消息,所以我尝试完全删除它,因为它说它无论如何都会被忽略。然而,随后bg.php
停止识别会话变量。我怎样才能停止收到通知?
【问题讨论】:
***.com/questions/10648984/… 【参考方案1】:我喜欢这样处理 php 会话控制: 验证用户后,我将设置一个会话变量。 喜欢:
$permitted_chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$_SESSION['loggedIn']=generate_string($permitted_chars, 20);
然后在每个页面的顶部我希望我的会话控制是:
<?php
session_start();
if (empty($_SESSION['loggedIn']))
header("Location: login.php");
exit();
编辑:另外,如果您正在加载外部页面,例如 dbconnect.php 页面,您只需输入:
<?php
if (empty($_SESSION['loggedIn']))
header("Location: login.php");
exit();
在这些文件的顶部....
如果我真的很健壮,那么我在登录时将“登录”生成的代码存储在数据库表中,将几个标识符(如用户和密码)加载到会话变量中,然后在我的初始检查之后,我会检查会话是否有效,如
" select count users from user_tbl where `name`=`".$_SESSION['name']."` and `pass`=`".$_SESSION['pass']."` and `key`=`".$_SESSION['loggedIn']."`"
然后
if ($count=="0")
header("Location: login.php");
exit();
【讨论】:
【参考方案2】:我建议编写一个库文件,它首先包含在所有 .php 文件中。它包含函数和启动代码,由所有/许多其他页面连接。这有助于创建清晰的结构并避免复制和粘贴常见的代码部分。
*.php
<?PHP
require_once("lib-standard.php");
# .... more code
lib-standard.php
<?PHP
session_start();
# more startup code (locale, timezone, login, check users, check rights, ...)
# common functions
# common classes
【讨论】:
【参考方案3】:您应该使用session_status()
函数检查会话状态以避免重复会话启动。例如:
if (session_status() == PHP_SESSION_NONE)
session_start();
【讨论】:
以上是关于PHP会话已经开始[重复]的主要内容,如果未能解决你的问题,请参考以下文章