【问题标题】:How to unset global variable in php?如何在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 感谢您的回复。我认为你是对的。我做了所有的答案,但没有奏效。如您所说,一旦密码正确,它将被保存,下次没有密码时正在下载。但是我需要为这个文件提供高度的安全性,并且客户端计算机在医院里,由护士共享。所以我们不想保存用户和密码。

标签: php global-variables unset


【解决方案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']="";
    }
    

    【讨论】:

      猜你喜欢
      • 2012-01-27
      • 2011-11-08
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 2013-11-10
      • 2011-03-12
      • 2019-06-13
      相关资源
      最近更新 更多