2010-09-17 50 views
2

我已经打开error_reporting(E_ALL),并运行此代码:为什么我应该在尝试访问之前检查数组键是否存在?

$topic_id = (int) safe_query($_GET['top_id']); 

if($topic_id > 0) 
    include("topic.php"); 

而得到这个错误:Notice: Undefined index: top_id。我做的不好吗?如果是,那为什么?我是否应该在$topic_id之前检查$_GET['top_id']是否为空?为什么?谢谢。

回答

4

我这样做的原因之一是为了防止意外的行为。代码应该总是反映程序员的意图。如果一个行为取决于背景中的某个神秘过程,那么当你在bug和调试中深陷困境时,它最终会来到你身边并咬你。

传统上,尝试使用不存在的键访问数组会导致崩溃(可能在非托管环境中)或错误。 PHP在后台默默地'修复'对于初学者来说非常好,但对于调试很不利。你的代码可以工作,但可能会给你意想不到的结果。

举例来说,你的代码。说调用页面忘记指定top_id,或拼错它作为topid,并且PHP继续它的快乐方式。它没有包含topic.php,没有任何反应。代码工作正常。 PHP不会抱怨。怎么了?

现在,您的代码很短。当它更长时会发生什么?在多行之间,不同功能之间进行嵌套?对于你的情况,这不是什么大问题,但是当进行复杂的数组操作时,它会使调试更加困难。

0

我现在明白了这个问题。我建议使用isset只是为了安全起见。我假设你没有一个为0的topic_id。

+0

因为如果它不存在,它就会变成零,对我来说没关系。它有效,所以我为什么要改变它,这就是我所要求的。 – 2010-09-17 16:26:28

0

这里不是一个真正的问题,因为如果无论如何你只对它采取行动。然而,你只是幸运的是,未设定的价值评估为假。另外,继续给它发出警告会很烦人。你可能最适合做其他人的建议,在使用之前检查它是否设置好。设置一个可以做到这一点的函数是最简单的,特别是如果你要检查很多GET参数。

不管你做什么,不要只是降低警告水平来压制警告;在这种情况下,从未设置的变量赋值并不会造成任何影响,但在将来它可能会指示实际的错误。

0

“并得到这个错误......这是我做的不好吗?”

那么,它不会给你一个Error。它给你一个Notice。生产服务器上的通知“被忽略”(即未回显)。

本质上,PHP告诉你什么Extrakun在他的答案中说。您应该通过通知发现潜在错误,以后可能会导致错误

所以,“我这样做不好吗?” ... 也许不会。但是,再一次,PHP也没有给你一个错误。它给你适当的关注,代码段应得的 - 一个Notice

相关问题