【问题标题】:PHP local variable checkPHP局部变量检查
【发布时间】:2011-08-31 08:17:17
【问题描述】:

我正在使用一组变量,每次加载页面时都会检查这些变量。我已经成功地检查了 $_REQUEST 和 $_SESSION,但是在动态检查分配给页面更高位置的变量时遇到了问题(如果它们已设置)。

以下是我的代码:

$important_field = array('treatmentId','category','state','providerId','sellDoc','insuranceName','grossCharge','discount','allowable','patientPortion','insurancePortion','dateOfService','billFileLocation','eobFileLocation','fromTable');
foreach ($important_field as $key) {
    if (!$$key || $$key == "none" || $$key == "" || $$key == NULL) {
        if (!$_REQUEST[$key] || $_REQUEST[$key] == "" || $_REQUEST[$key] == NULL) {
            if (!$_SESSION[$key]) {
                // wow, guess it just wasn't set anywhere...
            } else {
                $user->sell->$key = $_SESSION[$key];
            }
        } else { 
            $user->sell->$key = $_REQUEST[$key]; $_SESSION[$key] = $_REQUEST[$key]; 
        }
    } else {
        $user->sell->$$key = $$key; $_SESSION[$$key] = $$key; 
    }
}

显然评估 $$key 似乎没有做我正在寻找的事情,因为它从不将变量分配给会话......我应该如何评估 $key 以获得当前设置的值,比如字段 $ eobFileLocation 如果在检查之前已经在 PHP 中设置?

谢谢,

银虎

更新:

好的,我有以下代码,但仍有一个错误。当我通过在每个页面上设置这些变量中的一些变量来跟踪我的过程时,并按预期由会话变量进行传递。我仍然遇到的问题是,当我提交一个应该将会话变量更改为新提交的值的新 $_REQUEST 变量时,脚本正在寻找一个局部变量......它在哪里拉 $key 和 $$key是否将这些作为局部变量?

$important_field = array('treatmentId','category','state','city','providerId','sellDoc','insuranceName','grossCharge','discount','allowable','patientPortion','insurancePortion','dateOfService','billFileLocation','eobFileLocation','fromTable');
foreach ($important_field as $key) {
    if (isset($$key) && !empty($$key) && $$key != "none") {
        echo "Found local variable for ".$key.", i'll set the session and user to this.<br>\n";
        $user->sell->$key = $$key;
        $_SESSION[$key] = $$key; 
    } elseif (isset($_REQUEST[$key]) && !empty($_REQUEST[$key])) {
        echo "Found submitted form  variable for ".$key.", i'll set the session and user to this.<br>\n";
        $user->sell->$key = $_REQUEST[$key];
        $_SESSION[$key] = $_REQUEST[$key]; 
    } elseif (isset($_SESSION[$key]) && !empty($_SESSION[$key])) {
        echo "Found a session variable ".$key.", i'll set the user to this.<br>\n";
        $user->sell->$key = $_SESSION[$key];
    } else {
        echo "There was no provided data for ".$key."<br>\n";
    }
}

任何想法为什么当我加载页面时它认为本地(如上所列)已设置? $key 和 $$key 是否从 $_SESSION['blah']/$_REQUEST['blah'] 读取并认为它只是 $blah?

【问题讨论】:

  • ok ... 找到了问题——尽管我认为我已经解决了它。显然我恢复到旧代码并没有抓住它..这是修复..不要在任何地方使用 $$ ,只是你想要变量的值..即 user->sell->$key = $$key 。 ..不是用户->销售->$$key = $$key.
  • 也许您可以先简要介绍一下这段代码应该做什么?您正在检查一个变量是否在本地设置,否则是否设置在$_REQUEST 中,否则如果它设置在$_SESSION 中,那么为您的$user 对象使用第一个匹配值?
  • 顺便说一句,这似乎是非常糟糕的数据卫生和混乱的数据流。如果你不知道值在哪里,并且如果你有很多“假”的情况,包括"none",你应该首先处理内部一致性和数据管理。
  • 我正在努力确保这主要在 $_SESSION 变量中可用,但为了以防万一,也将它推到 $user 中。如上面更新的帖子中所示,我还更改了我的 if 语句......但显然它仍然需要工作..
  • deceze - 这是为与 PHPBB3 交互而构建的自定义页面,$user->sell 是我创建的一组用于跟踪销售数据的变量。我正在使用 SESSION 跨页面保留数据,因为我不确定 $user 何时被清除,尽管它是基于集成在每个页面上定义的。

标签: php variables evaluation


【解决方案1】:

你确定这是你想要的:

$user->sell->$$key = $$key;

不应该

$user->sell->$key = $$key;

尝试使用空函数:

if (empty($$key) || $$key == "none")
if (empty($_REQUEST[$key]))

和isset函数:

if (!isset($_SESSION[$key]))

【讨论】:

  • 我想说“我把它缩短了”......但我想我会稍微改变一下......这就是我所拥有的
【解决方案2】:

是的

$user->sell->$key = $$key;

不是

$user->sell->$$key = $$key;

$_SESSION[$$key] 

应该是

$_SESSION[$key] 

【讨论】:

    【解决方案3】:

    你弄乱了你的变量,这不好。实际上,使用两个 var 符号 ($$) 来描述一个“变量变量”。

    $foo = "name";
    $$foo = "value";
    

    所以你期望以下:

    echo $foo; // => "name"
    echo $$foo; // => "value"
    

    您可能期待的是:

    echo $name; // => "value"
    

    所以你最好先清理你的代码。

    【讨论】:

      【解决方案4】:

      好吧,我已经表达了我对这种方法在 cmets 中的清洁度的担忧。这里至少有一些更紧凑的代码,没有可变变量来做同样的事情:

      $keys = array('treatmentId', 'category', ...)
      
      $values = array_filter(array_merge(
          array_intersect_key($_SESSION, array_flip($keys)),
          array_intersect_key($_REQUEST, array_flip($keys)),
          compact($keys)
      ), function ($v) { return $v && $v != 'none'; });
      
      $_SESSION = array_merge($_SESSION, $values);
      foreach ($values as $key => $value) {
          $user->sell->$key = $value;
      }
      
      // For debugging purposes:
      //
      // $diff = array_diff_key(array_flip($keys), $values);
      // if ($diff) {
      //    'No values for ' . join(', ', array_keys($diff));
      // }
      

      【讨论】:

      • hmm .. 我什至从未使用过您所说的某些功能.. 我必须仔细阅读才能更好地理解它们,因为如果我不这样做,我讨厌复制/粘贴代码'不知道它在做什么......在考虑之后,只要我能维持我的会话,我就不需要用户->值
      • @Silvertiger 当然,请阅读这些功能!批发数组处理、合并和compacting 和 much 优于大量 foreachs 和重复代码。
      • 我很想对其进行测试,但它未能通过 array_filter 命令的语法检查。如果我能更好地理解它,我将能够修复它。
      • @Silvertiger array_filter 回调使用 PHP 5.3 语法。在 PHP 5.2- 中,您可以将 function () { } 部分替换为 create_function('$v', 'return $v &amp;&amp; $v != "none";')
      • 呃 .. 这两种方法都不喜欢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多