2011-08-19 128 views
1

昨天我在代码中搜索了几个小时后发现了一个错误,我注意到这个奇怪的评估。我将分数传递给php,有时候分数= 0会导致问题。PHP if()评估问题需要重写

发送PHP?等等=等等&得分= 0

if(!empty($_REQUEST['score']){ 
    //do database update stuff 
}else{ 
    // show entire webpage 
} 

它的伟大工程,除非得分= 0,如果()将评估为false和整个网页回到我的AJAX的处理程序和错误。我已经临时将!empty更改为isset,但是这会导致将来出现问题,因为即使score值不在值的url字符串中,isset也会计算为true。
例如:(?等等=等等&得分= &东西=其他)

我的问题是:什么是重新编写这个现在和将来能够正常工作的最佳方法?

编辑:这里有几个工作答案,我很欣赏每个人的时间。很难选择答案

+0

尝试使用'$ _GET'代替'$ _REQUEST'的? – nkcmr

+0

然后你可能想使用'strlen()'。 – mario

回答

1

尝试做

if (isset($_REQUEST['score']) && ($_REQUEST['score'] !== '')) { 
... 
} 

的isset将处理存在/不存在查询参数,严格字符串(!==)比较将处理'score'查询存在但没有值的情况。 PHP将来自_GET/_POST/_REQUEST的所有数据视为字符串,因此该测试100%可靠。

+0

选择了这一个,因为虽然它不像我做的其他一些答案那样扩展,但它确实回答了我的问题。谢谢 –

3

manual所述,如果变量具有空的或零值,则认为该变量为empty()

所以它会将您的变量错误地视为空,尽管0在您的情况下是一个完全可接受的值。

如果您需要score是一个数字,你可以结合使用isset()is_numeric()检查代替:

if((isset($_REQUEST['score']) and (is_numeric($_REQUEST['score'])){ 

退房手册页以查看类型的值is_numeric()接受。如果score始终是一个整数,那么也可以使用is_int((int)$_REQUEST['score']),但它会将无效输入值转换为0

此外,正如@sightofnick所说,最好使用明确的$_GET$_POST而不是$_REQUEST

回复您的更新:

在这种情况下,我会

  1. 做检查变量是否"0"(字符串 “零”)
  2. 如果"0",使0(整数“零”)
  3. 如果它不是0,将其转换为整数(int)$_REQUEST["score"])
  4. 如果转换导致0,它是无效输入 - 退出
  5. 您有一个有效的整数变量。
+0

我刚才解释了为什么我不能使用isset ..我不认为你读完整个问题。 –

+0

@Johnny足够公平,增加了更准确的替代 –

+0

我很欣赏很好解释的答案。不幸的是is_numeric也可以允许字母与数字混合在一起,这会导致我的巨大问题 –

2

如果值为零,empty()将返回false。使用isset()array_key_exists()相反,如果你想检查是否在数组中的变量设置:

if (array_key_exists('score', $_REQUEST)) {...} 
+0

我喜欢这一个,不幸的是我可以改变'分数'为'任何',它仍然返回true。 –

0
if(isset($_REQUEST['score']) && $_REQUEST['score'] != ''){ 
    //do database update stuff 
}else{ 
    // show entire webpage 
} 
+0

!=''将会失败。 0和''相当于每个,PHP根据需要高兴地转换它们。它应该是!== –

+0

没有人争辩,但实际上你在这里弄错了我的朋友 - 如果你不相信我,就把我的上面的代码插入到PHP中,然后按照预期工作。此外,!==''甚至没有意义,!==意思是“不计算为”,所以你基本上说“如果$ _REQUEST ['score']不计算为false”,这将永远是如果$ _REQUEST ['score']被设置,则返回true。 – streetlogics

+0

试图编辑我的评论,但错过了窗口 - 看起来像我们的两个解决方案工作。我假设我的工作原因是因为从技术上讲,0的$ _REQUEST值被传递为一个字符串而不是一个整数0值,因此PHP不会自动将它转换为等同于'' – streetlogics

0

您可能能够解决与

if (isset($_REQUEST['score']) && is_numeric($_REQUEST['score'])) {} 

那当然如果scrore只能包含数值