【问题标题】:What does the PHP error message "Notice: Use of undefined constant" mean?PHP 错误消息“注意:使用未定义的常量”是什么意思?
【发布时间】:2011-02-25 20:06:10
【问题描述】:

PHP 正在日志中写入此错误:“注意:使用未定义的常量”。

日志错误:

PHP Notice:  Use of undefined constant department - assumed 'department' (line 5)
PHP Notice:  Use of undefined constant name - assumed 'name' (line 6)
PHP Notice:  Use of undefined constant email - assumed 'email' (line 7)
PHP Notice:  Use of undefined constant message - assumed 'message' (line 8)

相关代码行:

$department = mysql_real_escape_string($_POST[department]);
$name = mysql_real_escape_string($_POST[name]);
$email = mysql_real_escape_string($_POST[email]);
$message = mysql_real_escape_string($_POST[message]);

这是什么意思,为什么我会看到它?

【问题讨论】:

    标签: php constants undefined


    【解决方案1】:

    看起来预定义的 fetch 常量随着 MySQL 扩展消失了,所以我们需要在第一个函数之前添加它们...

    //预定义的获取常量

    define('MYSQL_BOTH',MYSQLI_BOTH);
    define('MYSQL_NUM',MYSQLI_NUM);
    define('MYSQL_ASSOC',MYSQLI_ASSOC);
    

    我测试成功了。

    【讨论】:

      【解决方案2】:

      您错过了在数组键周围加上单引号:

      $_POST[电子邮件]

      应该是:

      $_POST['email']

      【讨论】:

      • 应该是 $_POST['email'];
      【解决方案3】:

      你应该引用你的数组键:

      $department = mysql_real_escape_string($_POST['department']);
      $name = mysql_real_escape_string($_POST['name']);
      $email = mysql_real_escape_string($_POST['email']);
      $message = mysql_real_escape_string($_POST['message']);
      

      按原样,它正在寻找名为departmentnameemailmessage 等的常量。当找不到这样的常量时,PHP(奇怪地)将其解释为字符串( “部门”等)。显然,如果您稍后确实定义了这样一个常量,这很容易被破坏(尽管使用小写常量是不好的风格)。

      【讨论】:

      • 它不是专门指 $_POST。其他关联数组也会发生同样的事情。
      • @Col。弹片,我什么时候说过 only 需要引用数组键?他确实需要引用这些键,但不仅仅是它们。
      • 好吧,我的意思是不需要引用数组键。必须引用字符串,而不是数组键。键不需要特殊引用。
      • 这不是“奇怪的”......它是“向后兼容的”。 PHP 最初允许甚至推广使用不带引号的字符串作为键。 (好吧,也许它仍然是“奇怪的”。:-)
      • @BrianWhite 有趣的是,当proposing to deprecate this functionality 时,我找不到任何证据表明它曾经受到官方鼓励,并且只有 PHP 3.0 的 beta 版本包含了没有通知的行为,所以它似乎是倒退的与从未发布的功能兼容。无论如何,它会在 PHP 8.0 中消失,无论何时出现。
      【解决方案4】:

      插入单引号。

      例子

      $department = mysql_real_escape_string($_POST['department']);
      $name = mysql_real_escape_string($_POST['name']);
      $email = mysql_real_escape_string($_POST['email']);
      $message = mysql_real_escape_string($_POST['message']); 
      

      【讨论】:

        【解决方案5】:

        您可能忘记使用""

        例如:

        $_array[text] = $_var;
        

        改为:

        $_array["text"] = $_var;
        

        【讨论】:

          【解决方案6】:
          <?php 
            ${test}="test information";
            echo $test;
          ?>
          

          注意:使用未定义的常量测试 - 在第 3 行的 D:\xampp\htdocs\sp\test\envoirnmentVariables.php 中假定为“测试” 测试信息

          【讨论】:

            【解决方案7】:

            post变量的正确使用方式是

            <?php
            
            $department = $_POST['department'];
            
            ?>
            

            使用单引号(')

            【讨论】:

              【解决方案8】:

              错误消息是由于不幸的事实,PHP 将隐式声明一个未知标记作为同名的常量字符串。

              也就是说,它试图解释这个(注意缺少的引号):

              $_POST[department]
              

              这在 PHP 中成为有效语法的唯一有效方法是,如果之前定义了一个常量 department。可悲的是,此时它并没有因致命错误而死,而是发出此通知并表现得好像已使用相同的名称和值定义了一个常量:

              // Implicit declaration of constant called department with value 'department'
              define('department', 'department');  
              

              您可以通过多种方式获取此错误消息,但它们都有相同的根本原因 - 可能为常量的标记。

              缺少引号的字符串:$my_array[bad_key]

              这就是你的问题所在,这是因为你有没有被引用的字符串数组键。修复字符串键将修复错误:

              变化:

              $department = mysql_real_escape_string($_POST[department]);
              ...(etc)...
              

              收件人:

              $department = mysql_real_escape_string($_POST['department']);
              ...(etc)...
              

              变量缺少美元符号:var_without_dollar

              您可能会看到此错误消息的另一个原因是,如果您从变量中删除了 $,或者从成员中删除了 $this-&gt;。例如,以下任一情况都会导致类似的错误消息:

              my_local;   // should be $my_local
              my_member;  // should be $this->my_member
              

              变量名中的无效字符:$bad-variable-name

              如果您尝试在变量名中使用不允许的字符,可能会导致类似但更微妙的问题 - 连字符 (-) 而不是下划线 _ 是常见的情况。

              例如,这没关系,因为underscores are allowed in variable names:

              if (123 === $my_var) {
                do_something();
              }
              

              但这不是:

              if (123 === $my-var) {
                do_something();
              }
              

              会这样解释:

              if (123 === $my - var) {  // variable $my minus constant 'var'
                do_something();
              }
              

              在不指定类范围的情况下引用类常量

              为了引用一个类常量,你需要用::指定类范围,如果你错过了这个,PHP会认为你在谈论一个全局define()

              例如:

              class MyClass {
                const MY_CONST = 123;
              
                public function my_method() {
                  return self::MY_CONST;  // This is fine
                }
              
              
                public function my_method() {
                  return MyClass::MY_CONST;  // This is fine
                }
              
                public function my_bad_method() {
                  return MY_CONST;  // BUG - need to specify class scope
                }
              }
              

              使用未在此版本的 PHP 中定义的常量,或在未安装的扩展中定义的常量

              有些系统定义的常量只存在于较新版本的 PHP 中,例如 round() 的模式选项常量如 PHP_ROUND_HALF_DOWN 只存在于 PHP 5.3 或更高版本中。

              因此,如果您尝试在 PHP 5.2 中使用此功能,请说:

              $rounded = round($my_var, 0, PHP_ROUND_HALF_DOWN);
              

              您会收到以下错误消息:

              使用未定义的常量 PHP_ROUND_HALF_DOWN - 假设 'PHP_ROUND_HALF_DOWN' 警告(2):round() 的参数计数错误

              【讨论】:

              • 感谢分享。我错过了self:: 部分。它现在正在工作。
              • 毫无疑问,这个答案比其他答案更全面,值得获得最佳答案徽章!我也错过了课程范围,最终获得了一些对未来有价值的信息。谢谢,约翰!
              【解决方案9】:

              我不确定使用代码点火器是否有任何区别,我使用“”作为名称,效果很好。

              $department = mysql_real_escape_string($_POST["department"]);
              $name = mysql_real_escape_string($_POST["name"]);
              $email = mysql_real_escape_string($_POST["email"]);
              $message = mysql_real_escape_string($_POST["message"]);
              

              问候,

              豪尔赫。

              【讨论】:

              • 这种情况下单引号和双引号没有区别。
              • @RobbieAverill 虽然在这种情况下实际上没有 - 因为单引号字符串按原样显示内容,双引号字符串将解析转义字符并评估变量,使用单引号字符串是一种很好的风格这种情况。
              猜你喜欢
              • 2023-02-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-10-01
              • 2011-07-04
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多