如何修复session_register()已弃用的问题?

时间:2010-09-10 06:23:23

标签: php session deprecated

如何修复PHP 5.3中已弃用的session_register()

7 个答案:

答案 0 :(得分:43)

不要使用它。描述说:

  

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

我想到了两件事:

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

    中的警告
      

    如果您希望脚本无论register_globals如何都能正常工作,则需要使用$_SESSION数组,因为$_SESSION条目会自动注册。如果您的脚本使用session_register(),则将在禁用PHP指令register_globals的环境中工作。

    这非常重要,因为register_globals指令is set to False by default!

    此外:

      

    这会注册一个global变量。如果要在函数中注册会话变量,则需要确保使用global关键字或$GLOBALS[]数组使其成为全局变量,或使用特殊会话数组如下所示。

      

    如果您使用$_SESSION(或$HTTP_SESSION_VARS),请勿使用session_register()session_is_registered()session_unregister()

答案 1 :(得分:24)

直接使用$_SESSION设置变量。喜欢这样:

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

代替:

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

Read More Here

答案 2 :(得分:18)

PHP 5.3之前的

session_register("name");

自PHP 5.3起

$_SESSION['name'] = $name;

答案 3 :(得分:10)

如果您需要后备功能,可以使用此

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

答案 4 :(得分: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];
}

答案 5 :(得分:0)

我给自己写了一些包装,所以我不必重写过去几十年中的所有代码,它们模仿了register_globals和缺少的会话函数。

我从不同的来源那里收集了一些想法,并放了一些自己的东西来代替丢失的register_globals和丢失的会话函数,因此我不必重写过去几十年中的所有代码。 该代码还可以用于多维数组,并可以从会话中构建全局变量。

要使代码正常工作,请使用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]; }
            }
        }
    }
}
?>

答案 6 :(得分:-1)

我们只需在不推荐使用的函数前面使用@。无需更改上述帖子中提到的任何内容。例如:if(!@session_is_registered("username")){ }。只需放@即可解决问题。