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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3682615/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 10:41:15  来源:igfitidea点击:

How to fix the session_register() deprecated issue?

phpsessiondeprecated

提问by DEVOPS

How to fix the session_register()deprecated problem in PHP 5.3

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

回答by Felix Kling

Don't use it. The description says:

不要使用它。描述说:

Register one or more global variables with the current session.

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

Two things that came to my mind:

我想到了两件事:

  1. Using global variables is not good anyway, find a way to avoid them.
  2. You can still set variables with $_SESSION['var'] = "value".
  1. 无论如何使用全局变量都不好,想办法避免它们。
  2. 您仍然可以使用$_SESSION['var'] = "value".

See also the warnings from the manual:

另请参阅手册中的警告:

If you want your script to work regardless of register_globals, you need to instead use the $_SESSIONarray as $_SESSIONentries are automatically registered. If your script uses session_register(), it will notwork in environments where the PHP directive register_globalsis disabled.

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

This is pretty important, because the register_globalsdirective is set to Falseby default!

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

Further:

更远:

This registers a globalvariable. If you want to register a session variable from within a function, you need to make sure to make it global using the globalkeyword or the $GLOBALS[]array, or use the special session arrays as noted below.

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

and

If you are using $_SESSION(or $HTTP_SESSION_VARS), do not use session_register(), session_is_registered(), and session_unregister().

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

回答by shamittomar

Use $_SESSIONdirectly to set variables.Like this:

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

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

Instead of:

代替:

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

Read More Here

在这里阅读更多

回答by Serhii Koval

before PHP 5.3

PHP 5.3 之前

session_register("name");

since PHP 5.3

自 PHP 5.3 起

$_SESSION['name'] = $name;

回答by wutzebaer

if you need a fallback function you could use this

如果您需要回退功能,您可以使用它

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

回答by Pedro Pinheiro

To complement Felix Kling's answer, I was studying a codebase that used to have the following code:

为了补充Felix Kling的回答,我正在研究一个曾经有以下代码的代码库:

if (is_array($start_vars)) {
    foreach ($start_vars as $var) {
        session_register($var);
    }
} else if (!(empty($start_vars))) {
    session_register($start_vars);
}

In order to not use session_register they made the following adjustments:

为了不使用 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];
}

回答by rund

I wrote myself a little wrapper, so I don't have to rewrite all of my code from the past decades, which emulates register_globals and the missing session functions.

我给自己写了一个小包装器,所以我不必重写过去几十年的所有代码,这些代码模拟了 register_globals 和缺少的会话函数。

I've picked up some ideas from different sources and put some own stuff to get a replacement for missing register_globals and missing session functions, so I don't have to rewrite all of my code from the past decades. The code also works with multidimensional arrays and builds globals from a session.

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

To get the code to work use auto_prepend_fileon php.ini to specify the file containing the code below. E.g.: auto_prepend_file = /srv/www/php/.auto_prepend.php.inc

要使代码auto_prepend_file在 php.ini上工作,请指定包含以下代码的文件。例如: auto_prepend_file = /srv/www/php/.auto_prepend.php.inc

You should have runkit extension from PECL installed and the following entries on your php.ini:

你应该已经安装了 PECL 的 runkit 扩展并且你的 php.ini 中有以下条目:

extension_dir = <your extension dir>
extension = runkit.so
runkit.internal_override = On

.auto_prepend.php.inc:

.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]; }
            }
        }
    }
}
?>

回答by user3785877

We just have to use @in front of the deprecated function. No need to change anything as mentioned in above posts. For example: if(!@session_is_registered("username")){ }. Just put @and problem is solved.

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