为什么要检查$_GET两次呢?


Why check $_GET twice?

我正在学习PHP,我希望您能解释为什么购物车教程的作者在调用将产品添加到购物车中时这样做。

if(isset($_GET['action']) && $_GET['action']=="add")

站点在处理之前检查$_GET[action]是否设置,$_GET[action]是否等于'add',但这在功能上不等于:

if($_GET['action']=="add")

因为如果值是'add'它要设置,如果它没有设置它不可能是'add'对吗?还是我错过了什么?

不,那不一样让我解释一下1. Isset检查数组中的任意一个键是否设置2. 双等号检查简单比较

引用文档:

尝试访问未定义的数组键与访问任何其他未定义的变量相同:将发出e_notice级别的错误消息,结果将为NULL。

检查isset是一个很好的防御措施,以保持你的日志被这些(无用的)消息垃圾邮件。

不,不一样。考虑一个查询字符串,如?action=add&product=banana—在这种情况下,语句if(isset($_GET['action']) && $_GET['action']=="add")将是有效的,一旦该条件被认为满足,脚本就可以处理所需的任何内容。如果省略action参数并使用查询字符串(如?product=banana&colour=red), If语句将抛出关于未定义索引的错误警告。

isset测试指定变量在$_GET数组中是否可用—或者您可以使用if( array_key_exists('action',$_GET) && $_GET['action']=='add' ){

这是必要的,因为首先它会检查是否设置$_GET['action']意味着它不是null,然后它检查它必须是add,然后执行某些代码,而不是如果值是edit或其他任何东西

答案已经给出了,但我想补充的是,在使用&&的条件下,如果左侧表达式已经返回false,则右侧表达式将不会执行。因此,如果相应地设置了Error-Reporting,下面的代码仍然会返回一个Warning-Notice:

if($_GET['action']=="add" && isset($_GET['action']))

您必须首先检查isset(),正如在代码示例中所做的那样。

PHP在条件中处理逻辑运算符的更多例子:http://php.net/manual/en/language.operators.logical.php的例子- 139