Apa arti pesan kesalahan PHP “Pemberitahuan: Penggunaan konstanta tidak terdefinisi”?

163

PHP menulis kesalahan ini di log: "Pemberitahuan: Penggunaan konstanta tidak terdefinisi".

Kesalahan dalam log:

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)

Baris kode yang relevan:

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

Apa artinya dan mengapa saya melihatnya?

Nik
sumber

Jawaban:

217

Anda harus mengutip kunci array Anda:

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

Seperti, itu mencari konstanta yang disebut department, name, email, message, dll Ketika tidak menemukan konstan seperti, PHP (aneh) menafsirkan sebagai string ( 'departemen', dll). Jelas, ini dapat dengan mudah pecah jika Anda mendefinisikan konstanta seperti itu nanti (meskipun gaya buruk memiliki konstanta huruf kecil).

Matthew Flaschen
sumber
Apakah ini merujuk ke variabel $ _POST?
Nik
3
@Col. Pecahan peluru, kapan saya bilang hanya kunci array yang perlu dikutip? Dia perlu mengutip kunci, tetapi tidak hanya itu.
Matthew Flaschen
1
baik saya maksudkan bahwa tidak perlu mengutip kunci array . kita harus mengutip string, bukan kunci array. kunci tidak memerlukan kutipan khusus.
Akal Sehat Anda
4
Ini bukan "aneh" ... Ini "kompatibel ke belakang". PHP awalnya diizinkan dan bahkan dipromosikan menggunakan string yang tidak dikutip sebagai kunci. (Oke, mungkin masih "aneh". :-)
Brian White
1
@BrianWhite Fun fakta, ketika mengusulkan untuk mencabut fungsi ini , saya tidak dapat menemukan bukti bahwa itu secara resmi didorong, dan hanya rilis beta PHP 3.0 termasuk perilaku tanpa pemberitahuan, sehingga tampaknya kompatibel dengan fitur yang sebelumnya. tidak pernah dirilis. Bagaimanapun, itu akan hilang dalam PHP 8.0, kapan pun itu datang.
IMSoP
77

Pesan kesalahan disebabkan oleh fakta yang tidak menguntungkan bahwa PHP secara implisit akan mendeklarasikan token yang tidak dikenal sebagai string konstan dengan nama yang sama.

Artinya, ia mencoba menafsirkan ini (perhatikan tanda kutip yang hilang):

$_POST[department]

Satu-satunya cara yang valid untuk sintaks yang valid dalam PHP adalah jika sebelumnya ada konstanta yang departmentdidefinisikan. Sedihnya, daripada mati dengan kesalahan fatal pada saat ini, ia mengeluarkan Pemberitahuan ini dan bertindak seolah-olah sebuah konstanta didefinisikan dengan nama dan nilai yang sama:

// Implicit declaration of constant called department with value 'department'
define('department', 'department');  

Ada berbagai cara Anda bisa mendapatkan pesan kesalahan ini, tetapi semuanya memiliki akar penyebab yang sama - token yang bisa berupa konstanta.

Kutipan string hilang: $my_array[bad_key]

Inilah masalahnya dalam kasus Anda, dan itu karena Anda punya kunci larik string yang belum dikutip. Memperbaiki kunci string akan memperbaiki bug:

Perubahan:

$department = mysql_real_escape_string($_POST[department]);
...(etc)...

Untuk:

$department = mysql_real_escape_string($_POST['department']);
...(etc)...

Variabel tanda dolar hilang: var_without_dollar

Alasan lain Anda mungkin melihat pesan kesalahan ini adalah jika Anda mengabaikan $variabel, atau $this->dari anggota. Misalnya, salah satu dari yang berikut ini akan menyebabkan pesan kesalahan yang serupa:

my_local;   // should be $my_local
my_member;  // should be $this->my_member

Karakter tidak valid dalam nama variabel: $bad-variable-name

Masalah serupa namun lebih halus dapat terjadi jika Anda mencoba menggunakan karakter yang tidak diizinkan dalam nama variabel - tanda hubung ( -) alih-alih garis bawah _akan menjadi kasus umum.

Misalnya, ini OK, karena garis bawah dibolehkan dalam nama variabel :

if (123 === $my_var) {
  do_something();
}

Tapi ini bukan:

if (123 === $my-var) {
  do_something();
}

Ini akan ditafsirkan sama dengan ini:

if (123 === $my - var) {  // variable $my minus constant 'var'
  do_something();
}

Mengacu pada konstanta kelas tanpa menentukan lingkup kelas

Untuk merujuk pada konstanta kelas, Anda perlu menentukan ruang lingkup kelas ::, jika Anda melewatkannya, PHP akan berpikir Anda sedang berbicara tentang global define().

Misalnya:

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
  }
}

Menggunakan konstanta yang tidak didefinisikan dalam versi PHP ini, atau didefinisikan dalam ekstensi yang tidak diinstal

Ada beberapa konstanta yang ditentukan sistem yang hanya ada di versi PHP yang lebih baru, misalnya konstanta opsi mode round()seperti yang PHP_ROUND_HALF_DOWNhanya ada di PHP 5.3 atau lebih baru.

Jadi jika Anda mencoba menggunakan fitur ini di PHP 5.2, katakan:

$rounded = round($my_var, 0, PHP_ROUND_HALF_DOWN);

Anda akan menerima pesan kesalahan ini:

Penggunaan konstanta yang tidak terdefinisi PHP_ROUND_HALF_DOWN - diasumsikan 'PHP_ROUND_HALF_DOWN' Peringatan (2): Jumlah parameter salah untuk putaran ()

John Carter
sumber
Terima kasih sudah berbagi. Saya melewatkan self::bagian itu. Ini bekerja sekarang.
moreirapontocom
Tanpa ragu, jawaban ini lebih komprehensif daripada yang lain dan layak menerima lencana jawaban terbaik! Saya terlalu merindukan Lingkup Kelas dan Akhirnya mendapatkan Beberapa Informasi Berharga Untuk Masa Depan. Terima kasih, John!
Harish ST
6

Anda mungkin lupa menggunakan "" .

Sebagai contoh:

$_array[text] = $_var;

mengubah:

$_array["text"] = $_var;
Giancarlo
sumber
3

Anda melewatkan menempatkan tanda kutip tunggal di sekitar kunci array Anda:

$ _POST [email]

seharusnya:

$ _POST ['email']

Ahmed Al-hajri
sumber
Itu harus $ _POST ['email'];
Ibnul Quayum
1

Cara yang benar menggunakan variabel posting adalah

<?php

$department = $_POST['department'];

?>

Gunakan satu kutip (')

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

Pemberitahuan: Penggunaan uji konstanta tidak terdefinisi - diasumsikan 'tes' dalam D: \ xampp \ htdocs \ sp \ test \ envoirnmentVariables.php pada baris 3 informasi pengujian

santoshvijaypawar
sumber
1

Masukkan tanda kutip tunggal.

Contoh

$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
sumber
0

Saya tidak yakin apakah ada perbedaan saya menggunakan kode penyala dan saya menggunakan "" untuk nama-nama dan itu bekerja dengan baik.

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

salam,

Jorge.

Jorge Vicente Mendoza
sumber
1
Tidak ada perbedaan antara tanda kutip tunggal dan ganda dalam kasus ini.
Robbie Averill
1
@RobbieAverill sementara dalam kasus ini sebenarnya tidak ada - sebagai string dikutip tunggal menampilkan hal-hal di mana string kutipan ganda akan mengurai karakter melarikan diri dan mengevaluasi variabel itu gaya yang baik untuk menggunakan string dikutip tunggal dalam skenario ini.
Frankie
0

Sepertinya konstanta pengambilan yang telah ditentukan hilang dengan ekstensi MySQL, jadi kita perlu menambahkannya sebelum fungsi pertama ...

// konstanta ambil yang ditentukan sebelumnya

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

Saya diuji dan berhasil.

Venkat
sumber