我发现自己现在正在研究很多其他人的代码。我在一些代码中注意到if (isset($_POST))
,并确保修复它。 (它将始终评估true
)。然后我开始看到这个:
if ($_POST)
经过深思熟虑之后,它让我很烦,但似乎仍然有效。有没有人看到使用它检查表单是否已提交有任何问题?如果$_POST
数组为空,则其计算结果为false
。这可能不起作用的任何特殊情况?
答案 0 :(得分:6)
这是一个不可靠的测试 - 它假设至少会提交一个表单元素。完全可以在没有提交数据的情况下执行POST,这会使if ($_POST)
评估为false,但在实际执行POST时会出现meta-false。
正确的100%可靠测试是
if ($_SERVER['REQUEST_METHOD'] == 'POST') { ... }
答案 1 :(得分:3)
要检查数组是否为空,您应该使用count()
或sizeof()
并检查它是否大于零:
if( count($_POST) > 0 )
{ # Array not empty
}
检查表单是否已提交的更好方法是检查是否有发送的帖子:
if( $_SERVER['REQUEST_METHOD'] === 'POST' )
{ # Form submitted
}
答案 2 :(得分:1)
应该没有不会发生的情况(不管怎么说,我都不会想到),但我仍然会这样做:
if (!empty($_POST)) {
使您更清楚地了解自己在做什么。这实际上是相同的陈述,但更明显。
答案 3 :(得分:1)
在PHP 4.1之前没有$ _POST。相反,有一个名为$ HTTP_POST_VARS的变量,除了它不是超全局之外,它做了同样的事情。 $ HTTP_POST_VARS已被弃用,希望您不必过多担心,但如果您运行php< __ POST,$ _POST检查实际上可能会返回false。 4.1安装,因此您的代码可能已经检查过。
if ($_POST)
与if (!empty($_POST))
的行为完全相同,除了一个重要区别:如果$ _POST未设置,第一个版本将抛出通知,empty() - 版本不会发出通知(当然必须将error_output设置为echo通知,以便您查看内容)。如果您正在检查的变量可能未设置,则应始终使用空。
我会说,如果你发现if ($_POST)
而不是那种难闻的气味。您已经注意到原始编码器的意图不明确。如果他想要知道HTTP-Request使用了POST方法,那么Wouter的回答会使意图更加清晰。如果他想检查$ _POST是否存在(检查旧的PHP版本),那么isset($_POST)
更清楚。如果他想检查一个POST请求是否至少有一个参数使用POST发送,那么empty($_POST)
会更加清晰,这样的意图也应该非常少。
我的建议是继续阅读源代码并检查你是否可以找出原始编码器的意图,然后相应地更换构造(或者至少对该行进行评论)。
答案 4 :(得分:0)
[timwolla@/var/www]telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET /test.php HTTP/1.0
Host: localhost
HTTP/1.0 200 OK
X-Powered-By: PHP/5.3.6-13ubuntu3.3
Content-type: text/html
Content-Length: 13
Connection: close
array(0) {
}
GET-Requests似乎也没问题。但使用!empty($_POST)
或类似内容更具可读性。
答案 5 :(得分:0)
如果程序员不期望POST的形式,它将成为一个非常危险的测试。我的模式是测试我期望的每个字段:
if (isset($_POST['foo_id']) && is_numeric($_POST['foo_id'])
&& isset($_POST['name'])
&& isset($_POST['value'])
) {
通过这种方式,我可以确定没有机会处理错误的表格。