PHP错误信息“注意:使用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' (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']); 

因为它正在寻找称为departmentnameemailmessage等常量。当它没有find这样一个常数,PHP(奇怪)将其解释为一个string(“部门”等)。 显然,如果你以后定义了这样一个常量,这很容易中断(虽然小写常量是不好的风格)。

错误消息是由于不幸的事实,PHP将隐式地将未知标记声明为同名的常量string。

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

 $_POST[department] 

唯一有效的方法是在PHP中有效的语法,如果以前有一个常量department定义。 所以,可悲的是,与此同时,不致死于致命的错误,它发布了这个通知,就好像一个常数已经被定义为具有相同的名称和值:

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

有多种方法可以得到这个错误消息,但是它们都有相同的根本原因 – 一个可能是一个常量的标记。

string缺less引号: $my_array[bad_key]

这就是你的情况,这是因为你有没有被引用的string数组键。 修复string键将修复错误:

更改:

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

至:

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

variables缺less美元符号: var_without_dollar

你可能会看到这个错误消息的另一个原因是,如果你从variables中取消$ ,或者从成员中取消$this-> 。 例如,以下任一情况都会导致类似的错误消息:

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

variables名称中的字符无效: $bad-variable-name

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

例如,这是可以的,因为在variables名称中允许使用下划线 :

 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()的mode选项常量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()的参数数量错误

你可能忘了使用""

举个例子:

 $_array[text] = $_var; 

改成:

 $_array["text"] = $_var; 

使用postvariables的正确方法是

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

使用单引号(')

 <?php ${test}="test information"; echo $test; ?> 

注意:使用未定义的常量testing – 在第3行的D:\ xampp \ htdocs \ sp \ test \ envoirnmentVariables.php中假设'testing'testing信息

插入单引号。

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

问候,

乔治。

你错过为你的数组键引用引号

$ _ POST [邮件]

应该 :

$ _PSOT [ '电子邮件']