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 변수를 참조하고 있습니까?
Nik

3
@안부. 파편은, 때 나는 말 했는가 에만 배열 키를 인용하여 필요? 그는 키를 인용 할 필요가 있지만 키만 인용 할 필요는 없습니다.
Matthew Flaschen

1
글쎄, 나는 배열 키 를 인용 할 필요가 없다는 것을 의미한다 . 배열 키가 아닌 문자열을 인용해야합니다. 키에는 특별한 인용이 필요하지 않습니다.
당신의 상식

4
"기괴한"것이 아닙니다 ... "이전 버전과 호환됩니다". PHP는 원래 인용되지 않은 문자열을 키로 사용하여 허용하고 홍보했습니다. (좋아, 아마 "기괴한"일지도 모른다. :-)
Brian White

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_DOWNPHP 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 2016 년

의심의 여지없이이 답변은 다른 답변보다 포괄적이며 최고의 답변 배지를받을 가치가 있습니다! 나는 클래스 범위를 그리워하고 미래에 대한 귀중한 정보를 얻었습니다. 고마워 존!
Harish ST

6

당신은 아마 사용하는 것을 잊었다 "".

예를 들어:

$_array[text] = $_var;

로 변경:

$_array["text"] = $_var;

3

배열 키 주위에 작은 따옴표를 놓치는 것을 놓쳤습니다.

$ _POST [이메일]

해야한다:

$ _POST [ '이메일']


$ _POST [ 'email']이어야합니다.
Ibnul Quayum

1

포스트 변수를 사용하는 올바른 방법은

<?php

$department = $_POST['department'];

?>

작은 따옴표 사용 ( ')


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

주의 : 정의되지 않은 상수 테스트 사용-3 행 테스트 정보의 D : \ xampp \ htdocs \ sp \ test \ envoirnmentVariables.php에서 'test'로 가정


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이 경우 실제로는 따옴표가없는 문자열이 그대로 표시되므로 큰 따옴표 문자열이 이스케이프 문자를 구문 분석하고 변수를 평가하는 경우이 시나리오에서 작은 따옴표로 묶인 문자열을 사용하는 것이 좋습니다.
Frankie

0

미리 정의 된 인출 상수가 MySQL 확장과 함께 사라진 것처럼 보이므로 첫 번째 함수 전에 추가해야합니다 ...

// 미리 정의 된 인출 상수

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

나는 시험하고 성공했다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.