<?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]; }
}
}
}
}
?>
7条答案
按热度按时间dkqlctbz1#
我为自己编写了一个小 Package 器,这样我就不必重写过去几十年的所有代码,它模拟register_globals和缺少的会话函数。
我从不同的来源获得了一些想法,并加入了一些自己的东西来替换缺少的register_globals和缺少的会话函数,这样我就不必重写过去几十年的所有代码,这些代码还可以处理多维数组,并从会话中构建全局变量。
要使代码正常工作,请在php.ini上使用
auto_prepend_file
指定包含以下代码的文件,例如:auto_prepend_file = /srv/www/php/.auto_prepend.php.inc
你应该已经安装了PECL的runkit扩展,并且在你的php.ini上有以下条目:
.汽车_prepend.php.inc:
fxnxkyjh2#
我们只需要在这个被弃用的函数前面使用
@
。不需要像上面提到的那样做任何修改。例如:if(!@session_is_registered("username")){ }
。只需输入@
,问题就解决了。kxe2p93d3#
别用它。说明书上写着:
在当前会话中注册一个或多个全局变量。
我想到了两件事:
1.使用全局变量并不好,想办法避免使用它们。
1.您仍然可以使用
$_SESSION['var'] = "value"
设置变量。另请参见manual的警告:
如果你想让你的脚本在不考虑
register_globals
的情况下工作,你需要使用$_SESSION
数组,因为$_SESSION
条目是自动注册的。如果你的脚本使用session_register()
,它将不能在PHP指令register_globals
被禁用的环境中工作。这一点非常重要,因为
register_globals
指令is set toFalse
by default!此外:
这注册了一个
global
变量。如果你想从函数中注册一个会话变量,你需要确保使用global
关键字或$GLOBALS[]
数组使其成为全局变量,或者使用特殊的会话数组,如下所述。以及
如果使用的是
$_SESSION
(或$HTTP_SESSION_VARS
),请不要使用session_register()
、session_is_registered()
和session_unregister()
。irlmq6kh4#
**直接使用
$_SESSION
设置变量。**如下所示:代替:
Read More Here
dddzy1tm5#
PHP 5.3之前版本
自PHP 5.3起
sqyvllje6#
如果你需要一个回退函数,你可以使用
ruyhziif7#
为了补充Felix Kling的答案,我正在研究一个代码库,它曾经包含以下代码:
为了不使用session_register,他们进行了以下调整: