Thông báo lỗi PHP Thông báo về lỗi: Sử dụng hằng số không xác định có nghĩa là gì?


163

PHP đang viết lỗi này trong nhật ký: "Lưu ý: Sử dụng hằng số không xác định".

Lỗi trong nhật ký:

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)

Các dòng mã liên quan:

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

Nó có nghĩa là gì và tại sao tôi lại nhìn thấy nó?

Câu trả lời:


217

Bạn nên trích dẫn các khóa mảng của bạn:

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

Như là, nó đang tìm kiếm hằng gọi department, name, email, message, vv Khi nó không tìm thấy một hằng số như vậy, PHP (kỳ lạ) diễn giải nó như là một chuỗi ( 'bộ phận', vv). Rõ ràng, điều này có thể dễ dàng phá vỡ nếu bạn xác định một hằng số như vậy sau này (mặc dù kiểu xấu có các hằng số viết thường).


Có phải nó đang đề cập đến biến $ _POST?
Nik

3
@Col. Mảnh đạn, khi nào tôi chỉ nói các khóa mảng cần được trích dẫn? Anh ta cần phải trích dẫn các phím, nhưng không chỉ chúng.
Matthew Flaschen

1
Tôi có nghĩa là không cần trích dẫn các mảng mảng . người ta phải trích dẫn chuỗi, không phải phím mảng. một khóa không yêu cầu trích dẫn đặc biệt.
Ý thức chung của bạn

4
Nó không "kỳ quái" ... Đó là "tương thích ngược". PHP ban đầu cho phép và thậm chí được quảng bá bằng cách sử dụng các chuỗi không trích dẫn làm khóa. (Được rồi, có lẽ nó vẫn còn "kỳ quái". :-)
Brian White

1
@BrianWhite Thực tế thú vị, khi đề xuất loại bỏ chức năng này , tôi không thể tìm thấy bằng chứng nào cho thấy nó được khuyến khích chính thức và chỉ có các bản phát hành beta của PHP 3.0 bao gồm hành vi mà không cần thông báo, vì vậy nó có vẻ tương thích ngược với một tính năng không bao giờ phát hành Dù sao, nó sẽ biến mất trong PHP 8.0, bất cứ khi nào nó xuất hiện.
IMSoP

77

Thông báo lỗi là do thực tế không may là PHP sẽ ngầm tuyên bố một mã thông báo không xác định là một chuỗi không đổi có cùng tên.

Đó là, nó đang cố gắng diễn giải điều này (lưu ý các dấu ngoặc kép bị thiếu):

$_POST[department]

Cách hợp lệ duy nhất đây sẽ là cú pháp hợp lệ trong PHP là nếu trước đó có một hằng số departmentđược xác định. Thật đáng buồn, thay vì chết vì một lỗi nghiêm trọng tại thời điểm này, nó đưa ra Thông báo này và hoạt động như thể một hằng số đã được xác định với cùng tên và giá trị:

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

Có nhiều cách khác nhau để bạn có thể nhận được thông báo lỗi này, nhưng tất cả chúng đều có cùng một nguyên nhân gốc - một mã thông báo có thể là một hằng số.

Chuỗi thiếu dấu ngoặc kép: $my_array[bad_key]

Đây là vấn đề trong trường hợp của bạn và đó là vì bạn đã có các khóa mảng chuỗi chưa được trích dẫn. Sửa các phím chuỗi sẽ sửa lỗi:

Thay đổi:

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

Đến:

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

Ký hiệu đô la bị thiếu: var_without_dollar

Một lý do khác mà bạn có thể thấy thông báo lỗi này là nếu bạn rời khỏi $một biến hoặc $this->từ một thành viên. Ví dụ: một trong những điều sau đây sẽ gây ra thông báo lỗi tương tự:

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

Ký tự không hợp lệ trong tên biến: $bad-variable-name

Một vấn đề tương tự nhưng tinh tế hơn có thể xảy ra nếu bạn cố gắng sử dụng một ký tự không được phép trong một tên biến - dấu gạch nối ( -) thay vì dấu gạch dưới _sẽ là một trường hợp phổ biến.

Ví dụ, điều này là OK, vì dấu gạch dưới được phép trong tên biến :

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

Nhưng đây không phải là:

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

Nó sẽ được giải thích giống như thế này:

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

Tham chiếu đến hằng số lớp mà không chỉ định phạm vi lớp

Để tham chiếu đến hằng số lớp, bạn cần chỉ định phạm vi lớp ::, nếu bạn bỏ lỡ điều này, PHP sẽ nghĩ bạn đang nói về toàn cầu define().

Ví dụ:

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

Sử dụng hằng số không được xác định trong phiên bản PHP này hoặc được xác định trong tiện ích mở rộng chưa được cài đặt

Có một số hằng định nghĩa hệ thống chỉ tồn tại trong các phiên bản PHP mới hơn, ví dụ các hằng số tùy chọn chế độ, round()chẳng hạn như PHP_ROUND_HALF_DOWNchỉ tồn tại trong PHP 5.3 trở lên.

Vì vậy, nếu bạn đã cố gắng sử dụng tính năng này trong PHP 5.2, hãy nói:

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

Bạn sẽ nhận được thông báo lỗi này:

Sử dụng hằng số không xác định PHP_ROUND_HALF_DOWN - giả định 'PHP_ROUND_HALF_DOWN' Cảnh báo (2): Số tham số sai cho vòng ()


Cảm ơn đã chia sẻ. Tôi đã bỏ lỡ self::một phần. Nó đang làm việc bây giờ.
moreirapontocom

Không còn nghi ngờ gì nữa, câu trả lời này toàn diện hơn những câu hỏi khác và xứng đáng là huy hiệu câu trả lời tốt nhất! Tôi đã quá bỏ lỡ Phạm vi lớp học và cuối cùng nhận được một số thông tin có giá trị cho tương lai. Cảm ơn, John!
Harish ST

6

bạn có thể quên sử dụng "".

Ví dụ như:

$_array[text] = $_var;

thay đổi thành:

$_array["text"] = $_var;

3

Bạn đã bỏ lỡ các dấu ngoặc đơn xung quanh các khóa mảng của bạn:

$ _POST [email]

nên là:

$ _POST ['email']


Nó phải là $ _POST ['email'];
Ibnul Quayum

1

Cách sử dụng đúng các biến bài là

<?php

$department = $_POST['department'];

?>

Sử dụng dấu ngoặc đơn (')


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

Lưu ý: Sử dụng kiểm tra hằng số không xác định - giả định 'kiểm tra' trong D: \ xampp \ htdocs \ sp \ test \ envoirnmentVariables.php trên thông tin kiểm tra dòng 3


1

Chèn dấu ngoặc đơn.

Thí dụ

$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

Tôi không chắc có sự khác biệt nào khi sử dụng bộ đánh lửa mã và tôi sử dụng "" cho các tên và nó hoạt động rất tốt.

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

Trân trọng,

Ông xã.


1
Không có sự khác biệt giữa dấu ngoặc đơn và dấu ngoặc kép trong trường hợp này.
Robbie Averill

1
@RobbieAverill trong trường hợp này thực tế là không có - vì các chuỗi trích dẫn đơn sẽ hiển thị mọi thứ như là trong đó các chuỗi trích dẫn kép sẽ phân tích các ký tự thoát và đánh giá các biến đó là phong cách tốt để sử dụng các chuỗi được trích dẫn trong kịch bản này.
Frankie

0

Có vẻ như các hằng tìm nạp được xác định trước đã biến mất với phần mở rộng MySQL, vì vậy chúng ta cần thêm chúng trước hàm đầu tiên ...

// hằng tìm nạp được xác định trước

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

Tôi đã thử nghiệm và đã thành công.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.