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

164

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

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

Nik
источник

Ответы:

218

Вы должны процитировать ваши ключи массива:

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

Мэтью Флэшен
источник
Это относится к переменной $ _POST?
Ник
3
@Col. Шрапнель, когда я сказал, что нужно указывать только ключи массива? Ему нужно процитировать ключи, но не только их.
Мэтью Флэшен
1
ну я имею ввиду, что не нужно цитировать ключи массива . нужно заключать в кавычки строки, а не ключи массива. ключ не требует особого цитирования.
Ваш здравый смысл
4
Это не "странно" ... Это "обратно совместимо". PHP изначально разрешал и даже продвигал использование строк без кавычек в качестве ключей (Хорошо, может быть, это все еще "странно". :-)
Брайан Уайт
1
@BrianWhite Забавный факт, когда я предлагал отказаться от этой функциональности , я не нашел никаких доказательств того, что она когда-либо была официально поощрена, и только в бета-версии PHP 3.0 было включено поведение без уведомления, поэтому она, похоже, имеет обратную совместимость с функцией, которая была никогда не выпускается. Во всяком случае, это будет отсутствовать в PHP 8.0, когда бы это ни происходило.
IMSoP
77

Сообщение об ошибке происходит из-за неудачного факта, что 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 ()

Джон Картер
источник
Спасибо за акцию. Я пропустил self::часть. Теперь работает.
moreirapontocom
Без сомнения, этот ответ является более полным, чем другие, и заслуживает самого лучшего ответа! Я слишком скучал по классу и в конечном итоге получил некоторую ценную информацию для будущего. Спасибо, Джон!
Harish ST
6

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

Например:

$_array[text] = $_var;

изменить на:

$_array["text"] = $_var;
Giancarlo
источник
3

Вы пропустили одинарные кавычки вокруг ключей массива:

$ _POST [почта]

должно быть:

$ _POST [ 'электронной почты']

Ахмед Аль-Хаджри
источник
Это должен быть $ _POST ['email'];
Ibnul Quayum
1

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

<?php

$department = $_POST['department'];

?>

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

Срихари Гауд
источник
1
<?php 
  ${test}="test information";
  echo $test;
?>

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

santoshvijaypawar
источник
1

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

пример

$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']); 
Hackbal Teamz
источник
0

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

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

С уважением,

Хорхе.

Хорхе Висенте Мендоса
источник
1
В этом случае нет разницы между одинарными и двойными кавычками.
Робби Аверилл
1
@RobbieAverill, хотя в данном случае на самом деле это не так, поскольку строки в одинарных кавычках отображают все как есть, где строки в двойных кавычках будут анализировать escape-символы и оценивать переменные. В этом случае рекомендуется использовать строки в одинарных кавычках.
Фрэнки
0

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

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

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

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

Venkat
источник