如何检查 $_GET 是否为空?

68
如何检查$_GET是否为空?
8个回答

147

你自己说了,检查它是否为empty

if (empty($_GET)) {
    // no data passed by get
}

看,PHP就是这么简单直接。你可以随意写出你想要的代码 ;)

这种方法非常安全。!$_GET 如果$_GET未设置(可能性不大,但有可能)会导致未定义变量E_NOTICE。


3
不,你永远不希望代码向你抛出通知。源代码抛出任何类型的错误都被认为是不好的。 - NikiC
2
那么所有这些错误的目的是什么呢?有什么建议吗? - Your Common Sense
2
告诉你,你在编码时犯了一个错误。如果我得到一个解析错误,我可以纠正这个错误。如果我得到一个未定义的变量/索引通知,我也可以纠正它。这就是目的。但生产代码不应该抛出错误。(如果确实发生错误,它们应该被抑制并记录下来。) - NikiC
1
@premiso,就像这里的许多人一样,你说的话是正确的,但它们在这种情况下不适用。无论您使用empty()与否,错误处理都不会有任何区别。你们都是好学生,学习得很好。但现在你们不需要毫无头绪地背诵它,而是需要思考一下。将你们的知识应用到具体的情况中。在这里没有一个理由使用empty()。 - Your Common Sense
1
最好拥有一个运行顺畅的应用程序,但是如果出现问题,它会向您发出错误提示。您仍然无法区分这两种状态-正常和紧急状态。后者需要错误消息。 - Your Common Sense
显示剩余13条评论

12

我想最简单的方法是不需要任何运算符的:

if($_GET){
//do something if $_GET is set 
} 
if(!$_GET){
//do something if $_GET is NOT set 
} 

1
使用空值进行测试是更好的选择,因为-1可能会引发警告错误。 - Jim
4
有没有现实生活的例子可以证明为什么不使用empty()更好?给+1。+1 是指赞成或者支持,"there is no need to use empty()" 表示在某些情况下,使用 empty() 函数并不必要。@premiso 希望提供一个现实生活中的例子来证明为什么不使用 empty() 更好。 - Your Common Sense
不,我实际上并没有。但是我可以问你同样的问题,为什么你的解决方案更好,并且如果你能向我提供真实的例子来说明你的解决方案更好,那么真正的答案是两者都有效(在我的模糊测试之后)。所以,是的,我对这个回答的否定投票是错误的,如果用户修改了它,我会改变我的投票。归根结底是个人喜好,我更喜欢使用empty。我能给出的唯一理由是empty检查一个项目是否为空。考虑到$_GET未设置时从var_dump返回array(0),在我看来,empty似乎是更好的选择。 - Jim
它应该发布一个通知。 - Hamid Sarfraz

11

为了提供一些变化,您可以检查

if ($_SERVER["QUERY_STRING"] == null)

它与测试$_GET完全相同。


+1 我也想到了同样的事情,但不确定需要检查什么。是针对!issetnull还是''null在这里可行吗?你测试过吗? - NikiC
@nikic 测试过并且可行。因为它来自Apache,所以即使为空,它也始终会被设置,因此不需要进行array_key_exists()检查。 - Pekka

8
<?php
if (!isset($_GET) || empty($_GET))
{
    // do stuff here
}

9
这里不需要使用 !isset($_GET)if (empty($_GET)) 就足够了。 - Alexander Konstantinov
2
只是提醒一下:$_GET可以被取消设置,但是很少有人这样配置PHP(请参见“variables_order”)。 - Wrikken
2
@Wrikken:我认为Alexander没有解决这个问题。empty简单地检查变量是否设置,因此使用isset进行检查是多余的。 - NikiC
1
啊,是的,忘记了empty确实是一种语言结构。 - Wrikken

5
if (!$_GET) echo "empty";

为什么需要这样的检查?

哈哈
你们太直接了。
不要生气,但有时候一点也不灵活
$_GET是非常特殊的变量,不像其他变量。
它应该始终被设置。不需要像其他变量一样对待它。 当$_GET未设置且预期设置时,这是一种紧急情况,这就是“未定义变量”通知发明的原因。


1
@mario 有没有示例可以演示? - Your Common Sense
1
@nikic,如果提醒你,你将会被告知那可怕的破坏行为!有什么比这更好的呢?这就是错误消息存在的意义——告诉你这样恶意程序员的存在!我已经告诉你三次了!用户们会向你投诉,你来检查日志——哇啦!出现了问题——$_GET没有设置! - Your Common Sense
1
离题了,我现在使用对象风格的包装器来封装 $_GET、$_REQUEST 和 $_POST(强制执行输入过滤)。但这是一个极为特殊的情况,在这种情况下,“NOTICE-minded empty() folks” 也会失败。 - mario
1
@niki 我不是在谈论你的经验。我在谈论这个问题中的这个具体例子。我坚持认为,在没有明智的情况下,您不需要使用empty或isset。 - Your Common Sense
1
+1 是因为我认为这是一个应该触发通知的情况。对于一个期望在 Web 环境中运行的脚本来说,这将是一个异常条件,值得引起错误,因为所有可能的原因都非常罕见。 - goat
显示剩余6条评论

3

简单易懂。

if (empty($_GET)) {
    // $_GET is empty
}

2
我会使用以下的if语句,因为它更易读(并且在将来修改时更方便)。

if(!isset($_GET) || !is_array($_GET) || count($_GET)==0) {
   // empty, let's make sure it's an empty array for further reference
   $_GET=array();
   // or unset it 
   // or set it to null
   // etc...
}

1
如果(!empty($ _GET)){}更容易阅读。 如果数组不包含项目,则empty()返回TRUE - apaderno
我猜你从未尝试过在不修改它们的情况下集成几个PHP脚本/系统,但是又想防止它们在同一个cron作业或网页中使用时造成破坏。这可能有点过度保护,但我晚上睡得很安稳。如果任何人可以通过URL、ini_set或其他方式修改变量,我通常会对所有变量进行清理、验证和检查。而且,我会记录任何意外输入(例如$_GET不是数组),并记录所有可能的信息,以便稍后重新创建它来修复任何错误或特殊情况... - vlad b.
可能会感兴趣...https://dev59.com/m3A75IYBdhLWcg3wRWsU#3389519 - vlad b.
  1. 在大多数项目中,文件的'id'通常是数字,'username'通常是字符串等...如果这些在插件之前运行,您可以使用 $_POST['password']=hashing_function($_POST['password']) ,这样没有用户实际上可以获得原始内容。
  2. 我更多地使用类而不是文件,但对于一个小例子,一个文件应该足够了。
  3. 我不必每次编写 is_string()、is_empty()、is_numeric() 等函数,我通常有一个单例 if($get->password->is_set()->is_correct()) { ... } else { ... }。
- vlad b.
在编程中,值得使用trim()函数来处理$_GET$_POST变量。有时候,空格可能会被误认为是值的一部分,而实际上并不是。 - sanusart
显示剩余3条评论

2
以下是三种不同的方法来检查此内容:
<?php
//Method 1
if(!empty($_GET))
echo "exist";
else
echo "do not exist";
//Method 2
echo "<br>";
if($_GET)
echo "exist";
else
echo "do not exist";
//Method 3
if(count($_GET))
echo "exist";
else
echo "do not exist";
?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接