2012-01-19 108 views
2

现在我发现自己正在通过很多其他人的代码工作。我注意到一些代码中的if (isset($_POST)),并确保解决该问题。 (它总是会评估true)。然后我开始看到这个:

if ($_POST) 

经过这个想法后,它让我很烦,但似乎仍然有效。有没有人看到用这个来检查表单是否被提交的问题?如果$_POST数组为空,则它的计算结果为false。任何特殊情况下,这可能无法正常工作?

+2

Btw为什么你检查POST数组?您将检查POST变量是否正确? '$ _POST [“data1”]' –

+1

最好检查个别'POST'变量的有效性,但使用它的一个很好的理由是在用户手动导航到表单处理页面,在这种情况下'POST'数组将是空的,你可以相应地处理这种情况。我不认为有这样的情况,尽管这些代码会失败。我认为最好的办法就是使用它,然后在'if'中单独检查每个变量。 – martincarlin87

+0

我总是检查特定的值。我只是想知道是否应该通过编辑在其他人的代码中找到的数百个if($ _POST)实例。 – teynon

回答

6

这是一个不可靠的测试 - 它假定至少会提交一个表单元素。完全可以在没有提交数据的情况下执行POST,这会使if ($_POST)的计算结果为false,但是由于实际执行的是POST,所以是错误的。

适当的100%可靠的测试是

if ($_SERVER['REQUEST_METHOD'] == 'POST') { ... } 
1

不应该有任何情况下,它不会(不,我能想到的,反正),但我仍然会做:

if (!empty($_POST)) { 

这样可以很清楚自己在做什么。这实际上是相同的陈述,但更明显。

+0

空的不正确。如果数组(0)它也是空的。使用['count'](http://php.net/count)检查大小。 –

+0

@WouterJ'如果数组(0)它也是空的 - 不正确。试试这个'$ arr = array(0); var_dump(empty($ arr));' – DaveRandom

+0

@DaveRandom,试试这个:if(empty(array(0)))echo“我是空的”; – HappyTimeGopher

0
[[email protected]/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)或类似软件可读性更强。

0

在程序员不希望发布的表单的情况下,这是一个非常危险的测试。我的模式来测试每个字段我想到:

if (isset($_POST['foo_id']) && is_numeric($_POST['foo_id']) 
    && isset($_POST['name']) 
    && isset($_POST['value']) 
) { 

这样,我可以肯定没有处理错误的形式的机会。

3

要检查如果数组是空的,你应该使用count()sizeof()并检查是否大于零:

if(count($_POST) > 0) 
{ # Array not empty 
} 

检查表单是否已提交的更好方法是检查是否发送了后续变量:

if($_SERVER['REQUEST_METHOD'] === 'POST') 
{ # Form submitted 
} 
1

在PHP 4.1之前没有$ _POST。取而代之的是一个叫做$ HTTP_POST_VARS的变量,除了它不是一个超级全局变量之外,其他变量都是一样的。 $ HTTP_POST_VARS已被弃用,希望您不必担心太多,但如果您运行php安装,则$ _POST检查可能实际返回false,因此您的代码可能已检查过该代码。

if ($_POST)的行为等同于if (!empty($_POST))除了一个重要的区别:第一个版本将抛出一个通知,如果没有设置$ _ POST,空() - 版本将不会抛出的通知(当然error_output必须设置为呼应通知为你看到的东西)。如果您正在检查的变量可能未被设置,则应始终使用空值。

我想说,如果你发现if ($_POST)比这是一种难闻的气味。您已经注意到原始编码器的意图不清楚。如果他想知道HTTP-Request使用了POST方法,那么Wouter的回答使得这个意图更清晰。如果他想检查$ _POST是否存在(检查旧的PHP版本),那么isset($_POST)更清晰。如果他想检查一个POST请求是否至少有一个使用POST发送的参数,那么empty($_POST)就更清晰了,这样的意图也应该是非常少见的。

我的建议是继续阅读源代码,并检查是否可以找出原始编码器的意向,然后相应地替换构造(或至少对该行发表评论)。

+0

这使得更多的意义,因为我正在与史前代码工作。 – teynon