PHP错误消息是什么;注意:未定义常量的使用;什么意思?

PHP错误消息是什么;注意:未定义常量的使用;什么意思?,php,constants,undefined,Php,Constants,Undefined,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

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 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]);

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

你应该引用你的数组键:

$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(奇怪地)将其解释为字符串(“部门”,等等)。显然,如果您稍后定义了这样一个常量,这很容易被打破(尽管使用小写常量是不好的风格)。

我不确定使用code igniter和我使用“”作为名称是否有任何区别,它工作得很好

$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"]);
问候,


Jorge.

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

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

在PHP中,唯一有效的语法是如果以前定义了常量
department
。因此,遗憾的是,它并没有在此时因致命错误而死亡,而是发布了此通知,并表现得好像一个常量已被定义为具有相同的名称和值:

// Implicit declaration of constant called department with value 'department'
define('department', 'department');  
您可以通过多种方式获取此错误消息,但它们都有相同的根本原因—一个可以是常量的标记

字符串缺少引号:
$my\u数组[错误的\u键]
这就是您案例中的问题所在,这是因为您的字符串数组键没有被引用。修复字符串键将修复错误:

更改:

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

变量缺少美元符号:
var\u不带美元
您可能会看到此错误消息的另一个原因是,如果您从变量中取消了
$
,或从成员中取消了
$this->
。例如,以下任一情况都会导致类似的错误消息:

my_local;   // should be $my_local
my_member;  // should be $this->my_member
变量名中的无效字符:
$bad variable name
如果尝试在变量名中使用不允许的字符,则可能会出现类似但更微妙的问题-通常情况下,连字符(
-
)而不是下划线
.

例如,这是可以的,因为:

但这不是:

if (123 === $my-var) {
  do_something();
}
它的解释与此相同:

if (123 === $my - var) {  // variable $my minus constant 'var'
  do_something();
}
在不指定类作用域的情况下引用类常量 为了引用类常量,您需要使用
::
指定类作用域,如果错过了这一点,PHP会认为您在谈论全局
定义()

例如:

使用此版本的PHP中未定义的常量,或未安装的扩展中定义的常量 有些系统定义的常量仅存在于较新版本的PHP中,例如
PHP\u ROUND\u HALF\u DOWN
的模式选项常量仅存在于PHP 5.3或更高版本中

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

$rounded = round($my_var, 0, PHP_ROUND_HALF_DOWN);
您将收到以下错误消息:

my_local;   // should be $my_local
my_member;  // should be $this->my_member
使用未定义的常量PHP\u ROUND\u HALF\u DOWN-假定 “PHP_ROUND_HALF_DOWN”警告(2):ROUND()的参数计数错误


使用post变量的正确方法是

<?php

$department = $_POST['department'];

?>

使用单引号(')


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


您可能忘记使用

例如:

$_array[text] = $_var;
改为:

$_array["text"] = $_var;
插入单引号

范例

$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']); 

您没有在数组键周围加上单引号:

$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']);
$\邮政[电邮]

应该是:

$\u POST['email']


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

//预先定义的获取常数

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

我测试成功。

是指$\u POST变量吗?@Col.Shrapnel,我什么时候说过只需要引用数组键?他确实需要引用密钥,但不仅仅是它们。我的意思是不需要引用数组密钥。必须引用字符串,而不是数组键。一把钥匙不需要特别的引用。它不是“奇怪的”。。。它是“向后兼容的”。PHP最初允许使用无引号的字符串作为键,甚至可以进行升级。(好吧,也许这仍然是“奇怪的”。——)@BrianWhite有趣的事实,当时,我找不到任何证据表明它曾受到官方鼓励,只有PHP 3.0的beta版包含了未经通知的行为,因此它似乎与从未发布过的功能向后兼容。无论如何,它将在PHP8.0中消失,在这种情况下,单引号和双引号没有区别。@RobbieAverill而在这种情况下,事实上没有-因为单引号字符串显示双引号字符串将解析转义字符和计算变量的内容,所以在这种情况下使用单引号字符串是一种好的样式。应该是$_POST['email'];谢谢分享。我错过了
self::
部分。它现在起作用了。毫无疑问,这个答案比其他答案更全面,值得拥有最佳答案徽章!我太错过了课程范围,最终得到了一些对未来有价值的信息。谢谢你,约翰!
define('MYSQL_BOTH',MYSQLI_BOTH);
define('MYSQL_NUM',MYSQLI_NUM);
define('MYSQL_ASSOC',MYSQLI_ASSOC);