프로그래밍 언어/PHP

PHP 에서 “Notice: Undefined variable”,“Notice: Undefined index”,“Notice: Undefined offset”

Rateye 2021. 6. 25. 10:42
728x90
반응형
질문 : PHP 에서 “Notice: Undefined variable”,“Notice: Undefined index”,“Notice: Undefined offset”

PHP 스크립트를 실행 중이며 다음과 같은 오류가 계속 발생합니다.

알림 : 정의되지 않은 변수 : 10 행의 C : \ wamp \ www \ mypath \ index.php의 my_variable_name

알림 : 정의되지 않은 인덱스 : my_index C : \ wamp \ www \ mypath \ index.php on line 11

10 행과 11 행은 다음과 같습니다.

echo "My variable value is: " . $my_variable_name;
echo "My index value is: " . $my_array["my_index"];

이러한 오류 메시지의 의미는 무엇입니까?

왜 갑자기 나타나나요? 나는이 스크립트를 수년 동안 사용했고 아무런 문제가 없었습니다.

어떻게 수정합니까?

이것은 사람들이 문제를 반복해서 설명하는 대신 중복으로 연결 하는 일반 참조 질문입니다. 이 문제에 대한 대부분의 실제 답변이 매우 구체적이기 때문에 이것이 필요하다고 생각합니다.

관련 메타 토론 :

답변

PHP 매뉴얼 의 방대한 지혜에서 :

초기화되지 않은 변수의 기본값에 의존하는 것은 동일한 변수 이름을 사용하는 한 파일을 다른 파일에 포함하는 경우 문제가됩니다. 또한 register_globals 가 켜져있는 경우 주요 보안 위험 입니다. 초기화되지 않은 변수로 작업하는 경우 E_NOTICE 수준 오류가 발생하지만 초기화되지 않은 배열에 요소를 추가하는 경우에는 발생하지 않습니다. isset () 언어 구조는 변수가 이미 초기화되었는지 감지하는 데 사용할 수 있습니다. 또한 변수가 초기화되지 않은 경우 경고 또는 오류 메시지를 생성하지 않기 때문에 empty () 솔루션이 더 이상적입니다.

PHP 문서에서 :

변수가 존재하지 않으면 경고가 생성되지 않습니다. 즉, empty () 는 본질적으로 ! isset ($ var) || $ var == false .

이는 변수가 설정되었는지 확인하기 위해 empty() 만 사용할 수 0 , 0.0 , "" , "0" , null , false 또는 [] 에 대해 변수를 검사합니다.

예:

$o = []; @$var = ["",0,null,1,2,3,$foo,$o['myIndex']]; array_walk($var, function($v) { echo (!isset($v) || $v == false) ? 'true ' : 'false'; echo ' ' . (empty($v) ? 'true' : 'false'); echo "\n"; });

3v4l.org 온라인 PHP 편집기 에서 위의 스 니펫을 테스트합니다. PHP는 변수 선언을 필요로하지 않지만 나중에 사용할 변수에 값을 제공하는 것을 잊을 수있는 일부 보안 취약점이나 버그를 방지하기 위해 권장합니다. 스크립트에서. 선언되지 않은 변수의 경우 PHP가 수행하는 작업은 기본적으로보고되지 않는 E_NOTICE 발행하는 것입니다. 그러나 매뉴얼은 개발 중에 허용하도록 권장합니다. 문제를 처리하는 방법 :

  1. 권장 : 예를 들어 정의되지 않은 변수에 문자열을 추가하려고 할 때 변수를 선언하십시오. 또는 isset() / !empty() 를 사용하여 다음과 같이 참조하기 전에 선언되었는지 확인합니다.
    //Initializing variable $value = ""; //Initialization value; Examples //"" When you want to append stuff later //0 When you want to add numbers later //isset() $value = isset($_POST['value']) ? $_POST['value'] : ''; //empty() $value = !empty($_POST['value']) ? $_POST['value'] : '';
    이것은 PHP 7.0에서 훨씬 더 깔끔해졌습니다. 이제 null 통합 연산자를 사용할 수 있습니다.
    // Null coalesce operator - No need to explicitly initialize the variable. $value = $_POST['value'] ?? '';
  2. E_NOTICE에 대한 사용자 지정 오류 처리기 를 설정하고 메시지를 표준 출력에서 멀리 리디렉션합니다 (아마도 로그 파일로).
    set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
  3. 보고에서 E_NOTICE를 비활성화합니다. E_NOTICE 만 제외하는 빠른 방법은 다음과 같습니다.
    error_reporting( error_reporting() & ~E_NOTICE )
  4. @ 연산자를 사용 하여 오류를 억제합니다.

참고 : 포인트 1 만 구현하는 것이 좋습니다.

고시 : 정의되지 않은 인덱스 / 정의되지 않은 오프셋

이 알림은 사용자 (또는 PHP)가 배열의 정의되지 않은 인덱스에 액세스하려고 할 때 나타납니다. 문제를 처리하는 방법 :

  1. 액세스하기 전에 색인이 있는지 확인하십시오. isset() 또는 array_key_exists() 사용할 수 있습니다.
    //isset() $value = isset($array['my_index']) ? $array['my_index'] : ''; //array_key_exists() $value = array_key_exists('my_index', $array) ? $array['my_index'] : '';
  2. 언어 구조 list() 는 존재하지 않는 배열 인덱스에 액세스하려고 할 때이를 생성 할 수 있습니다.
    list($a, $b) = array(0 => 'a'); //or list($one, $two) = explode(',', 'test string');

두 개의 변수가 두 개의 배열 요소에 액세스하는 데 사용되지만 배열 요소 인 index 0 이 하나뿐이므로 다음이 생성됩니다.

주의 : 정의되지 않은 오프셋 : 1

$_POST / $_GET / $_SESSION 변수

$_POST , $_GET 또는 $_SESSION 작업 할 때 자주 나타납니다. $_POST$_GET 경우 인덱스를 사용하기 전에 인덱스가 존재하는지 여부 만 확인하면됩니다. $_SESSION 경우 세션이 session_start() 시작되었고 인덱스도 존재하는지 확인해야합니다. 또한 3 개의 변수는 모두 슈퍼 글로벌 이며 대문자입니다. 관련 :

$o = [];
@$var = ["",0,null,1,2,3,$foo,$o['myIndex']];
array_walk($var, function($v) {
    echo (!isset($v) || $v == false) ? 'true ' : 'false';
        echo ' ' . (empty($v) ? 'true' : 'false');
            echo "\n";
            });
            

3v4l.org 온라인 PHP 편집기 에서 위의 스 니펫을 테스트합니다.

PHP는 변수 선언을 요구하지 않지만, 스크립트에서 나중에 사용될 변수에 값을 제공하는 것을 잊을 수있는 일부 보안 취약점이나 버그를 피하기 위해이를 권장합니다. 선언되지 않은 변수의 경우 PHP가 수행하는 작업은 기본적으로보고되지 않는 E_NOTICE 발행하는 것입니다. 그러나 매뉴얼은 개발 중에 허용하도록 권장합니다.

문제를 처리하는 방법 :

  1. 권장 : 예를 들어 정의되지 않은 변수에 문자열을 추가하려고 할 때 변수를 선언하십시오. 또는 isset() / !empty() 를 사용하여 다음과 같이 참조하기 전에 선언되었는지 확인합니다.
    //Initializing variable $value = ""; //Initialization value; Examples //"" When you want to append stuff later //0 When you want to add numbers later //isset() $value = isset($_POST['value']) ? $_POST['value'] : ''; //empty() $value = !empty($_POST['value']) ? $_POST['value'] : '';
    이것은 PHP 7.0에서 훨씬 더 깔끔해졌습니다. 이제 null 통합 연산자를 사용할 수 있습니다.
    // Null coalesce operator - No need to explicitly initialize the variable. $value = $_POST['value'] ?? '';
  2. E_NOTICE에 대한 사용자 지정 오류 처리기 를 설정하고 메시지를 표준 출력에서 멀리 리디렉션합니다 (아마도 로그 파일로).
    set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
  3. 보고에서 E_NOTICE를 비활성화합니다. E_NOTICE 만 제외하는 빠른 방법은 다음과 같습니다.
    error_reporting( error_reporting() & ~E_NOTICE )
  4. @ 연산자를 사용 하여 오류를 억제합니다.

 

참고 : 포인트 1 만 구현하는 것이 좋습니다.

이 알림은 사용자 (또는 PHP)가 배열의 정의되지 않은 인덱스에 액세스하려고 할 때 나타납니다.

문제를 처리하는 방법 :

  1. 액세스하기 전에 색인이 있는지 확인하십시오. isset() 또는 array_key_exists() 사용할 수 있습니다.
    //isset() $value = isset($array['my_index']) ? $array['my_index'] : ''; //array_key_exists() $value = array_key_exists('my_index', $array) ? $array['my_index'] : '';
  2. 언어 구조 list() 는 존재하지 않는 배열 인덱스에 액세스하려고 할 때이를 생성 할 수 있습니다.
    list($a, $b) = array(0 => 'a'); //or list($one, $two) = explode(',', 'test string');

 

 

두 개의 변수가 두 개의 배열 요소에 액세스하는 데 사용되지만 배열 요소 인 index 0 이 하나뿐이므로 다음이 생성됩니다.

주의 : 정의되지 않은 오프셋 : 1

$_POST , $_GET 또는 $_SESSION 작업 할 때 자주 나타납니다. $_POST$_GET 경우 인덱스를 사용하기 전에 인덱스가 존재하는지 여부 만 확인하면됩니다. $_SESSION 경우 세션이 session_start() 시작되었고 인덱스도 존재하는지 확인해야합니다.

또한 3 개의 변수는 모두 슈퍼 글로벌 이며 대문자입니다.

관련 :

출처 : https://stackoverflow.com/questions/4261133/notice-undefined-variable-notice-undefined-index-and-notice-undefined
728x90
반응형