为什么检查 $_GET 两次?

Why check $_GET twice?

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

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

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

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

因为如果值为'add',则必须设置,如果不设置,则不可能是'add',对吧?还是我遗漏了什么?

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

引用the documentation:

Attempting to access an array key which has not been defined is the same as accessing any other undefined variable: an E_NOTICE-level error message will be issued, and the result will be 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' ){

不,那不一样 让我解释一下 1. isset 检查任一键是否设置在数组中 2. 双重等于检查简单比较

答案已经给出,但我想补充一点,在使用&&的条件下,如果左边的表达式已经存在,则右边的表达式将不会被执行return错误。 因此,如果相应地设置了错误报告,以下内容仍然会 return 警告通知:

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

您必须先检查 isset(),就像您的代码示例中所做的那样。

有关 PHP 在条件中处理逻辑运算符的方式的更多示例: http://php.net/manual/en/language.operators.logical.php#example-139