sourcecode

"알림:정의되지 않은 변수", "알림:정의되지 않은 인덱스", "경고:정의되지 않은 배열 키" 및 "알림:PHP를 사용한 정의되지 않은 오프셋"

copyscript 2022. 9. 15. 22:50
반응형

"알림:정의되지 않은 변수", "알림:정의되지 않은 인덱스", "경고:정의되지 않은 배열 키" 및 "알림:PHP를 사용한 정의되지 않은 오프셋"

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

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

주의: 정의되지 않은 인덱스: 11행의 my_index C:\wamp\www\mypath\index.php

경고:11행의 C:\wamp\www\mypath\index.php에 정의되지 않은 어레이 키 "my_index"가 있습니다.

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()는 기본적으로 !issetvarvar) || $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를 권장합니다.되지 않은 오류인 PHP를 합니다.E_NOTICE디폴트로는 보고되지 않지만 매뉴얼에서는 개발 중에 허용하도록 권장하고 있습니다.

문제 해결 방법:

  1. 권장:예를 들어 정의되지 않은 변수에 문자열을 추가하려고 할 때 변수를 선언합니다.또는 /를 사용하여 참조하기 전에 선언되었는지 확인합니다.

    //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 merase 연산자를 사용할 수 있습니다.

    // Null coalesce operator - No need to explicitly initialize the variable.
    $value = $_POST['value'] ?? '';
  1. E_NOTICE의 커스텀에러 핸들러를 설정하고, 메시지를 표준 출력으로부터 멀리 리다이렉트 합니다(로그 파일일 가능성이 있습니다).

    set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
    
  2. E_NOTICE를 사용하다퀵 제외 방법E_NOTICE 말합니다

    error_reporting( error_reporting() & ~E_NOTICE )
    
  3. @ 연산자를 사용하여 오류를 억제합니다.

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

주의: 정의되지 않은 인덱스/정의되지 않은 오프셋/경고:정의되지 않은 배열 키

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

문제 해결 방법:

  1. 인덱스에 액세스하기 전에 인덱스가 존재하는지 확인하십시오.이를 위해 또는 을 사용할 수 있습니다.

    //isset()
    $value = isset($array['my_index']) ? $array['my_index'] : '';
    //array_key_exists()
    $value = array_key_exists('my_index', $array) ? $array['my_index'] : '';
    
  2. 언어 구성에서는 존재하지 않는 배열 인덱스에 액세스하려고 할 때 다음과 같이 생성할 수 있습니다.

    list($a, $b) = array(0 => 'a');
    //or
    list($one, $two) = explode(',', 'test string');
    

의 변수가 어레이 입니다.인덱스는 1개의 어레이 엘리먼트로 .0뭇매를 맞다

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

#$_POST$_GET$_SESSION

위의 통지는 작업 시 자주 나타납니다.$_POST,$_GET ★★★★★★★★★★★★★★★★★」$_SESSION ★★★★의 $_POST ★★★★★★★★★★★★★★★★★」$_GET인덱스를 사용하기 전에 인덱스가 존재하는지 확인만 하면 됩니다.★★★의 $_SESSION세션이 로 시작되었고 인덱스가 존재하는지 확인해야 합니다.

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

연관된:

시험해 보다

Q1: 이 알림은 $varname이 스크립트의 현재 범위에서 정의되어 있지 않음을 의미합니다.

Q2: 의심스러운 변수를 사용하기 전에 isset(), empty() 조건을 사용하는 것이 좋습니다.

// 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);

세션에 대한 주의:

오류 표시 연산자

불필요한 장황한 통지의 경우 전용 연산자를 사용하여 정의되지 않은 변수/인덱스 메시지를 '숨김'할 수 있습니다.

$var = @($_GET["optional_param"]);
  • 이것은 보통 권장되지 않습니다.새로 온 사람들은 그것을 너무 많이 사용하는 경향이 있다.
  • 애플리케이션 로직(미신고 변수 무시) 내의 코드(함수 파라미터 또는 루프 등)에는 매우 부적절합니다.
  • 위에 한 개가 있어요isset?: ★★★★★★★★★★★★★★★★★」??이치노을 사용법 부활할 도 있다@- - 숨김 알림:set_error_handler("var_dump");
    • 으로 사용을 안 됩니다.if (isset($_POST["shubmit"]))첫 번째 코드로 입력해 주세요.
    • 새로 온 사람들은 그런 오타를 발견하지 못할 것이다.PHP Notice 를 notice notice 。@ ★★★★★★★★★★★★★★★★★」isset기능을 검증한 에만.
    • 원인을 먼저 해결하세요.공지가 아니라.

  • @ 주로 허용된다$_GET/$_POST입력 파라미터, 특히 옵션인 경우.

이러한 질문의 대부분은 여기에 해당하므로 가장 일반적인 원인에 대해 자세히 설명하겠습니다.

$_GET$_POST$_REQUESTundefined input(의 입력)

  • 정의되지 않은 인덱스/오프셋이 발생했을 때 가장 먼저 해야 할 일은 오타를 확인하는 것입니다.
    $count = $_GET["whatnow?"];

    • 이것은 예상된 키 이름이며 각 페이지 요청에 표시됩니까?
    • PHP에서는 변수 이름 및 배열 표시기가 대소문자를 구분합니다.
  • 둘째, 통지에 명확한 원인이 없는 경우 또는 를 사용하여 모든 입력 어레이의 내용을 확인합니다.

    var_dump($_GET);
    var_dump($_POST);
    //print_r($_REQUEST);
    

    둘 다 스크립트가 올바른 매개 변수를 사용하여 호출되었는지 여부를 표시합니다.

  • 또는 devtools()F12를 사용하여 네트워크 탭에서 요청 및 파라미터를 검사합니다.

    브라우저 개발자 도구 / 네트워크 탭

    POST 파라미터와 GET 입력이 별도로 표시됩니다.

  • ★★★의 $_GET를 참조할 수도 있습니다.

    print_r($_SERVER);
    

    PHP에는 비표준 매개 변수 이름을 슈퍼글로벌로 병합하는 규칙이 있습니다.Apache도 일부 개서를 할 수 있습니다.공급된 raw도 볼 수 있습니다.$_COOKIES요 http HTTP 。

  • GET 파라미터는 브라우저 주소창에서 확인할 수 있습니다.

    http://example.org/script.php?id=5&sort=desc

    name=value?)표getgetgetget(GET)get다다다다다다getgetget 이 은 URL만 생성할 수 .$_GET["id"] ★★★★★★★★★★★★★★★★★」$_GET["sort"].

  • 마지막으로 파라미터가 필요하지만 아무것도 수신하지 않은 경우 및 선언을 확인합니다.

    • 한 각 에 「」가 있는 합니다.<input name=FOO>
    • id= ★★★★★★★★★★★★★★★★★」title=속성이 충분하지 않습니다.
    • A method=POST$_POST.
    • , a는 a입니다.method=GET) 양보하다.$_GET수입니니다다
    • 에서 제공하는 action=script.php?get=param 및 $_GET을 통해 .method=POST$_POST 의 $ 。
    • 최신 PHP 구성( 5 5.6)에서는 GET 및 POST 파라미터를 매시하는 (패셔너블하지 않은) 것이 실현 가능하게 되었습니다.
  • 사용하는 mod_rewrite와 mod_rewrite를 모두 .access.log가 존재하지 않는 파라미터를 검출할 수 있도록 합니다.

$_FILES

  • 및 파일 업로드에도 됩니다.$_FILES["formname"].
  • '보다 낫다'를 해 주세요.enctype=multipart/form-data
  • 가가 가 asmethod=POST 안에서<form>★★★★★★ 。
  • 참고 항목: PHP 정의되지 않은 인덱스 오류 $_FILES?

$_COOKIE

  • $_COOKIE은 레이 array after after after after after after after after after after .setcookie(), 요청 에만 HTTP를 사용합니다.
  • 또한 유효기간이 만료되어 서브도메인 또는 개별 경로에 제약이 있을 수 있으며 사용자 및 브라우저는 이를 거부하거나 삭제할 수 있습니다.

일반적으로 "잘못된 프로그래밍"과 현재 또는 나중에 실수할 수 있는 가능성 때문입니다.

  1. 오류가 있는 경우 먼저 $varname=0; 변수에 적절하게 할당합니다.
  2. .if (isset($varname)) 「」를 참조
  3. 철자가 틀려서 그런 거라면 정정해 주세요.
  4. PHP 설정에서 경고를 해제할 수도 있습니다.

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

도움이 되기 때문에 알림을 비활성화하고 싶지는 않았지만, 너무 많이 입력하는 것은 피하고 싶었습니다.

저의 솔루션은 다음과 같습니다.

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') ?>

변수 '$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;

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

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

왜 갑자기 나타나는 거죠?이 스크립트를 몇 년 동안 사용해 왔지만, 전혀 문제가 없었습니다.

대부분의 사이트는 "모든 오류 표시, 그러나 '통지' 및 '사용되지 않음' 오류 보고의 "기본" 오류 보고로 작동하는 경우가 매우 많습니다.이는 php.ini로 설정되며 서버상의 모든 사이트에 적용됩니다.즉, 예에서 사용된 "알림"은 억제(숨김)되는 반면 더 중요한 것으로 간주되는 다른 오류는 표시/기록됩니다.

다른 를 숨길 수 는 숨길 수 ).display_errorsoff'로 합니다.

어떤 , 인가 하면error_reporting (이 (와 같이)/로 변경되었음을 .display_errors(억제/억제와는 대조적으로) 화면에 표시됩니다.

그들은 왜 변했을까?

가장 알기 쉬운 대답은 누군가가 php.ini에서 이러한 설정 중 하나를 조정했거나 PHP 업그레이드 버전이 이전과 다른 php.ini를 사용하고 있다는 것입니다.저기가 제일 먼저 봐야 할 곳이야.

단, 이러한 설정은 에서 덮어쓸 수도 있습니다.

  • .htconf (vhosts 및 서브서버 설정 포함)*
  • .htaccess(접속)
  • php 코드 자체에서

이것들 중 어느 것도 바뀌었을 수 있어요

또, Web 서버 설정으로 .htaccess 디렉티브를 유효/비활성화할 수 있는 복잡성도 있습니다.따라서 .htaccess에 디렉티브가 있어 갑자기 동작을 개시/정지하고 있는 경우는, 그것을 확인할 필요가 있습니다.

(.htconf / .htaccess)는 Apache로 실행되고 있다고 가정합니다.명령줄 실행 시 이 내용이 적용되지 않습니다.IIS 또는 다른 웹 서버를 실행하는 경우 해당 구성을 확인해야 합니다.)

요약

  • 마크를 켜주세요.error_reporting ★★★★★★★★★★★★★★★★★」display_errors이전과 .
  • 마크를 켜주세요.error_reporting ★★★★★★★★★★★★★★★★★」display_errors.되지 않았습니다.htconf(vhosts)는 php를 사용합니다.
  • 마크를 켜주세요.error_reporting ★★★★★★★★★★★★★★★★★」display_errors.는 .htaccess php는 htaccess ph를 사용합니다.
  • .htaccess에 디렉티브가 있는 경우 .htconf 파일에서 이러한 디렉티브가 계속 허용되는지 확인합니다.
  • 으로 코드를 관련이일 수 .코드가 합니다.관련되지 않은 라이브러리일 수 있습니다.error_reporting ★★★★★★★★★★★★★★★★★」display_errorsphp 디 php php php php php php php php php php php php php 。

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

$user_location = null;

왜 이런 일이 생기는 건가요?

시간이 지남에 따라 PHP는 보안에 중점을 둔 언어가 되었습니다.디폴트로 해제되어 있던 설정이 디폴트로 유효하게 되어 있습니다.한 예는 " " " 입니다.E_STRICT는, PHP 5.4.0부터 디폴트로 유효하게 되어 있습니다.

에 의하면,로는 「ada」PHP의 「PHP」, 「PHP」, 「PHP」, 「PHP」, 「PHP」, 「PHPE_NOTICEphp.ini 파일에서는 비활성화되어 있습니다.PHP 설명서에서는 디버깅을 위해기능을 켜는 것이 좋습니다.그러나 Ubuntu 저장소와 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 이외에서는 문서화되어 있지 않기 때문에 다른 배포에서는 검증되지 않았습니다.

단, 이 에러는, 이전에 팝업 되지 않았던 경우에 표시됩니다.이 에러는 다음과 같은 이유로 표시됩니다.

  1. 를 해, 만, PHP 의 디폴트 설정은 제외되지 .E_NOTICE.

  2. E_NOTICE정의되지 않은 변수 및 정의되지 않은 인덱스와 같은 경고는 코드를 보다 깨끗하고 안전하게 만드는 데 도움이 됩니다.몇 년 전만 해도, 이 모든 것들을E_NOTICE이치C 를 c c c c c c c c c c c 。C에서는 변수를 선언하지 않는 것이 훨씬 더 큰 골칫거리입니다.

어떻게 하면 좋을까요?

  1. E_NOTICE value" "Default value" "Default value" 를 E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED 현재 되지 않은 합니다.error_reporting =CGI 또는 FPM을 사용하는 경우 Apache 또는 PHP를 재시작합니다.올바른 php.ini 파일을 편집하고 있는지 확인합니다.PHP를 Apache와 함께 실행하는 경우 Apache, PHP-FPM을 실행하는 경우 fpm 또는 php-fpm, PHP-CGI를 실행하는 경우 cgi 등이 올바른 방법입니다.권장되는 방법은 아니지만 편집이 매우 어려운 레거시 코드가 있는 경우 이 방법을 사용하는 것이 가장 좋습니다.

  2. E_NOTICE을 사용법레거시 코드가 있지만 그렇지 않으면 "올바른" 방법으로 작업을 수행할 경우 이 방법이 더 좋습니다.이를 위해서는 Apache 2, Nginx 또는 선택한 서버가 무엇이든 참조해야 합니다.Apache를 사용합니다.php_value의 of의 <Directory>.

  3. 코드를 더 깔끔하게 다시 작성합니다.실가동 환경으로의 이행중에 이 조작을 실시할 필요가 있는 경우는, 에러 표시를 무효로 해, 에러만을 로그에 기록하도록 해 주세요( 를 참조해 주세요.display_errors ★★★★★★★★★★★★★★★★★」log_errorsphp.ini를 참조해 주세요).

옵션 3을 확장하려면: 이것이 이상적입니다.네, 이렇게요.처음에 이 루트를 사용하지 않을 경우 개발 환경에서 코드를 테스트하여 최종적으로 이 루트를 이동하는 것을 고려해 주십시오.~E_STRICT ★★★★★★★★★★★★★★★★★」~E_DEPRECATED해야 할 때, 않은 를 업그레이드해야 할 때 하지 않게 .익숙하지 않은 오류가 많이 나타나겠지만 앞으로 PHP를 업그레이드해야 할 때 불쾌한 문제가 발생하지 않도록 할 것입니다.

오류는 무엇을 의미합니까?

Undefined variable: my_variable_name 않은 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 맞다.PHP는 null입니다.그러나 변수를 정의하기 전에 확인해야 하는 시나리오는 무엇입니까?결국, 이것은 "슬롭 코드"에 대한 논쟁입니다.개발자로서 저는 변수가 정의 가능한 범위 내에서 높은 수준으로 정의되는 오픈 소스 프로젝트를 보면 이 프로젝트가 매우 마음에 든다고 말할 수 있습니다.향후 어떤 변수가 표시될지 쉽게 알 수 있고 코드를 읽고 학습하기 쉬워집니다.

function foo()
{
    $my_variable_name = '';

    //....

    if ($my_variable_name) {
        // perform some logic
    }
}

Undefined index: 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';

(추가 팁)

  • 이러한 문제나 기타 문제가 발생했을 때 NetBeans IDE(무료)를 사용했더니 경고와 알림이 많이 표시되었습니다.그들 중 몇몇은 매우 유용한 팁을 제공한다.이것은 필수가 아니고, 대규모 프로젝트 이외에는 IDE를 사용하지 않습니다.저는 좀 더vim(예:)

저는 이 오류를 저주하곤 했습니다만, 사용자 입력을 회피하는 것이 도움이 될 수 있습니다.

예를 들어, 이것이 현명하다고 생각되는 경우, 속기 코드:

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

...다시 생각해봐!보다 나은 솔루션은 다음과 같습니다.

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

(는 관습(관습관)을 html()문자를 이스케이프하는 기능, 주행거리는 다를 수 있습니다.)

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

PHP 매뉴얼 PHP 7.0

변수를 자동으로 선언하는 유용한 함수 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;
}

매우 간단한 언어로:

. .$user_location 아까 정의하지도 않았고 가치도 없어요따라서 이 변수를 사용하기 전에 선언할 것을 권장합니다.예를 들어 다음과 같습니다.


$user_location = '';
또는
$user_location = 'Los Angles';

이는 매우 일반적인 오류입니다.그러니 걱정하지 말고 변수를 선언하고 코딩하는 을 즐기세요.

단순성 유지:

<?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 the array index. Nice
?>

정의되지 않은 인덱스는 사용할 수 없는 어레이 인덱스에 대해 요청한 어레이를 의미합니다.예를들면,

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

정의되지 않은 변수는 기존 변수가 아닌 변수를 완전히 사용했거나 해당 이름으로 정의 또는 초기화되지 않았음을 의미합니다.예를들면,

<?php print_r($myvar); ?>

정의되지 않은 오프셋은 존재하지 않는 키를 요청한 배열 내를 의미합니다.이를 위한 솔루션은 사용하기 전에 다음 사항을 확인하는 것입니다.

php> echo array_key_exists(1, $myarray);

질문의 이 부분에 대해서:

왜 갑자기 나타나는 거죠?나는 이 대본을 몇 년 동안 사용했지만 문제가 생긴 적은 없었다.

명확한 답변은 없지만, 다음과 같이 설정이 '갑자기' 변경될 수 있는 이유를 설명합니다.

  1. PHP를 error_reporting, display_errors 또는 기타 관련 설정에 대해 다른 기본값을 설정할 수 있는 새로운 버전으로 업그레이드했습니다.

  2. 이 있음)를 하여 실행 시 또는 되었습니다.ini_set() ★★★★★★★★★★★★★★★★★」error_reporting() (코드로 검색)

  3. 아파치 .htaccess"vhost" "php" "vhost" "php" "vhost" "vhost" "vhost" "php" "vhost" "vhost" "ph" "vhp"

  4. 통지는 보통 표시/보고되지 않기 때문에(PHP 매뉴얼 참조), 서버를 셋업할 때 어떤 이유로 php.ini 파일을 로드할 수 없는 경우가 있습니다(파일 권한).디폴트 설정으로 되어 있습니다.나중에 '버그'는 (실수로) 해결되었으며, 이제 알림을 표시하도록 error_reporting이 설정된 올바른 php.ini 파일을 로드할 수 있습니다.

3진 연산자의 사용은 간단하고 읽기 쉬우며 깨끗합니다.

PHP 7 이전

되어 있는 를 다른 않은 경우 변수를 할당합니다.null(또는 필요한 기본값):

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

PHP 7+

null 병합 연산자를 사용하는 것 외에는 동일합니다.더 이상 전화할 필요가 없다.isset()체크되는 변수의 값을 반환하는 것으로 간주되므로 반환할 변수를 제공할 필요가 없습니다.

$newVariable = $thePotentialData ?? null;

양쪽 모두 OP의 질문에서 통지를 정지합니다.이러한 통지는 모두 다음 항목에 해당합니다.

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

없는 반환값을 할 수 .를 들어, 3진수 연산자의 반환값은 3진수입니다.echo인수 , 「」, 「」:

에코:

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 값을 반환하여 정확한 상태를 식별할 수도 있습니다.

알림이 오류 로그에 없는 것만 신경 쓴다면, 옵션으로 오류 로그를 무시할 수 있습니다.

할 경우 할 때 변수를 .$this:

class Person
{
    protected $firstName;
    protected $lastName;

    public function setFullName($first, $last)
    {
        // Correct
        $this->firstName = $first;

        // Incorrect
        $lastName = $last;

        // Incorrect
        $this->$lastName = $last;
    }
}

정의되지 않은 인덱스 알림이 발생하는 또 다른 이유는 데이터베이스 쿼리에서 열이 누락되었기 때문일 수 있습니다.

예:

$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를 참조해 주세요.

HTML 폼이 전송된 후 변수가 존재하지 않는 일반적인 원인 중 하나는 폼 요소가 에 포함되어 있지 않기 때문입니다.<form> 삭제:

예제:요소가 에 포함되어 있지 않습니다.<form>

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

: contained제제제 the the the the the the the the the the the the 에 포함된 요소.<form>

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

이러한 오류는 설정되지 않은 변수를 사용할 때마다 발생합니다.

이 문제를 해결하는 가장 좋은 방법은 개발 중에 오류 보고를 설정하는 것입니다.

오류 보고를 설정하려면:

ini_set('error_reporting', 'on');
ini_set('display_errors', 'on');
error_reporting(E_ALL);

실가동 서버에서는 에러 리포트가 오프가 되어 있기 때문에, 이러한 에러는 표시되지 않습니다.

그러나 개발 서버에서는 오류 보고를 설정할 수 있습니다.

이 에러를 해소하기 위해서, 다음의 예를 나타냅니다.

if ($my == 9) {
 $test = 'yes';  // Will produce an error as $my is not 9.
}
echo $test;

할 수 .NULL값을 할당하거나 사용하기 전에 미리 확인해야 합니다.

따라서 코드를 다음과 같이 수정할 수 있습니다.

$test = NULL;
if ($my == 9) {
 $test = 'yes';  // Will produce an error as $my is not 9.
}
echo $test;

로 인해 , 로직이 방해되지 않고 .$test이이없없없없다다

따라서 기본적으로 개발을 위해 오류 보고를 항상 설정하는 것이 좋습니다.

그리고 모든 오류를 수정하십시오.

또, 실가동시에는, 에러 리포트를 오프(off)로 설정할 필요가 있습니다.

이에 대해 질문했더니 다음과 같은 메시지와 함께 이 게시물을 참조하게 되었습니다.

이 질문에는 이미 답이 있습니다.

"알림:정의되지 않은 변수", "알림:정의되지 않은 인덱스" 및 "알림:PHP를 사용한 정의되지 않은 오프셋"

여기서 제 질문과 해결책을 공유하겠습니다.

에러는 다음과 같습니다.

여기에 이미지 설명 입력

154호선이 문제입니다.154번 줄에는 다음과 같은 내용이 있습니다.

153    foreach($cities as $key => $city){
154        if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){

인 경우 이 문제인 것 같아요.$city 값은 키가 '키'가 아니라 '키'가 '키'의 입니다.$key => $city먼저 그것이 경고의 원인인지 확인해 주시겠습니까?두 번째, 만약 그것이 문제라면, 왜 그 값에 근거해 조건을 쓸 수 없는 것입니까?조건을 작성하려면 키와 함께 해야 하나요?

1: 이 는 "1"을 실행할 때: " " " 입니다.$citiesCounterArray[$key]에 따라서는, 「」가 됩니다.$key 키가 있습니다.$citiesCounterArray하지만 루프의 데이터를 기반으로 할 때 항상 그렇지는 않습니다.한 것은 조건을 이 조건의 조건이, 만약 이 조건이라면$key배열에 존재합니다.그 후 코드를 실행합니다.그렇지 않으면 건너뜁니다.

2: 이렇게 했습니다.array_key_exists():

foreach($cities as $key => $city){
    if(array_key_exists($key, $citiesCounterArray)){
        if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){

아마도 당신은 이전 PHP 버전을 사용하다가 이제 PHP를 업그레이드 했을 것입니다. 그래서 지금까지 오류 없이 작동했습니다.

PHP 4까지는 변수를 정의하지 않고 사용하는 경우 오류가 없었지만 PHP 5 이후부터는 문제가 된 코드에 오류가 발생합니다.

API로 데이터를 전송하는 경우 isset()을 사용합니다.

if(isset($_POST['param'])){
    $param = $_POST['param'];
} else {
    # Do something else
}

세션이 원인인 경우 세션이 올바르게 시작되었는지 확인하십시오.

defined ★★★★★★★★★★★★★★★★★」my_index.$my_array★★★★★★ 。

되었습니다. 당신의 공지가 발동되었기 때문입니다.code올바르지 않습니다만, 통지의 보고는 하고 있지 않았던 것 같습니다.

버그 해결:

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

파일을 다룰 때는 양식에 포함되지 않은 경우 정의되지 않은 인덱스 알림을 트리거하는 적절한 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>";

?>

레퍼런스:

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 if the variable is defined or undefined
// Isset() does not check that variable has a true or false value
// But it checks the null value of a variable
if(isset($my_variable_name)){

}

간단한 설명

// It will work with: true, false, and NULL
$defineVariable = false;
if($defineVariable){
    echo "true";
}else{
    echo "false";
}

// It will check if the variable is defined or not and if the variable has a null value.
if(isset($unDefineVariable)){
    echo "true";
}else{
    echo "false";
}

언급URL : https://stackoverflow.com/questions/4261133/notice-undefined-variable-notice-undefined-index-warning-undefined-arr

반응형