Что означает сообщение об ошибке 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]);

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

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и т. д. Когда он не находит такой константы, 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, например, константы опций режима для 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 [почта]

должно быть:

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

Вставьте одинарные кавычки.

пример

$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 
  ${test}="test information";
  echo $test;
?>

Примечание: использование неопределенного константного теста - предполагается, что 'test' в D:\xampp\htdocs\sp\test\envoirnmentVariables.php в строке 3 тестовой информации

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

<?php

$department = $_POST['department'];

?>

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

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

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

С уважением,

Хорхе.

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

// предопределенные константы выборки

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

Я проверил и преуспел.

Другие вопросы по тегам