如何修复PHP 5.3中已弃用的session_register()
答案 0 :(得分:43)
不要使用它。描述说:
使用当前会话注册一个或多个全局变量。
我想到了两件事:
$_SESSION['var'] = "value"
设置变量。另请参阅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");
答案 2 :(得分:18)
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")){ }
。只需放@
即可解决问题。