복붙노트

PHP를 사용하여 "주의 : 정의되지 않은 변수", "주의 : 정의되지 않은 색인"및 "통지 : 정의되지 않은 오프셋"

PHP

PHP를 사용하여 "주의 : 정의되지 않은 변수", "주의 : 정의되지 않은 색인"및 "통지 : 정의되지 않은 오프셋"

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

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

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

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

왜 그들은 갑자기 나타 납니까? 나는이 스크립트를 수년 동안 사용해 왔지만 결코 문제가 없었습니다.

어떻게 수정합니까?

해결법

  1. ==============================

    1.

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

    PHP 문서에서 :

    즉, 변수가 설정되었는지 여부를 결정하기 위해 empty () 만 사용할 수 있고 변수 0, "", null과 비교하여 변수를 검사 할 수 있습니다.

    예:

    $ o = []; @ $ var = [ "", 0, null, 1,2,3, $ foo, $ o [ 'myIndex']]; array_walk ($ var, function ($ v) {     echo (! isset ($ v) || $ v == false)? '허위 사실';     echo ''. (비어 있음 ($ v)? '참': '거짓');     에코 "\ n"; }); 위의 스 니펫을 3v4l.org 온라인 PHP 편집기에서 테스트하십시오. PHP는 변수 선언을 요구하지 않지만 나중에 스크립트에서 사용될 변수에 값을 제공하는 것을 잊어 버리는 보안 취약점이나 버그를 피하기 위해이를 권장합니다. 선언되지 않은 변수의 경우 PHP는 매우 낮은 수준의 오류 E_NOTICE를 발행합니다. 기본값은 E_NOTICE입니다.이 오류는 기본적으로보고되지 않지만 설명서는 개발 중에 허용 할 것을 권고합니다. 문제를 다루는 방법 : 권장 사항 : 예를 들어 정의되지 않은 변수에 문자열을 추가하려고 할 때와 같이 변수를 선언하십시오. 또는 isset () /! empty ()를 사용하여 다음과 같이 참조하기 전에 선언되었는지 확인하십시오. // 변수 초기화하기 $ value = ""; // 초기화 값; 예제들              // ""나중에 물건을 추가하려고 할 때              // 0 나중에 번호를 추가하려고 할 때 // isset () $ value = isset ($ _ POST [ 'value'])? $ _POST [ 'value'] : ''; //빈() $ value =! empty ($ _ POST [ 'value'])? $ _POST [ 'value'] : ''; 이것은 PHP 7.0에서 훨씬 더 깔끔하게되었습니다. 이제 null coalesce 연산자를 사용할 수 있습니다 : // Null coalesce operator - 명시 적으로 변수를 초기화 할 필요가 없습니다. $ 값 = $ _POST [ '값'] ?? ''; E_NOTICE에 대한 사용자 정의 오류 처리기를 설정하고 메시지를 표준 출력 (어쩌면 로그 파일)에서 리디렉션하십시오. set_error_handler ( 'myHandlerForMinorErrors', E_NOTICE | E_STRICT) E_NOTICE를보고하지 않습니다. E_NOTICE 만 제외하는 빠른 방법은 다음과 같습니다. error_reporting (error_reporting () & ~ E_NOTICE) @ 연산자로 오류를 표시하지 않습니다. 참고 : 점 1 만 구현하는 것이 좋습니다. Notice : 정의되지 않은 인덱스 / 정의되지 않은 오프셋 이 알림은 사용자 (또는 PHP)가 배열의 정의되지 않은 색인에 액세스하려고 할 때 나타납니다. 문제를 다루는 방법 : 색인에 액세스하기 전에 색인이 존재하는지 확인하십시오. 이를 위해 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'] : ''; 언어 구조 목록 ()은 존재하지 않는 배열 색인에 액세스하려고 시도 할 때이를 생성 할 수 있습니다. list ($ a, $ b) = 배열 ​​(0 => 'a'); //또는 list ($ one, $ two) = 폭발 ( ',', 'test string'); 두 개의 변수가 두 개의 배열 요소를 액세스하는 데 사용되지만 하나의 배열 요소 인 인덱스 0 만 있으므로 생성됩니다. Notice : 정의되지 않은 오프셋 : 1 $ _POST / $ _GET / $ _SESSION 변수 위의주의 사항은 $ _POST, $ _GET 또는 $ _SESSION으로 작업 할 때 자주 나타납니다. $ _POST 및 $ _GET의 경우 인덱스를 사용하기 전에 인덱스가 있는지 여부 만 확인하면됩니다. $ _SESSION의 경우 session_start ()로 세션을 시작했는지 확인하고 인덱스도 존재하는지 확인해야합니다. 또한 세 변수는 모두 슈퍼 전역이며 대문자입니다. 관련 항목 : Notice : 정의되지 않은 변수 Notice : 정의되지 않은 색인

  2. ==============================

    2.

    시도해 보라.

    // recommended solution for recent PHP versions
    $user_name = $_SESSION['user_name'] ?? '';
    
    // pre-7 PHP versions
    $user_name = '';
    if (!empty($_SESSION['user_name'])) {
         $user_name = $_SESSION['user_name'];
    }
    

    또는 빠르고 더러운 해결책으로 :

    // not the best solution, but works
    // in your php setting use, it helps hiding site wide notices
    error_reporting(E_ALL ^ E_NOTICE);
    

    세션에 대한 참고 사항 :

  3. ==============================

    3.

    원하지 않는 중복 통지의 경우 전용 @ 연산자를 사용하여«정의되지 않은 변수 / 색인 메시지를 숨길 수 있습니다.

    $var = @($_GET["optional_param"]);
    

    이 질문의 대부분을 다루기 때문에 가장 일반적인 원인을 확장 해 봅시다.

  4. ==============================

    4.

    즉, 아직 할당하지 않은 변수를 테스트, 평가 또는 인쇄한다는 의미입니다. 즉, 오타가 있거나 변수가 먼저 초기화되었는지 확인해야합니다. 논리 경로를 확인하십시오. 한 경로에는 설정 될 수 있지만 다른 경로에는 설정되지 않을 수 있습니다.

  5. ==============================

    5.

    일반적으로 "나쁜 프로그래밍"때문에, 그리고 실수를 할 가능성이 있습니다.

  6. ==============================

    6.

    도움이되기 때문에 알림을 사용하지 않으려 고하지 않았지만 너무 많은 타이핑을 피하려고했습니다.

    내 솔루션이이 함수는 다음과 같습니다.

    function ifexists($varname)
    {
      return(isset($$varname)?$varname:null);
    }
    

    따라서 $ name을 참조하고 존재하는 경우 에코하려면 다음과 같이 작성하면됩니다.

    <?=ifexists('name')?>
    

    배열 요소의 경우 :

    function ifexistsidx($var,$index)
    {
      return(isset($var[$index])?$var[$index]:null);
    }
    

    페이지에서 $ _REQUEST [ 'name']을 (를) 참조하고자하는 경우 :

    <?=ifexistsidx($_REQUEST,'name')?>
    
  7. ==============================

    7.

    입력 문자열을 얻는 가장 좋은 방법은 다음과 같습니다.

    $value = filter_input(INPUT_POST, 'value');
    

    이 한 줄 짜기는 다음과 거의 같습니다.

    if (!isset($_POST['value'])) {
        $value = null;
    } elseif (is_array($_POST['value'])) {
        $value = false;
    } else {
        $value = $_POST['value'];
    }
    

    문자열 값을 절대적으로 원한다면 다음과 같이하십시오.

    $value = (string)filter_input(INPUT_POST, 'value');
    
  8. ==============================

    8.

    왜냐하면 변수 '$ user_location'이 정의되지 않기 때문입니다. '$ user_location'변수를 선언하고있는 내부의 if 루프를 사용하고 있다면 else 루프가 있어야하며이를 정의해야합니다. 예 :

    $a=10;
    if($a==5) { $user_location='Paris';} else { }
    echo $user_location;
    

    위의 코드는 if 루프가 만족스럽지 않고 else 루프 '$ user_location'이 정의되지 않은 오류를 생성합니다. 여전히 PHP는 변수를 출력하도록 요청 받았다. 따라서 코드를 수정하려면 다음을 수행해야합니다.

    $a=10;
    if($a==5) { $user_location='Paris';} else { $user_location='SOMETHING OR BLANK'; }
    echo $user_location;
    
  9. ==============================

    9.

    ""왜 갑자기 나타 났습니까? 나는이 스크립트를 수년 동안 사용해 왔지만 결코 문제가 없었습니다. "

    대부분의 사이트는 "모든 오류 표시, '주의 사항'및 '권장되지 않음'이 아닌"기본 "오류보고 하에서 작동하는 것이 일반적입니다. 이것은 php.ini에서 설정되고 서버의 모든 사이트에 적용됩니다. 즉, 예제에서 사용 된 "주의 사항"은 억제 (숨김)되고 더 중요한 것으로 간주되는 다른 오류는 표시 / 기록됩니다.

    다른 중요한 설정은 오류를 숨길 수 있다는 것입니다 (예 : display_errors를 "off"또는 "syslog"로 설정).

    이 경우에는 error_reporting을 변경하여 알림을 표시하고 (예에 따라) 및 / 또는 화면에 display_errors로 설정이 변경되었음을 나타냅니다 (억제 / 로그하는 것과 반대).

    왜 그들은 변화 했습니까?

    명백한 / 가장 간단한 대답은 누군가가 php.ini에서 이러한 설정 중 하나를 조정했거나 업그레이드 된 PHP 버전이 이전과 다른 php.ini를 사용하고 있다는 것입니다. 저것은 볼 것이다 첫번째 장소이다.

    그러나이 설정을에서 재정의 할 수도 있습니다.

    이 중 어느 것도 변경 될 수 있습니다.

    또한 웹 서버 구성이 .htaccess 지시문을 활성화 / 비활성화 할 수 있다는 추가 된 복잡성이 있습니다. 따라서 .htaccess 지시문에 갑자기 시작 / 중지가있는 지시문이 있으면 확인해야합니다.

    (.htconf / .htaccess는 아파치로 실행하고 있다고 가정합니다. 명령 줄을 실행하면이 옵션이 적용되지 않으며, IIS 나 다른 웹 서버를 실행중인 경우 그에 따라 configs를 확인해야합니다)

    개요

  10. ==============================

    10.

    빠른 수정은 변수를 코드 상단의 null에 할당하는 것입니다.

    $user_location = null;
    
  11. ==============================

    11.

    이 오류를 저주하는 데 사용했지만 사용자 입력을 피하도록 상기시키는 것이 도움이 될 수 있습니다.

    예를 들어, 이것이 영리하다고 생각한다면, 단축형 코드 :

    // Echo whatever the hell this is
    <?=$_POST['something']?>
    

    ...다시 생각 해봐! 더 나은 해결책은 다음과 같습니다.

    // If this is set, echo a filtered version
    <?=isset($_POST['something']) ? html($_POST['something']) : ''?>
    

    (나는 사용자 정의 html () 함수를 사용하여 문자를 이스케이프 처리합니다. 마일리지는 다를 수 있습니다)

  12. ==============================

    12.

    나는 자동으로 변수를 선언하는 유용한 함수 exst ()를 항상 사용한다.

    귀하의 코드는 -

    $greeting = "Hello, ".exst($user_name, 'Visitor')." from ".exst($user_location);
    
    
    /** 
     * Function exst() - Checks if the variable has been set 
     * (copy/paste it in any place of your code)
     * 
     * If the variable is set and not empty returns the variable (no transformation)
     * If the variable is not set or empty, returns the $default value
     *
     * @param  mixed $var
     * @param  mixed $default
     * 
     * @return mixed 
     */
    
    function exst( & $var, $default = "")
    {
        $t = "";
        if ( !isset($var)  || !$var ) {
            if (isset($default) && $default != "") $t = $default;
        }
        else  {  
            $t = $var;
        }
        if (is_string($t)) $t = trim($t);
        return $t;
    }
    
  13. ==============================

    13.

    아주 간단한 언어로. 실수는 여러분이 이전에 정의하지 않은 변수 $ user_location을 사용하고 있으므로 어떤 값도 가지지 않으므로 사용하기 전에이 변수를 선언하시기 바랍니다. 예를 들어 $ user_location = ''; 또는 $ user_location = '로스 앵글'; 이것은 당신이 직면 할 수있는 매우 일반적인 오류입니다. 따라서 변수를 선언하고 코딩을 즐기는 것을 걱정하지 마십시오.

  14. ==============================

    14.

    PHP 7.0에서는 이제 Null 병합 연산자를 사용할 수 있습니다.

    echo "My index value is: " . ($my_array["my_index"] ?? '');
    

    같음 :

    echo "My index value is: " . (isset($my_array["my_index"]) ? $my_array["my_index"] : '');
    

    수동으로 감지 된주의 7.0

  15. ==============================

    15.

    일을 단순하게 유지하는 것이 어떻습니까?

    <?php
    error_reporting(E_ALL); // making sure all notices are on
    
    function idxVal(&$var, $default = null) {
             return empty($var) ? $var = $default : $var;
      }
    
    echo idxVal($arr['test']);         // returns null without any notice
    echo idxVal($arr['hey ho'], 'yo'); // returns yo and assigns it to array index, nice
    
    ?>
    
  16. ==============================

    16.

    시간이 지남에 따라 PHP는 보안에 중점을 둔 언어가되었습니다. 기본적으로 꺼져 있던 설정은 기본적으로 켜져 있습니다. 이것의 완벽한 예는 E_STRICT이며, 이는 PHP 5.4.0부터 기본적으로 사용됩니다.

    또한, PHP 문서에 따르면, 기본적으로 E_NOTICE는 php.ini에서 사용할 수 없습니다. PHP 문서는 디버깅 목적으로 켜는 것이 좋습니다. 그러나 우분투 저장소와 BitNami의 Windows 스택에서 PHP를 다운로드하면 다른 것을 볼 수 있습니다.

    ; Common Values:
    ;   E_ALL (Show all errors, warnings and notices including coding standards.)
    ;   E_ALL & ~E_NOTICE  (Show all errors, except for notices)
    ;   E_ALL & ~E_NOTICE & ~E_STRICT  (Show all errors, except for notices and coding standards warnings.)
    ;   E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR  (Show only errors)
    ; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
    ; Development Value: E_ALL
    ; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
    ; http://php.net/error-reporting
    error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
    

    error_reporting은 기본적으로 프로덕션 값으로 설정되며 기본적으로 "기본값"값으로 설정되지 않습니다. 이것은 다소 혼란스럽고 php.ini 외부에서 문서화되지 않았기 때문에 다른 배포판에서는이 사실을 확인하지 않았습니다.

    그러나 귀하의 질문에 대답하기 위해이 오류는 다음과 같은 이유로 팝업되지 않습니다.

    옵션 3을 확장하려면 : 이것은 이상적입니다. 이 길로 갈 수 있으면해야합니다. 처음에는이 경로를 사용하지 않을 경우 개발 환경에서 코드를 테스트하여이 경로를 이동하는 것이 좋습니다. 당신이 그것에있을 때, ~ E_STRICT와 ~ E_DEPRECATED를 없애서 앞으로 무엇이 잘못 될지 알아보십시오. 익숙하지 않은 오류를 많이 보게 될 것이지만 앞으로 PHP를 업그레이드해야 할 때 불쾌한 문제가 발생하는 것을 막을 것입니다.

    정의되지 않은 변수 : my_variable_name - 사용하기 전에 변수가 정의되지 않은 경우 발생합니다. PHP 스크립트가 실행되면 내부적으로 null 값을 가정합니다. 그러나 어떤 시나리오에서 정의되기 전에 변수를 검사해야합니까? 궁극적으로 이것은 "엉성한 코드"에 대한 논거입니다. 개발자로서 정의 할 수있는 범위 내에서 변수가 정의 된 오픈 소스 프로젝트를 볼 때 내가 좋아한다는 것을 말할 수 있습니다. 미래에 어떤 변수가 나타날지 쉽게 알 수 있고 코드를 읽고 / 배우는 것을 더 쉽게 만듭니다.

    function foo()
    {
        $my_variable_name = '';
    
        //....
    
        if ($my_variable_name) {
            // perform some logic
        }
    }
    

    정의되지 않은 인덱스 : my_index - 배열의 값에 액세스하려고 시도했지만 존재하지 않는 경우에 발생합니다. 이 오류를 방지하려면 조건부 검사를 수행하십시오.

    // verbose way - generally better
    if (isset($my_array['my_index'])) {
        echo "My index value is: " . $my_array['my_index'];
    }
    
    // non-verbose ternary example - I use this sometimes for small rules.
    $my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)';
    echo "My index value is: " . $my_index_val;   
    

    또 다른 옵션은 함수의 맨 위에 빈 배열을 선언하는 것입니다. 항상 가능한 것은 아닙니다.

    $my_array = array(
        'my_index' => ''
    );
    
    //...
    
    $my_array['my_index'] = 'new string';
    
  17. ==============================

    17.

    정의되지 않은 색인은 사용할 수없는 배열 색인에 대해 요청한 배열의 의미입니다.

    <?php 
    
    $newArray[] = {1,2,3,4,5};
    print_r($newArray[5]);
    
    ?>
    

    undefined variable은 기존 변수가 완전히 사용되지 않았거나 해당 이름으로 초기화되거나 초기화되지 않았 음을 나타냅니다.

    <?php print_r($myvar); ?>
    

    정의되지 않은 오프셋은 존재하지 않는 키를 요청한 배열에 있음을 의미합니다. 그리고 이 문제에 대한 해결책은 사용하기 전에 확인하는 것입니다.

    php> echo array_key_exists(1, $myarray);
    
  18. ==============================

    18.

    질문의이 부분에 관해서 :

    명확한 답변은 없지만 설정이 '갑자기'변경 될 수있는 이유에 대한 가능한 설명이 있습니다.

  19. ==============================

    19.

    클래스로 작업하는 경우 $ this를 사용하여 멤버 변수를 참조해야합니다.

    class Person
    {
        protected $firstName;
        protected $lastName;
    
        public function setFullName($first, $last)
        {
            // Correct
            $this->firstName = $first;
    
            // Incorrect
            $lastName = $last;
    
            // Incorrect
            $this->$lastName = $last;
        }
    }
    
  20. ==============================

    20.

    정의되지 않은 인덱스 알림이 throw되는 또 다른 이유는 데이터베이스 쿼리에서 열이 생략 된 것입니다.

    즉 :

    $query = "SELECT col1 FROM table WHERE col_x = ?";
    

    그런 다음 루프 내에서 더 많은 열 / 행에 액세스하려고합니다.

    즉 :

    print_r($row['col1']);
    print_r($row['col2']); // undefined index thrown
    

    또는 while 루프에서 :

    while( $row = fetching_function($query) ) {
    
        echo $row['col1'];
        echo "<br>";
        echo $row['col2']; // undefined index thrown
        echo "<br>";
        echo $row['col3']; // undefined index thrown
    
    }
    

    주목해야 할 또 다른 점은 * NIX OS와 Mac OS X에서는 대소 문자가 구분된다는 것입니다.

    스택에 대한 다음 Q & A를 참조하십시오.

  21. ==============================

    21.

    3 진을 사용하는 것은 간단하고 읽기 쉽고 깨끗합니다.

    PHP 7 이전 버전 변수가 설정된 경우 다른 변수의 값에 변수를 할당하고, 그렇지 않으면 null (또는 필요한 기본값)을 할당합니다.

    $newVariable = isset($thePotentialData) ? $thePotentialData : null;
    

    PHP 7 이상 Null Coalescing Operator를 사용하는 것을 제외하면 동일합니다. 더 이상 isset ()이 내장되어 있으므로 호출 할 필요가 없으며 검사 할 변수의 값을 반환한다고 가정 할 때 반환 할 변수를 제공 할 필요가 없습니다.

    $newVariable = $thePotentialData ?? null;
    

    둘 다 OP 질문에서 고지 사항을 중단하며 둘 다 다음과 정확히 동일합니다.

    if (isset($thePotentialData)) {
        $newVariable = $thePotentialData;
    } else {
        $newVariable = null;
    }
    

    새로운 변수를 설정할 필요가 없다면 에코, 함수 인자 등과 같이 삼항의 반환 값을 직접 사용할 수 있습니다 :

    에코:

    echo 'Your name is: ' . isset($name) ? $name : 'You did not provide one';
    

    기능:

    $foreName = getForeName(isset($userId) ? $userId : null);
    
    function getForeName($userId)
    {
        if ($userId === null) {
            // Etc
        }
    }
    

    위의 코드는 세션 등을 포함하여 배열과 똑같이 작동하며 검사 할 변수를 예 : $ _SESSION [ 'checkMe'] 또는 당신이 필요로하는 많은 레벨, 예 : $ clients [ 'personal'] [ 'address'] [ 'postcode']

     

    억압:

    PHP 알림을 @로 표시하지 않거나 오류보고 수준을 낮출 수는 있지만 문제를 해결하지는 못하고 단순히 오류 로그에보고하지 않습니다. 이것은 코드가 여전히 설정되지 않은 변수를 사용하려고 시도했음을 의미합니다. 누락 된 값이 얼마나 중요한지에 따라 의도 한대로 작동하지 않을 수도 있습니다.

    정말로이 문제를 점검하고 적절하게 처리해야합니다. 다른 메시지를 제공하거나 정확한 상태를 식별하기 위해 다른 모든 것에 null 값을 반환하는 것입니다.

    통지가 오류 로그에 없다면 옵션으로 오류 로그를 무시할 수 있습니다.

  22. ==============================

    22.

    아마 이전 버전의 PHP를 사용하고 있었고 지금 업그레이드 된 PHP가 몇 년 전부터 아무런 오류없이 작동하고 있었던 이유가있을 것입니다. PHP4까지는 정의하지 않고 변수를 사용하면 오류가 없었지만 PHP5 이후에는 문제의 코드와 같은 오류가 발생합니다.

  23. ==============================

    23.

    파일을 처리 할 때 적절한 enctype과 POST 메소드가 필요합니다.이 메소드는 양식에 포함되지 않은 경우 정의되지 않은 색인 통지를 트리거합니다.

    설명서에는 다음과 같은 기본 구문이 나와 있습니다.

    HTML

    <!-- The data encoding type, enctype, MUST be specified as below -->
    <form enctype="multipart/form-data" action="__URL__" method="POST">
        <!-- MAX_FILE_SIZE must precede the file input field -->
        <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
        <!-- Name of input element determines name in $_FILES array -->
        Send this file: <input name="userfile" type="file" />
        <input type="submit" value="Send File" />
    </form>
    

    PHP

    <?php
    // In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
    // of $_FILES.
    
    $uploaddir = '/var/www/uploads/';
    $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
    
    echo '<pre>';
    if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
        echo "File is valid, and was successfully uploaded.\n";
    } else {
        echo "Possible file upload attack!\n";
    }
    
    echo 'Here is some more debugging info:';
    print_r($_FILES);
    
    print "</pre>";
    
    ?>
    

    참고:

  24. ==============================

    24.

    HTML 폼이 제출 된 후에 존재하지 않는 변수의 한 가지 일반적인 원인은

    태그 내에 폼 요소가 포함되어 있지 않다는 것입니다.

    예 : 내에 포함되지 않은 요소

    <form action="example.php" method="post">
        <p>
            <input type="text" name="name" />
            <input type="submit" value="Submit" />
        </p>
    </form>
    
    <select name="choice">
        <option value="choice1">choice 1</option>
        <option value="choice2">choice 2</option>
        <option value="choice3">choice 3</option>
        <option value="choice4">choice 4</option>
    </select>
    

    예 : 이제

    <form action="example.php" method="post">
        <select name="choice">
            <option value="choice1">choice 1</option>
            <option value="choice2">choice 2</option>
            <option value="choice3">choice 3</option>
            <option value="choice4">choice 4</option>
        </select>
        <p>
            <input type="text" name="name" />
            <input type="submit" value="Submit" />
        </p>
    </form>
    
  25. ==============================

    25.

    이러한주의 사항은 사용 된 변수가 정의되어 있지 않고 my_index 키가 $ my_array 변수에 없기 때문에 나타납니다.

    이러한 통지는 코드가 올바르지 않기 때문에 매번 트리거되지만주의 사항을보고하지 않았을 수 있습니다.

    버그를 해결하십시오 :

    $my_variable_name = "Variable name"; // defining variable
    echo "My variable value is: " . $my_variable_name;
    
    if(isset($my_array["my_index"])){
        echo "My index value is: " . $my_array["my_index"]; // check if my_index is set 
    }
    

    이 문제를 해결하는 또 다른 방법은 다음과 같습니다.

    ini_set("error_reporting", false)
    
  26. ==============================

    26.

    PHP에서는 사용할 수있는 변수를 정의하기 위해 주먹이 필요합니다. 우리는 변수가 매우 효율적으로 정의되어 있는지 검사 할 수 있습니다!.

    //If you only want to check variable has value and value has true and false value.
    //But variable must be defined first.
    
    if($my_variable_name){
    
    }
    
    //If you want to check variable is define or undefine
    //Isset() does not check that variable has true or false value
    //But it check null value of variable
    if(isset($my_variable_name)){
    
    }
    

    간단한 설명

    //It will work with :- true,false,NULL
    $defineVarialbe = false;
    if($defineVarialbe){
        echo "true";
    }else{
        echo "false";
    }
    
    //It will check variable is define or not and variable has null value.
    if(isset($unDefineVarialbe)){
        echo "true";
    }else{
        echo "false";
    }
    
  27. from https://stackoverflow.com/questions/4261133/notice-undefined-variable-notice-undefined-index-and-notice-undefined by cc-by-sa and MIT lisence