如何在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中取消设置全局变量?的主要内容,如果未能解决你的问题,请参考以下文章

“header()” php 函数是不是取消设置全局变量?

PHP 变量范围 - 在 foreach 循环中设置全局变量

在LABVIEW中如何设置全局变量

axure全局变量怎么用?axure如何设置全局变量?求助!!

php扩展在全局变量中不存在但是打印phpinfo却存在?

在Postman中如何设置全局变量?