如何取消设置全局变量


How to unset a global variable?

    <?php 
echo "test";
     echo $city;
     ?>

即使没有其他代码,这也会不断从 url 中回显出城市在页面上。我假设这是一个全局变量...

<?php
        unset($GLOBALS[_SERVER]);
        echo $city;
        ?>

我已经启动并销毁了一个会话,以确保不在会话中。如果我更改变量,它不会回显出来。如果我将网址 ?city=Boston 更改为 ?city=Chicago,那么它会更新。

$city = $_GET["城市"];页面上不存在...页面的其余部分为空。

您描述的行为听起来像是启用了 PHP register_globals配置选项。此选项会导致在脚本启动期间将所有 GET 和 POST 变量(以及可选的 cookie)创建为全局变量。这是一个巨大的安全问题,因此自 PHP 4.2.0(2002 年 4 月发布)以来默认关闭,并且在 PHP 5.4 及更高版本(2012 年 3 月发布)中根本无法启用。它为您的系统打开的事实令人不安,因为它表明您正在运行 PHP 5.3 或更早版本,它不再收到安全补丁!

要禁用它,请将 PHP 升级到受支持的版本。

如果无法做到这一点,请编辑您的 PHP 配置文件,找到设置register_globals = On(或= 1)的行,然后将其删除。十多年来一直不建议使用此选项;不应启用它。

(没有在运行时禁用register_globals的安全方法。使用 ini_set() 禁用它不起作用,因为它在脚本启动之前生效,并且无法安全地删除它创建的所有变量,因为这些变量有时可能会覆盖系统全局变量。唯一安全的方法是完全关闭它。

$city已经有一个值的最可能原因是register_globals设置ON。这意味着每个GETPOST和其他一些变量都注册为脚本中的全局变量。例如,如果您像 script.php?city=New+York 一样打开脚本,您将在代码中定义一个值为"New York"$city变量。

如果您不希望出现这种行为,则需要在php.ini中禁用register_globals

在此处阅读有关register_globals的更多信息 http://php.net/manual/en/security.globals.php