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
How to fix the session_register() deprecated issue?
提问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:
我想到了两件事:
- Using global variables is not good anyway, find a way to avoid them.
- You can still set variables with
$_SESSION['var'] = "value"
.
- 无论如何使用全局变量都不好,想办法避免它们。
- 您仍然可以使用
$_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$_SESSION
array as$_SESSION
entries are automatically registered. If your script usessession_register()
, it will notwork in environments where the PHP directiveregister_globals
is disabled.
如果您希望您的脚本在不管 的情况下工作
register_globals
,您需要改为使用$_SESSION
数组,因为$_SESSION
条目是自动注册的。如果您的脚本使用session_register()
,它将无法在register_globals
禁用PHP 指令的环境中工作。
This is pretty important, because the register_globals
directive is set to False
by default!
这非常重要,因为该register_globals
指令默认设置为False
!
Further:
更远:
This registers a
global
variable. If you want to register a session variable from within a function, you need to make sure to make it global using theglobal
keyword 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 usesession_register()
,session_is_registered()
, andsession_unregister()
.
如果您正在使用
$_SESSION
(或$HTTP_SESSION_VARS
),不使用session_register()
,session_is_registered()
和session_unregister()
。
回答by shamittomar
Use $_SESSION
directly to set variables.Like this:
使用$_SESSION
直接设置变量。像这样:
$_SESSION['name'] = 'stack';
Instead of:
代替:
$name = 'stack';
session_register("name");
回答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_file
on 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")){ }
。只需放置@
,问题就解决了。