Что означает сообщение об ошибке PHP "Notice: Use of undefined constant"?

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

что это значит и почему я вижу это?

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

как есть, он искал константы под названием department, name, email, message, etc. Когда он не находит такой константы, PHP (странно) интерпретирует ее как строку ("отдел" и т. д.). Очевидно, что это может легко сломаться, если вы определили такую константу позже (хотя это плохой стиль иметь строчные константы).


сообщение об ошибке связано с тем, что 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, например константы опции 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;

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

<?php

$department = $_POST['department'];

?>

использовать одинарные(')


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

Примечание: использование неопределенной константы test-предполагаемый "тест" в D:\xampp\htdocs\sp\test\envoirnmentVariables - ... php on line 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, где['электронной почты']


похоже, что предопределенные константы выборки ушли с расширением MySQL, поэтому нам нужно добавить их перед первой функцией...

//predifined принести константы

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

я протестировал и преуспел.