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_DOWN
chỉ 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 ()