질문자 :Community Wiki
PHP 스크립트를 실행하고 있는데 다음과 같은 오류가 계속 발생합니다.
주의: 정의되지 않은 변수: my_variable_name in C:\wamp\www\mypath\index.php on line 10
주의: 정의되지 않은 인덱스: 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
발행하는 것입니다. 이 오류는 기본적으로 보고되지도 않지만 매뉴얼에서는 개발 중에 허용하도록 권장합니다.
문제를 처리하는 방법:
권장 사항: 예를 들어 정의되지 않은 변수에 문자열을 추가하려고 할 때 변수를 선언하십시오. 또는 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'] ?? '';
E_NOTICE에 대한 사용자 지정 오류 처리기 를 설정하고 표준 출력에서 메시지를 리디렉션합니다(로그 파일로).
set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
보고에서 E_NOTICE를 비활성화합니다. E_NOTICE
만 제외하는 빠른 방법은 다음과 같습니다.
error_reporting( error_reporting() & ~E_NOTICE )
@ 연산자로 오류를 억제합니다.
참고: 포인트 1만 구현하는 것이 좋습니다.
주의: 정의되지 않은 인덱스 / 정의되지 않은 오프셋
이 알림은 사용자(또는 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()
는 존재하지 않는 배열 인덱스에 액세스하려고 할 때 이것을 생성할 수 있습니다.
list($a, $b) = array(0 => 'a'); //or list($one, $two) = explode(',', 'test string');
두 개의 변수는 두 개의 배열 요소에 액세스하는 데 사용되지만 하나의 배열 요소인 인덱스 0
만 있으므로 다음이 생성됩니다.
주의: 정의되지 않은 오프셋: 1
$_POST
/ $_GET
/ $_SESSION
변수
$_POST
, $_GET
또는 $_SESSION
작업할 때 자주 나타납니다. $_POST
및 $_GET
경우 인덱스를 사용하기 전에 인덱스가 존재하는지 여부를 확인하기만 하면 됩니다. $_SESSION
session_start()
세션을 시작했고 인덱스도 존재하는지 확인해야 합니다.
또한 3개의 변수는 모두 슈퍼글로벌 이며 대문자입니다.
관련된:
Community Wiki이것을 시도하십시오
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);
세션에 대한 참고 사항:
Community Wiki 원하지 않는 중복 통지의 경우 전용 @
연산자 를 사용하여 » 정의되지 않은 변수/인덱스 메시지를 숨길 수 있습니다.
$var = @($_GET["optional_param"]);
- 이것은 일반적으로 권장되지 않습니다. 새로 온 사람들은 그것을 과도하게 사용하는 경향이 있습니다.
- 예를 들어 함수 매개변수나 루프에서와 같이 응용 프로그램 로직(선언되지 않은 변수를 무시해서는 안 되는 곳에서는 무시) 내의 깊은 코드에는 매우 부적절합니다.
-
isset?:
또는 ??
그러나 초진압. 알림은 계속 기록될 수 있습니다. 그리고 다음을 사용 @
-hidden 알림을 set_error_handler("var_dump");
- 또한 초기 코드에서
if (isset($_POST["shubmit"]))
을 습관적으로 사용/권장해서는 안 됩니다. - 초보자는 그러한 오타를 발견하지 못할 것입니다. 바로 그러한 경우에 대한 PHP 알림을 박탈합니다. 기능 을 확인한 후에만
@
또는 isset
추가하십시오. 먼저 원인을 해결하십시오. 공지사항이 아닙니다.
-
@
는 주로 $_GET
/ $_POST
입력 매개변수에 사용할 수 있습니다. 특히 선택사항인 경우에는 더욱 그렇습니다.
그리고 이것은 그러한 질문의 대부분을 다루므로 가장 일반적인 원인에 대해 확장해 보겠습니다.
$_GET
/ $_POST
/ $_REQUEST
정의되지 않은 입력
정의되지 않은 인덱스/오프셋을 만났을 때 가장 먼저 하는 일은 오타를 확인하는 것입니다.
$count = $_GET["whatnow?"];
- 이것은 예상되는 키 이름이며 각 페이지 요청에 표시됩니까?
- PHP에서 변수 이름 과 배열 인덱스는 대소문자를 구분합니다.
둘째, 통지에 명백한 원인이 없는 경우 var_dump
또는 print_r
을 사용하여 현재 내용에 대한 모든 입력 배열을 확인하십시오.
var_dump($_GET); var_dump($_POST); //print_r($_REQUEST);
둘 다 스크립트가 올바른 매개 변수로 호출되었는지 여부를 나타냅니다.
대안으로 또는 추가로 브라우저 devtools ( F12 )를 사용 하고 네트워크 탭에서 요청 및 매개변수를 검사합니다.
POST 매개변수와 GET 입력은 별도로 표시됩니다.
$_GET
매개변수의 경우 QUERY_STRING
을 엿볼 수도 있습니다.
print_r($_SERVER);
PHP에는 비표준 매개변수 이름을 슈퍼글로벌로 통합하는 몇 가지 규칙이 있습니다. Apache는 재작성도 할 수 있습니다. 제공된 원시 $_COOKIES
및 기타 HTTP 요청 헤더를 그런 식으로 볼 수도 있습니다.
GET 매개변수에 대한 브라우저 주소 표시줄을 보다 명확하게 살펴보십시오.
http://example.org/script.php?id=5&sort=desc
name=value
쌍은 ?
물음표는 쿼리(GET) 매개변수입니다. $_GET["id"]
및 $_GET["sort"]
만 생성할 수 있습니다.
마지막으로 매개변수를 기대하지만 매개변수를 받지 못한다면 <form>
및 <input>
-
<input name=FOO>
가 있는지 확인하십시오. -
id=
또는 title=
속성이 충분하지 않습니다. -
method=POST
형식은 $_POST
를 채워야 합니다. - 반면
method=GET
(또는 생략)은 $_GET
변수를 생성합니다. - $_GET을 통해 form이
action=script.php?get=param
method=POST
필드를 함께 제공하는 것도 가능합니다. - 최신 PHP 구성(≥ 5.6)
$_REQUEST['vars']
다시 사용하여 GET 및 POST 매개변수를 매쉬하는 것이 가능해 졌습니다(유행이 아님).
mod_rewrite를 사용하는 경우 access.log
RewriteLog
를 활성화하여 부재 매개변수를 파악해야 합니다.
$_FILES
-
$_FILES["formname"]
에도 동일한 온전성 검사가 적용됩니다. - 또한
enctype=multipart/form-data
-
<form>
선언의 method=POST
도 마찬가지입니다. - 참조: PHP 정의되지 않은 인덱스 오류 $_FILES?
$_COOKIE
-
$_COOKIE
setcookie()
직후에 채워지지 않고 후속 HTTP 요청에서만 채워집니다. - 또한 유효 시간이 초과되어 하위 도메인 또는 개별 경로로 제한될 수 있으며 사용자와 브라우저는 이를 거부하거나 삭제할 수 있습니다.
Community Wiki일반적으로 "잘못된 프로그래밍"과 지금 또는 나중에 실수할 가능성이 있기 때문입니다.
- 실수라면 먼저 변수에 적절한 할당을 하십시오. $varname=0;
- 정말 가끔만 정의되는 경우 테스트:
if (isset($varname))
, 사용하기 전에 - 맞춤법이 틀렸다면 바로 수정하세요.
- PHP 설정 에서 경고를 해제할 수도 있습니다.
Community Wiki아직 할당하지 않은 변수를 테스트, 평가 또는 인쇄하고 있음을 의미합니다. 이는 오타가 있거나 변수가 먼저 초기화되었는지 확인해야 함을 의미합니다. 논리 경로를 확인하십시오. 한 경로에는 설정되어 있지만 다른 경로에는 설정되어 있지 않을 수 있습니다.
Community Wiki도움이 되기 때문에 알림을 비활성화하고 싶지는 않았지만 너무 많은 입력을 피하고 싶었습니다.
내 솔루션은 다음 기능이었습니다.
function ifexists($varname) { return(isset($$varname)?$varname:null); }
따라서 $name을 참조하고 echo가 존재하는 경우 다음과 같이 작성하면 됩니다.
<?=ifexists('name')?>
배열 요소의 경우:
function ifexistsidx($var,$index) { return(isset($var[$index])?$var[$index]:null); }
$_REQUEST['name']을(를) 참조하려면 페이지에서:
<?=ifexistsidx($_REQUEST,'name')?>
Community Wiki입력 문자열 을 얻는 가장 좋은 방법은 다음과 같습니다.
$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');
Community Wiki변수 '$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;
Community Wiki이에 대해 "갑자기 등장하는 이유는? 나는 몇 년 동안 이 스크립트를 사용했는데 아무런 문제가 없었습니다."
대부분의 사이트는 "모든 오류를 표시하지만 '공지' 및 '사용 중단'은 표시하지 않음"의 "기본" 오류 보고에서 작동하는 것이 매우 일반적입니다. 이것은 php.ini에서 설정되며 서버의 모든 사이트에 적용됩니다. 이것은 예에서 사용된 "주의 사항"이 억제(숨김)되는 반면 더 심각한 것으로 간주되는 다른 오류는 표시/기록됨을 의미합니다.
다른 중요한 설정은 오류를 숨길 수 있다는 것입니다(즉, display_errors
가 "off" 또는 "syslog"로 설정됨).
이 경우에 발생하는 일은 error_reporting
이 알림도 표시하도록 변경되었거나(예제에 따라) 설정이 display_errors
로 변경되었다는 것입니다(이를 억제/로깅하는 것과 반대).
왜 변경되었습니까?
가장 명백하고 간단한 대답은 누군가가 php.ini에서 이러한 설정 중 하나를 조정했거나 PHP의 업그레이드된 버전이 이제 이전과 다른 php.ini를 사용하고 있다는 것입니다. 가장 먼저 보는 곳입니다.
그러나 에서 이러한 설정을 무시할 수도 있습니다.
- .htconf(가상 호스트 및 하위 구성을 포함한 웹 서버 구성)*
- .ht액세스
- PHP 코드 자체에서
그리고 이들 중 하나라도 변경될 수 있습니다.
또한 웹 서버 구성이 .htaccess 지시문을 활성화/비활성화할 수 있다는 추가 합병증이 있으므로 .htaccess에 갑자기 작동을 시작/중지하는 지시문이 있는 경우 이를 확인해야 합니다.
(.htconf / .htaccess는 아파치로 실행한다고 가정합니다. 명령줄을 실행하는 경우 적용되지 않습니다. IIS 또는 다른 웹 서버를 실행하는 경우 그에 따라 해당 구성을 확인해야 합니다)
요약
-
error_reporting
및 display_errors
php 지시문이 변경되지 않았는지 또는 이전과 다른 php.ini를 사용하고 있지 않은지 확인하십시오. - .htconf(또는 vhosts 등)의
error_reporting
및 display_errors
PHP 지시문이 변경되지 않았는지 확인하십시오. -
error_reporting
및 display_errors
PHP 지시문이 변경되지 않았는지 확인하십시오. - .htaccess에 지시문이 있는 경우 .htconf 파일에서 여전히 허용되는지 확인하십시오.
- 마지막으로 코드를 확인하십시오. 관련이 없는 라이브러리일 수 있습니다.
error_reporting
및 display_errors
PHP 지시문이 거기에 설정되었는지 확인합니다.
Community Wiki빠른 수정은 코드 상단에서 변수를 null에 할당하는 것입니다.
$user_location = null;
Community Wiki나는 이 오류를 저주하곤 했지만, 사용자 입력을 피할 것을 상기시키는 것이 도움이 될 수 있습니다.
예를 들어 이것이 영리한 단축 코드라고 생각한다면 다음과 같습니다.
// Echo whatever the hell this is <?=$_POST['something']?>
...다시 생각 해봐! 더 나은 솔루션은 다음과 같습니다.
// If this is set, echo a filtered version <?=isset($_POST['something']) ? html($_POST['something']) : ''?>
(나는 사용자 정의 html()
함수를 사용하여 문자를 이스케이프합니다. 마일리지는 다를 수 있습니다)
Community WikiPHP 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
Community Wiki변수를 자동으로 선언하는 항상 유용한 함수 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; }
Community Wiki왜 이런 일이 발생합니까?
시간이 지나면서 PHP는 보다 보안에 중점을 둔 언어가 되었습니다. 기본적으로 꺼져 있던 설정이 이제 기본적으로 켜져 있습니다. 이것의 완벽한 예 는 PHP 5.4.0부터 기본적으로 켜져 있는 E_STRICT
입니다.
또한 PHP 문서에 따르면 기본적으로 E_NOTICE
는 php.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
은 기본적으로 "default" 값이 아니라 기본적으로 프로덕션 값으로 실제로 설정됩니다. 이것은 다소 혼란스럽고 php.ini 외부에 문서화되어 있지 않으므로 다른 배포판에서 이를 검증하지 않았습니다.
그러나 귀하의 질문에 대답하기 위해 다음과 같은 이유로 이전에 팝업되지 않은 이 오류가 지금 나타납니다.
PHP를 설치했고 새로운 기본 설정이 문서화되어 있지 않지만 E_NOTICE
제외하지는 않습니다.
E_NOTICE
경고는 실제로 코드를 더 깨끗하고 안전하게 만드는 데 도움이 됩니다. E_NOTICE
활성화한 상태로 유지하면서 변수를 선언해야 했습니다. 그것은 C를 배우는 것을 훨씬 더 쉽게 만들었습니다. 변수를 선언하지 않는 것은 성가신 일입니다.
그것에 대해 무엇을 할 수 있습니까?
"기본값" E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
error_reporting =
에서 등호 뒤에 현재 주석 처리되지 않은 것으로 대체하여 E_NOTICE
를 끕니다. CGI 또는 FPM을 사용하는 경우 Apache 또는 PHP를 다시 시작합니다. "올바른" php.ini를 편집하고 있는지 확인하십시오. 올바른 방법은 Apache와 함께 PHP를 실행하는 경우 Apache, PHP-FPM을 실행하는 경우 fpm 또는 php-fpm, PHP-CGI를 실행하는 경우 cgi 등입니다. 이것은 권장되는 방법은 아니지만 다음을 수행할 레거시 코드가 있는 경우 편집하기가 매우 어렵다면 최선의 방법일 수 있습니다.
파일 또는 폴더 수준에서 E_NOTICE
레거시 코드가 있지만 "올바른" 방식으로 작업을 수행하려는 경우 이 방법이 더 좋을 수 있습니다. 이렇게 하려면 Apache2, Nginx 또는 선택한 서버에 문의해야 합니다. Apache에서는 <Directory>
내부에 php_value
사용합니다.
코드를 더 깔끔하게 다시 작성하십시오. 프로덕션 환경으로 이동하는 동안 이 작업을 수행해야 하거나 다른 사람에게 오류가 표시되지 않도록 하려면 오류 표시를 비활성화하고 오류만 기록 해야 합니다(php.ini 및 서버의 display_errors
및 log_errors
설정).
옵션 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
사람입니다 :).
Community Wiki아주 간단한 언어로 .
실수는 이전에 정의하지 않았고 값이 없는 $user_location
변수를 사용하고 있다는 것입니다. 따라서 사용 하기 전에 이 변수 를 선언하는 것이 좋습니다. 예를 들면 다음과 같습니다.
$user_location = '';
또는 $user_location = 'Los Angles';
이것은 당신이 직면할 수 있는 매우 일반적인 오류입니다. 그러니 걱정하지 말고 변수를 선언하고
코딩을 즐기십시오 .
Community Wiki왜 일을 단순하게 유지하지 않습니까?
<?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 ?>
Community Wiki정의되지 않은 인덱스는 예를 들어 사용할 수 없는 배열 인덱스에 대해 요청한 배열에서 의미합니다.
<?php $newArray[] = {1,2,3,4,5}; print_r($newArray[5]); ?>
정의되지 않은 변수는 존재하지 않는 변수를 완전히 사용했거나 해당 이름으로 정의 또는 초기화되지 않은 변수를 의미합니다.
<?php print_r($myvar); ?>
정의되지 않은 오프셋은 배열에서 존재하지 않는 키를 요청했음을 의미합니다. 그리고 이것에 대한 해결책은 사용하기 전에 확인하는 것입니다.
php> echo array_key_exists(1, $myarray);
Community Wiki질문의 이 부분과 관련하여:
그들은 왜 갑자기 나타납니까? 나는 몇 년 동안 이 스크립트를 사용했는데 아무런 문제가 없었습니다.
확실한 대답은 없지만 설정이 '갑자기' 변경될 수 있는 이유에 대한 몇 가지 가능한 설명은 다음과 같습니다.
error_reporting, display_errors 또는 기타 관련 설정에 대해 다른 기본값을 가질 수 있는 최신 버전으로 PHP를 업그레이드했습니다.
ini_set()
또는 error_reporting()
사용하여 런타임에 관련 설정을 설정하는 일부 코드(종속성 가능성 있음)를 제거하거나 도입했습니다(코드에서 검색).
웹 서버 구성을 변경했습니다(여기서는 apache로 가정): .htaccess
파일과 vhost 구성도 php 설정을 조작할 수 있습니다.
일반적으로 알림은 표시/보고되지 않으므로(PHP 설명서 참조) 서버를 설정할 때 php.ini 파일이 어떤 이유로(파일 권한??) 로드되지 않고 기본 설정에 있을 수 있습니다. . 나중에 '버그'가 (우연히) 해결되었으며 이제 error_reporting이 알림을 표시하도록 설정된 올바른 php.ini 파일을 로드할 수 있습니다.
Community Wiki삼항을 사용하는 것은 간단하고 읽기 쉽고 깨끗합니다.
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
, 함수 인수 등과 같이 삼항의 반환 값을 직접 사용할 수 있습니다.
에코:
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 값을 반환하는 등 이 문제를 실제로 확인하고 적절하게 처리해야 합니다.
알림이 오류 로그에 없는 것에 관심이 있다면 옵션으로 오류 로그를 무시할 수 있습니다.
Community Wiki$this
사용하여 멤버 변수를 참조하는지 확인해야 합니다.
class Person { protected $firstName; protected $lastName; public function setFullName($first, $last) { // Correct $this->firstName = $first; // Incorrect $lastName = $last; // Incorrect $this->$lastName = $last; } }
Community Wiki정의되지 않은 인덱스 알림이 발생하는 또 다른 이유는 데이터베이스 쿼리에서 열이 생략되었기 때문입니다.
즉:
$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에서는 대소문자를 구분한다는 것입니다.
Stack에 대한 다음 Q&A를 참조하세요.
Community Wiki이러한 오류는 설정되지 않은 변수를 사용할 때마다 발생합니다.
이를 처리하는 가장 좋은 방법은 개발 중에 오류 보고를 설정하는 것입니다.
오류 보고를 설정하려면:
ini_set('error_reporting', 'on'); ini_set('display_errors', 'on'); error_reporting(E_ALL);
프로덕션 서버에서는 오류 보고가 꺼져 있으므로 이러한 오류가 발생하지 않습니다.
그러나 개발 서버에서는 오류 보고를 설정할 수 있습니다.
이 오류를 제거하기 위해 다음 예를 봅니다.
if ($my == 9) { $test = 'yes'; // Will produce error as $my is not 9. } echo $test;
값을 할당하거나 사용하기 전에 NULL
초기화할 수 있습니다.
따라서 코드를 다음과 같이 수정할 수 있습니다.
$test = NULL; if ($my == 9) { $test = 'yes'; // Will produce error as $my is not 9. } echo $test;
이것은 프로그램 논리를 방해 $test
값이 없더라도 알림을 생성하지 않습니다.
따라서 기본적으로 개발을 위해 오류 보고를 ON으로 설정하는 것이 항상 더 좋습니다.
그리고 모든 오류를 수정하십시오.
그리고 프로덕션에서 오류 보고는 꺼짐으로 설정되어야 합니다.
Community WikiHTML 양식이 제출된 후 변수가 존재하지 않는 일반적인 원인 중 하나 <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>
<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>
Community Wiki아마도 당신은 이전 PHP 버전을 사용하고 있었고 지금까지 PHP를 업그레이드했기 때문에 몇 년 동안 지금까지 오류 없이 작동하고 있었을 것입니다. PHP4까지는 변수를 정의하지 않고 사용하면 오류가 없었지만 PHP5부터는 문제에서 언급한 것과 같은 코드에 대해 오류가 발생합니다.
Community Wiki나는 이것에 대해 질문했고 나는 다음과 같은 메시지와 함께 이 게시물을 참조했습니다.
이 질문에는 이미 답이 있습니다.
PHP를 사용한 "공지: 정의되지 않은 변수", "주의: 정의되지 않은 인덱스" 및 "주의: 정의되지 않은 오프셋"
여기에서 내 질문과 솔루션을 공유하고 있습니다.
이것은 오류입니다:
154행이 문제입니다. 이것은 154행에 있는 내용입니다.
153 foreach($cities as $key => $city){ 154 if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){
$city
변수에 대한 조건을 작성하고 있다는 것인데, 이는 키가 아니라 $key => $city
의 값입니다. 먼저 이것이 경고의 원인인지 확인할 수 있습니까? 둘째, 그게 문제라면 왜 값을 기준으로 조건을 작성할 수 없습니까? 조건을 작성하는 데 필요한 키가 있어야 합니까?
업데이트 1: 문제는 $citiesCounterArray[$key]
$key
$citiesCounterArray
배열에 존재하지 않는 키에 해당하지만 내 루프의 데이터를 기반으로 하는 경우가 항상 그런 것은 아니라는 것입니다. $key
가 배열에 있으면 코드를 실행하고 그렇지 않으면 건너뛰도록 조건을 설정하는 것입니다.
array_key_exists()
를 사용하여 수정한 방법입니다.
foreach($cities as $key => $city){ if(array_key_exists($key, $citiesCounterArray)){ if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){
Community WikiAPI에 데이터를 보내는 경우 단순히 isset()을 사용하십시오.
if(isset($_POST['param'])){ $param = $_POST['param']; } else { #do something else }
세션으로 인한 오류인 경우 세션을 올바르게 시작했는지 확인하십시오.
Community Wiki파일을 처리할 때 적절한 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>"; ?>
참조:
Community Wiki그 이유는 사용된 변수를 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)
Community WikiPHP에서는 변수를 정의하기 위해 주먹이 필요하며 그 후에 변수를 사용할 수 있습니다.
변수가 매우 효율적으로 정의되었는지 여부를 확인할 수 있습니다!.
//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"; }
Community Wiki출처 : http:www.stackoverflow.com/questions/4261133/notice-undefined-variable-notice-undefined-index-and-notice-undefined