3

这是我的问题:我有一个包含本地函数 (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处理页面之间。提交是通过 postjQuery函数进行的。第二页包含与上面相同的代码:

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_Territory_System\PHP\Scripts 中重新声明 sec_session_start()(之前在 E:\Additional Programs\xampp\htdocs\Vista_Ridge_Territory_System\PHP\Scripts\VRC_Header.php:14 中声明) \VRC_Header.php 第 24 行

请注意,我的 jQuery 函数提供了回复——这意味着我相信问题存在于第二个文件中。因此,“不能重新声明”。为什么会这样?我以前在本地函数中没有遇到过这个问题。

任何输入表示赞赏。

注意:我已经删除了两个文件中的包含函数。如果我这样做,PHP会引发另一个错误:“ sec_session_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);
    }
});
});
4

1 回答 1

4

关键是这个错误信息:

致命错误:无法在 E:\Additional Programs\xampp\htdocs\Vista_Ridge_Territory_System\PHP\Scripts 中重新声明 sec_session_start()(之前在 E:\Additional Programs\xampp\htdocs\Vista_Ridge_Territory_System\PHP\Scripts\VRC_Header.php:14 中声明) \VRC_Header.php 第 24 行

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

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

if (function_exists('sec_session_start')) {
    debug_print_backtrace();
    die('Trying to define sec_session_start() a second time');
}
于 2013-06-29T06:18:30.387 回答