如何解决session_register()废弃问题?

45

如何解决PHP 5.3中session_register()方法已弃用的问题

7个回答

46

不要使用它。描述说:

向当前会话注册一个或多个全局变量。

我想到了两件事:

  1. 无论如何,使用全局变量都不好,找到一种避免它们的方法。
  2. 您仍然可以使用$_SESSION['var'] = "value"来设置变量。

另请参阅手册中的警告:

如果您希望脚本在不考虑register_globals的情况下工作,您需要使用$_SESSION数组,因为$_SESSION条目会自动注册。如果您的脚本使用session_register(),则在禁用PHP指令register_globals的环境中将无法运行。

这非常重要,因为默认情况下register_globals指令设置为False

此外:

这将注册一个global变量。如果您想从函数内部注册会话变量,则需要确保使用global关键字或$GLOBALS[]数组使其成为全局变量,或者使用下面注明的特殊会话数组。

如果您正在使用$_SESSION(或$HTTP_SESSION_VARS),请不要使用session_register()session_is_registered()session_unregister()

28

直接使用 $_SESSION 来设置变量。 就像这样:

$_SESSION['name'] = 'stack';

改成:

$name = 'stack';
session_register("name");

在此处阅读更多信息


20

在PHP 5.3之前

session_register("name");

自 PHP 5.3 版本起

$_SESSION['name'] = $name;

10

如果您需要一个备用函数,您可以使用这个

function session_register($name){
    global $$name;
    $_SESSION[$name] = $$name;
    $$name = &$_SESSION[$name]; 
}

0
为了补充Felix Kling的回答,我正在研究一个曾经使用以下代码的代码库:
if (is_array($start_vars)) {
    foreach ($start_vars as $var) {
        session_register($var);
    }
} else if (!(empty($start_vars))) {
    session_register($start_vars);
}

为了不使用session_register,他们进行了以下调整:
if (is_array($start_vars)) {
    foreach ($start_vars as $var) {
        $_SESSION[$var] =  $GLOBALS[$var];
    }
} else if (!(empty($start_vars))) {
    $_SESSION[$start_vars] =  $GLOBALS[$start_vars];
}

0
我写了一个小包装器(wrapper),这样我就不必重写过去几十年的所有代码,它模拟了register_globals和缺失的session功能。
我从不同的来源获取了一些想法,并加入了一些自己的东西,以获得替代register_globals和缺失的session函数的方法,这样我就不必重写过去几十年的所有代码。代码还可以处理多维数组,并从会话中构建全局变量。
要使代码正常工作,请在php.ini上使用auto_prepend_file来指定包含下面代码的文件。例如: auto_prepend_file = /srv/www/php/.auto_prepend.php.inc 您应该已经安装了PECL的runkit扩展,并在您的php.ini上添加了以下条目:
extension_dir = <your extension dir>
extension = runkit.so
runkit.internal_override = On

.auto_prepend.php.inc:

<?php
//Fix for removed session functions
if (!function_exists('session_register'))
{
    function session_register()
    {
        $register_vars = func_get_args();
        foreach ($register_vars as $var_name)
        {
            $_SESSION[$var_name] = $GLOBALS[$var_name];
            if (!ini_get('register_globals'))
            {   $GLOBALS[$var_name] = &$_SESSION[$var_name]; }
        }
    }

    function session_is_registered($var_name)
    {   return isset($_SESSION[$var_name]); }

    function session_unregister($var_name)
    {   unset($_SESSION[$var_name]); }
}

//Fix for removed function register_globals
if (!isset($PXM_REG_GLOB))
{
    $PXM_REG_GLOB=1;
    if (!ini_get('register_globals'))
    {
        if (isset($_REQUEST))   { extract($_REQUEST); }
        if (isset($_SERVER))        { extract($_SERVER); }

        //$_SESSION globals must be registred with call of session_start()
        // Best option - Catch session_start call - Runkit extension from PECL must be present
        if (extension_loaded("runkit"))
        {
            if (!function_exists('session_start_default'))
            {   runkit_function_rename("session_start", "session_start_default"); }
            if (!function_exists('session_start'))
            {
                function session_start($options=null)
                {
                    $return=session_start_default($options);
                    if (isset($_SESSION))
                    {
                        $var_names=array_keys($_SESSION);
                        foreach($var_names as $var_name)
                        {   $GLOBALS[$var_name]=&$_SESSION[$var_name]; }
                    }
                    return $return;
                }
            }
        }
        // Second best option - Will always extract $_SESSION if session cookie is present.
        elseif ($_COOKIE["PHPSESSID"])
        {
            session_start();
            if (isset($_SESSION))
            {
                $var_names=array_keys($_SESSION);
                foreach($var_names as $var_name)
                {   $GLOBALS[$var_name]=&$_SESSION[$var_name]; }
            }
        }
    }
}
?>

-2

我们只需要在弃用的函数前面使用@。无需像上面的帖子中提到的那样更改任何内容。例如:if(!@session_is_registered("username")){ }。只需加上@,问题就解决了。


3
仅仅抑制错误并不是处理过时函数的正确方法。这有时可能是一个快速的临时修复,但从长远来看甚至短期来看都不是解决方案!试着找出为什么它被标记为过时,以及你可以采取什么措施来解决它! - Haudegen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接