【问题标题】:What is the best way to know is $_GET['example']=="somevalue"?了解 $_GET['example']=="somevalue" 的最佳方法是什么?
【发布时间】:2012-06-04 16:04:26
【问题描述】:
if((isset($_GET[example]))&&($_GET['example']=='somevalue')){ ... }

if((!empty($_GET[example]))&&($_GET['example']=='somevalue')){ ... }

或者只是

if($_GET['example']=='somevalue'){ ... }

我在问为什么我看到很多例子,人们首先检查是否设置了 $_GET['example'],然后检查是否设置了 $_GET['example']=='somevalue'(上面的第一个和第二个示例)。 我不明白为什么不只使用最后一个解决方案(如果 $_GET['example']=='somevalue' 那么 $_GET['example'] 显然已设置)。

此问题涉及任何其他变量( $_POST、$_SERVER、ecc )。

【问题讨论】:

标签: php


【解决方案1】:
if((isset($_GET[example]))&&($_GET['example']=='somevalue')){ ... }

是正确的,您想知道“变量”是否存在(或已设置)才能使用它。 Empty 只是检查它是否有任何类型的数据。 例如:

<?php
$foo= 0;

if (empty($foo)) { // True because $foo is empty
    echo '$foo is either 0, empty, or not set at all';
}

if (isset($foo)) { // True because $foo is set
    echo '$foo is set even though it is empty';
}

if (isset($var)) { // FALSE because $var was not declared before
   ...
}
?>

【讨论】:

  • 好的,但是如果 $_GET['example']=='somevalue' 那么 $_GET['example'] 显然已设置,那么为什么我还需要检查它是否已设置?
  • 因为如果您尝试访问$_GET['example'] 并且未设置,您会收到通知(或警告,不记得了)。因此,通过首先使用isset 进行测试,您可以避免此通知。
  • 不,如果 isset($_GET[example]) THEN 它会检查 ($_GET['example']=='somevalue')。如果未设置,则它什么也不做或直接转到其他地方。
  • 这是一个关于 empty、isset 等结果的漂亮小电子表格:itslennysfault.com/stuff/emptytest.php
  • 确切地说,正如@Herbert 所说,你不能保证它会被设置,至少不能用 $_GET 和 $_POST 请求。您必须始终考虑最坏的情况。编码时总是认为有人怀有恶意。
【解决方案2】:

issetempty 之间的区别很微妙但很重要。它们在单独使用时最相关。如果您正在检查一个变量是否存在并且是一个真实的值(例如,不是所有空格或 0 的任何字符串),您可以互换使用。

何时使用isset

当了解变量是否已定义且不为空很重要时,请使用isset

if (isset($maybeExistsMaybeNull)) {
    // variable defined and is not NULL
}

何时使用 !empty

​​>

当了解变量是否已定义且是否真实很重要时,请使用!empty

if (!empty($mightBeEmpty)) {
    // variable defined, and isn't "", " ", 0, "0" etc.
}

!empty 是存在和存在的一个很好的简写。

何时使用 array_key_exists

当重要的是要知道键是否存在而值不重要时,请使用array_key_exists

if (array_key_exists('something', $array)) {
    // $array['something'] exists, could be literally anything including null
}

什么时候不使用isset

如果您的代码如下所示:

if (isset($something) && $something) {
    // code is shorter with !empty
}

什么时候不使用 !empty

​​>

如果您的代码如下所示:

if (!empty($something) && $something === "") {
    // you meant isset. this is unreachable.
}

那么你正在编写无法执行的代码

抛出错误的代码很容易出错

避免编写发出您忽略的通知/警告的代码。例如在问题中:

if((isset($_GET[example]))&&($_GET['example']=='somevalue')){ ... }

示例的第一个用途是未声明的常量。或者它是未声明的 - 如果你在代码中的其他地方有 define('example', "foo"); 怎么办。

if($_GET['example']=='somevalue'){ ... }

如果网址不包含?example=..,也会发出通知。

编写代码而不显示错误意味着您很容易错过第一个错误。

在上下文中:isset 和 !empty 是等价的

对于给出的示例,这两种语言结构的行为完全相同。

没有任何情况下一个人的行为会与另一个人不同,如果变量未定义,两者都不会发出通知,并且两者之间的性能没有可衡量的差异。

【讨论】:

  • 仍然不是使用 !empty() 的忠实拥护者,但我同意你的说法。我唯一要说的是取决于预期的数据,我个人不会在第一个实例中对 $_POST / $_GET 数据使用“===”,因为您需要确保数据类型匹配当然使用'===' 0 不等于 '0' 在某些情况下可能会导致问题。
  • 不是你的情况,但我不认为应该鼓励在 $_POST / $_GET 数据上使用 !empty() ,就像你的第二个例子一样(使用 empty())在某些情况下它没有意义。例如,如果 'somevalue' 是一个 int 0 或字符串 '0'(这对于表单数据来说很可能),即使您希望该值是 0,第二种方法也会通过使用 !empty()) 失败。而第一个解决方案会通过。同样,可能存在您确实想要一个空数组()的情况,再次使用!empty()会失败。
  • +1 对您的编辑,谢谢,您所做的很好的补充说明以及关于 array_key_exists() 的很好说明。
【解决方案3】:

正如其他人所说的检查 $_GET 和 $_POST 之类的东西,您最好使用:

if ( isset($_GET['example']) && $_GET['example'] =='somevalue' ) {

// process data

}

所以你总是想首先确保变量已经设置(而不是设置为空)或者换句话说存在。然后继续检查变量是否包含您期望的数据。如果你试图引用一个不存在的变量(通过不检查 isset())php 会给你一个通知说'未定义的变量......等等'。

如果您想知道是否设置了变量但不太关心什么,那么您可以使用:

if ( !empty($_GET['example']) ) {

// process data

}

但在这方面,我会小心在字符串上使用 empty(),因为 empty 可能会在字符串数据(如 '0' 或 ' ' )时表现得很奇怪。

所以我总是会做第一个,以 a) 确保变量存在并且 b) 是你所期望的。

【讨论】:

  • if ( isset($_GET['example']) &amp;&amp; !empty($_GET['example']) ) { 是不必要的重复。它与if (!empty($_GET['example']) { 相同,因为变量不可能是真实的而不是设置的。在问题的上下文中,isset!empty 可以互换使用。
  • 没错,我已经修改了我的答案。我想我想要强调的唯一一件事就是明确检查值。为了可读性,如果没有别的,isset() 结合检查实际值在我看来比使用 !empty() 好得多,不过是个好地方。
【解决方案4】:

这是你可能会做很多的事情,它有助于将一个类/函数放在一起来为你处理这个检查,所以你不必每次都这样做。

function checkValue($key, $value) {
    if(array_key_exists($key, $_REQUEST)){
        if ($_REQUEST[$key] == $value) {
            return true;
        } else {
            return false;
        }

    } else {
        return false;
    }
}

我只是使用 Request 作为默认值而不是切换出去(尽管为了安全起见,在某些情况下最好在 POST 和 GET 之间切换 (imo))。

现在你可以在任何地方调用这个函数 if (checkValue('Item', 'Tom') === true){} 等

【讨论】:

    【解决方案5】:

    最好的

    if((isset($_GET[example]))&&('somevalue'==$_GET['example'])){ ... }
    

    两者的区别

    'somevalue'==$_GET['example']
    

    $_GET['example']=='somevalue'
    

    如果您输入错误 == 并改为输入 =,第一个符号将引发错误以通知您。

    【讨论】:

      【解决方案6】:
      if((isset($_GET[example]))&&($_GET['example']=='somevalue')){ ... }
      

      【讨论】:

        猜你喜欢
        • 2019-09-05
        • 1970-01-01
        • 1970-01-01
        • 2019-09-16
        • 2010-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多