为什么PHP会抛出一个;不能重新声明“;本地包含函数出错?

为什么PHP会抛出一个;不能重新声明“;本地包含函数出错?,php,include,Php,Include,我的问题是:我有一个文件包含一个本地函数(VRC_Header.php)。这是: function sec_session_start() { $session_name = 'sec_session_id'; //set a custom session name $secure = false; //set to true if using https $httponly = true; //This stops javascript being able to ac

我的问题是:我有一个文件包含一个本地函数(VRC_Header.php)。这是:

function sec_session_start() {
    $session_name = 'sec_session_id'; //set a custom session name
    $secure = false; //set to true if using https
    $httponly = true; //This stops javascript being able to access the session id

    ini_set('session.use_only_cookies', 1); // Forces sessions to only use cookies
    $cookieParams = session_get_cookie_params(); //Gets currtent cookies params
    session_set_cookie_params($cookieParams["lifetime"], $cookieParams["domain"], $secure, $httponly); 
    session_name($session_name); //Sets the session name to the one set above
    session_start(); //Start the php session
    session_regenerate_id(); //regernates the session, delete the old one
}   
这很简单。我在每个公共页面中都包含此文件。比如说,

include_once('VRC_Header.php');
include_once('../Classes/VRC_MasterOO.php');
include_once('../Classes/VRC_Secure_Login.php');

//Start a secure session
sec_session_start();
我的问题发生在我的登录页面与
php
处理页面之间。提交通过post
jQuery
函数进行。第二页包含与上述代码相同的代码:

include_once('VRC_Header.php');
include_once('../Classes/VRC_MasterOO.php');
include_once('../Classes/VRC_Secure_Login.php');

//Start a secure session
sec_session_start();
不幸的是,我的jQuery函数回答如下:

致命错误:无法在E:\Additional Programs\xampp\htdocs\Vista\Ridge\u Territory\u System\PHP\Scripts\VRC\u Header.PHP:14第24行的E:\Additional Programs\xampp\htdocs\Vista\u Ridge\u Territory\u System\PHP\Scripts\VRC\u Header.PHP中重新声明sec\u会话\u start()

请注意,我的jQuery函数显示了reply,这意味着我认为问题存在于第二个文件中。因此,“不能重新申报”。为什么会发生这种情况?我以前在本地函数中没有遇到过这个问题

欢迎您的任何意见

注意:我已经删除了这两个文件中的include函数。如果我这样做,
PHP
会抛出另一个错误:“
sec\u session\u start()
”未定义。”

中间jQuery函数:

$(document).ready(function () {
$('.login-form').submit(function (e) {
    e.preventDefault();
    $('#reply').remove();
    var formData = $(this).serialize();
    $("input").prop("disabled", true);
    request = $.post('VRC_LoginProcess.php', formData, loginMessage);
    request.fail(function() { 
        $('.header').append("<span id=\"reply\">Login Failed. Please try again in a few minutes.</ span>"); });

    function loginMessage(data) {
        $('.header').append("<span id=\"reply\">" + data + "</ span>");
        $("input").prop("disabled", false);
    }
});
});
$(文档).ready(函数(){
$('.login form')。提交(函数(e){
e、 预防默认值();
$(“#答复”).remove();
var formData=$(this.serialize();
$(“输入”).prop(“禁用”,真);
request=$.post('VRC_LoginProcess.php',formData,loginMessage);
请求失败(函数(){
$('.header').append(“登录失败。请几分钟后重试。”);});
函数登录消息(数据){
$('.header')。追加(“+data+”);
$(“输入”).prop(“禁用”,false);
}
});
});

关键是此错误消息:

致命错误:无法在E:\Additional Programs\xampp\htdocs\Vista\Ridge\u Territory\u System\PHP\Scripts\VRC\u Header.PHP:14第24行的E:\Additional Programs\xampp\htdocs\Vista\u Ridge\u Territory\u System\PHP\Scripts\VRC\u Header.PHP中重新声明sec\u会话\u start()

发生此错误的唯一方法是如果您包含了
VRC_Header.php
两次。这与jQuery无关,与会话或重新生成会话ID无关。两个不同的行号只是指向函数的开始/结束

尝试在函数上方放置一个
echo()
命令,您应该会看到两次回显。更好的是,在函数上方放置以下代码,它将显示一条更有用的错误消息,包括一条回溯,这将帮助您第二次查看文件是如何包含的:

if (function_exists('sec_session_start')) {
    debug_print_backtrace();
    die('Trying to define sec_session_start() a second time');
}

第14行是什么,第24行是什么?你确定你用过一次
include_
而不是
include
?@Yogeshuthar Yep…这是我的第一个想法-但它不起作用。我不明白,为什么它认为我想重新声明函数?@Manatax第14行特别是
$session_name='sec_session_id'
在这之前的y是函数的开始。第24行是
session_regenate_id();
。这就在函数结束之前。@Mlagma从jquery调用的函数中删除include并重试。如果不起作用,请尝试反之亦然。