如何在php中取消设置全局变量?
Posted
技术标签:
【中文标题】如何在php中取消设置全局变量?【英文标题】:How to unset global variable in php? 【发布时间】:2014-11-07 03:21:15 【问题描述】:我非常了解 php 和 web 编程。这是我的php代码。我见过几个类似的问题。他们使用 unset 函数取消设置全局变量。我希望每次用户打开网址时,都会提示用户名和密码,输入用户名密码后,如果正确则下载文件并删除用户名和密码,如果错误则删除用户名和密码并再次提示输入用户名密码。
<?php
function destroy_foo()
if (isset($_SERVER['PHP_AUTH_USER']))
unset($_SERVER['PHP_AUTH_USER']);
if (isset($_SERVER['PHP_AUTH_PW']))
unset($_SERVER['PHP_AUTH_PW']);
if (!isset($_SERVER['PHP_AUTH_USER']))
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Text to send if user hits Cancel button';
exit;
else
echo "<p>Hello $_SERVER['PHP_AUTH_USER'].</p>";
echo "<p>You entered $_SERVER['PHP_AUTH_PW'] as your password.</p>";
$file = 'welcome.txt';
if($_SERVER['PHP_AUTH_PW'] == "admin" && $_SERVER['PHP_AUTH_USER'] =="admin")
destroy_foo();
if (file_exists($file))
//Do some task
destroy_foo();
exit;
else
//Do some task
destroy_foo();
?>
目前用户名和密码出于某种原因保留在全局变量中。如果您能提供建议或提示,我将不胜感激。
编辑
这也不起作用:
function destroy_foo()
if (isset($_SERVER['PHP_AUTH_USER']))
unset($_SERVER['PHP_AUTH_USER']);
$_SERVER['PHP_AUTH_USER'] = null;
if (isset($_SERVER['PHP_AUTH_PW']))
unset($_SERVER['PHP_AUTH_PW']);
$_SERVER['PHP_AUTH_PW'] = null;
文件链接:http://behzadgarekani.net16.net/
【问题讨论】:
PHP 中的 $_SERVER 变量只是来自您的网络服务器的 CGI 环境变量的副本。基本 HTTP 握手完成后,客户端将在 每个 请求上重新发送它们。在每个任务上触发授权弹出窗口是不可行的,当然也是错误的方法。为什么要这样纠缠用户? @mario 感谢您的回复。我认为你是对的。我做了所有的答案,但没有奏效。如您所说,一旦密码正确,它将被保存,下次没有密码时正在下载。但是我需要为这个文件提供高度的安全性,并且客户端计算机在医院里,由护士共享。所以我们不想保存用户和密码。 【参考方案1】:将它们设置为空
看这里How to unset global variables.
【讨论】:
【参考方案2】:使用$GLOBALS
$GLOBALS — 引用全局范围内的所有可用变量
说明¶
一个关联数组,包含对当前在脚本全局范围内定义的所有变量的引用。变量名是数组的键。
你可以用这个
unset($GLOBALS[_SERVER]);
【讨论】:
我的问题是当我输入用户密码时,我下载了文件。当我再次点击 url 链接时,它仍然有用户名密码,并且没有提示再次输入用户名和密码下载文件!【参考方案3】:我认为你使用 unset() 函数做得很好,但我看到了一些无序的代码。 我认为通过这种方式你可以做你想做的事:
function destroy_foo()
if(isset($_SERVER['PHP_AUTH_USER']))
unset($_SERVER['PHP_AUTH_USER']);
if (isset($_SERVER['PHP_AUTH_PW']))
unset($_SERVER['PHP_AUTH_PW']);
if(isset($_SERVER['PHP_AUTH_USER']) && $_SERVER['PHP_AUTH_USER']=='admin' && isset($_SERVER['PHP_AUTH_PW']) && $_SERVER['PHP_AUTH_PW']=='admin')
//download the file
destroy_foo();
else
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Text to send if user hits Cancel button';
【讨论】:
我发现无法取消设置服务器变量(运行 Linux/Apache)【参考方案4】:如果$_SERVER['PHP_AUTH_USER']
未设置或为空,则执行以下条件。
if (!isset($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER']=="")
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Text to send if user hits Cancel button';
exit;
要清空$_SERVER['PHP_AUTH_USER']
,请使用以下函数:
function destroy_foo()
$_SERVER['PHP_AUTH_USER']="";
【讨论】:
以上是关于如何在php中取消设置全局变量?的主要内容,如果未能解决你的问题,请参考以下文章
PHP 变量范围 - 在 foreach 循环中设置全局变量