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']);
因为它正在寻找称为department
, name
, email
, message
等常量。当它没有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 [ '电子邮件']