有没有人对这里发生的事情有解释?
我有一个主页,我打电话给session_start()
。
然后我有一个PHP脚本,使用Ajax调用。
如果我没有在那里放session_start()
,它将无效。
但是,如果我这样做,它可以正常工作,但显示:
注意:会话已经启动 - 忽略第2行的C:\ xampp \ htdocs \ dsb \ php \ ds_acc.php中的session_start()
我可能在某个地方犯了一个错误,但这不是一个悖论吗?虽然说,它忽略了session_start()
,脚本在删除时会中断。
感谢您的投入。
这里的代码,对不起,如果它有点混淆:
的index.php:
<?php
session_start();
require_once("php/ds_acc.php");
?>
ds_acc.php:
<?php
session_start();
require_once("db_login.php");
require_once("permission.php");
if(check_permission("user"))
{
if(isset($_REQUEST["action"]))
{
switch($_REQUEST["action"])
{
case "add":
add_user();
break;
}
}
}else
{
echo "error: session invalid";
}
function add_user()
{
}
?>
permission.php:
<?php
require_once("db_login.php");
/* Returns true if permission is granted, otherwise false. */
function check_permission($required_level)
{
if(!isset($_SESSION["id"]))
{
/* Not logged in */
return false;
}
/* reload banned */
$con = get_con();
$stmt = $con->prepare("SELECT banned FROM users WHERE id = ?");
$stmt->bind_param("i", $_SESSION["id"]);
$stmt->execute();
$stmt->bind_result($banned);
$stmt->fetch();
$stmt->close();
$con->close();
if($banned == 1)
{
$_SESSION = array();
session_destroy();
return false;
}
if($_SESSION["permission"] == "admin")
{
return true;
}
switch($required_level)
{
case "user":
return true;
case "mod":
return ($_SESSION["permission"] == "mod");
default:
return false;
}
}
?>
在复制时,我现在意识到它可能与我连接,包括ds_acc.php文件以使用它的功能,同时还使用它来通过Ajax发布数据。我应该在单独的文件中这样做。
(好吧,nvm,stackoverflow显然不喜欢php启动标签)
顺便说一下,在我发布代码之前,我花了很多时间来格式化代码,因为我的一个文件中的第一个<?
仅用于3个空格._.
答案 0 :(得分:1)
错误是,我在我的索引页面中包含了php文件,然后还使用ajax调用它。 因此它将在页面上显示重复的会话错误,而如果通过Ajax调用则需要session_start。
解决方案: 创建一个单独的文件,我在其中放入了ds_account.php中的所有函数。 在ds_acc.php和主页面中包含新文件。
答案 1 :(得分:1)
检查会话是否已启动第1步:
ds_acc.php:
<?php
if (session_status() == PHP_SESSION_NONE) {
session_start();
}
require_once("db_login.php");
require_once("permission.php");
答案 2 :(得分:0)
session_start();
只能执行一次。只需在index.php上写一次,然后将其从index.php中包含的其余php文件中删除。