Что означает сообщение об ошибке PHP «Уведомление: использование неопределенной константы»?

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 и т. Д. Когда он не находит такую ​​константу, PHP (странно) интерпретирует ее как строку («department» и т. Д.). Очевидно, что это может легко сломаться, если вы позже определите такую ​​константу (хотя это плохой стиль, чтобы иметь строчные константы).

Сообщение об ошибке связано с неудачным фактом, что 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-> из члена. Например, любое из следующих действий приведет к аналогичному сообщению об ошибке:

 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) { 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): Неверный параметр count для round ()

вы, вероятно, забыли использовать "" .

Например:

 $_array[text] = $_var; 

изменить на:

 $_array["text"] = $_var; 

Правильный способ использования постпеременных переменных

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

Используйте одинарную кавычку (')

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

Примечание: использование неопределенного постоянного теста – предполагаемый «тест» в D: \ xampp \ htdocs \ sp \ test \ envoirnmentVariables.php в тестовой информации по строке 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']); 

Я не уверен, есть ли какая-либо разница, используя код воспламенителя, и я использую «» для имен, и он отлично работает.

 $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 [почта]

должно быть:

$ _POST [ 'электронная почта']