Що означає повідомлення про помилку PHP "Примітка: Використання невизначеної константи"?


163

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

Що це означає і чому я бачу це?

Відповіді:


217

Ви повинні навести свої ключі масиву:

$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 Fun факт, пропонуючи зняти цю функціональність , я не міг знайти жодних доказів того, що це колись офіційно заохочувалося, і лише бета-версії 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): Неправильний підрахунок параметрів для раунду ()


Дякуємо за акцію. Я пропустив self::частину. Зараз це працює.
moreirapontocom

Без сумніву, ця відповідь є всеосяжнішою, ніж інші, і заслуговує знака найкращої відповіді! Я надто пропустив обхват класу і в кінцевому підсумку отримав якусь цінну інформацію для майбутнього. Спасибі, Джон!
Harish ST

6

ви, мабуть, забули користуватися "".

Для прикладу:

$_array[text] = $_var;

перейти:

$_array["text"] = $_var;


1

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

<?php

$department = $_POST['department'];

?>

Використовуйте одну пропозицію (')


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

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


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

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, хоча в цьому випадку насправді цього немає - оскільки одиночні котирування рядків відображають речі як - це те, де подвійні рядки цитати будуть розбирати символи втечі та оцінювати змінні, це гарний стиль використання одиночних рядків, що цитуються, у цьому сценарії.
Френкі

0

Схоже, що попередньо визначені константи вилучення розійшлися з розширенням MySQL, тому нам потрібно додати їх до першої функції ...

// заздалегідь визначені константи отримання

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

Я випробував і досяг успіху.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.