【问题标题】:Why check $_GET twice?为什么要检查 $_GET 两次?
【发布时间】:2015-08-22 10:08:11
【问题描述】:

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

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

网站检查$_GET[action] 是否已设置,$_GET[action] 在处理前等于“添加”,但在功能上不等同于:

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

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

【问题讨论】:

  • 为什么不自己找出来呢?确保您打开了错误报告:ini_set("display_errors", 1); error_reporting(E_ALL); 然后使用查询字符串调用 url,例如xy.php?action=add 一次没有它:xy.php

标签: php get isset


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    引用the documentation

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

    检查isset 是一种很好的防御措施,可以防止您的日志被这些(无用的)消息发送到垃圾邮件中。

    【讨论】:

    • 我不会称它们无用 - 如果代码为 if($_GET['action']==0),则该消息将表明存在真正的(潜在的)问题。
    • @fvu 也许这不是最好的措辞。在这种情况下,他们不会添加任何有用的信息——你的意思是检查GET['add']。您确切地知道自己在做什么以及为什么会失败。这并不是说您没有准备好接受令人惊讶的用户输入。
    • 谢谢,这很有道理。第二次比较失败的结果将是一个错误,而第一次比较只是空,如果不设置为“添加”会更好。
    【解决方案3】:

    不,不一样。考虑一个查询字符串,例如?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' ){

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-10-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多