2009-08-31 6 views
4

나는이 간단한 문제가 있다면 그래서 사과 PHP에 새로운 해요 ...

나는 한 서버에서 다른 서버로 PHP 사이트를 이동하고있다. 새로운 서버는 IIS 7.0, PHP 5.2.1이며, 열린 태그가 "On"으로 바뀌 었습니다. 원래 서버가 어떻게 설치되었는지는 모르겠습니다. 이 페이지를 실행하면 다음과 같은 오류가 항상 표시됩니다

<? 
ob_start(); 
session_start(); 

if($_GET['confirm'] == 13 || $_GET['confirm'] == 14 || $_GET['confirm'] == 15 || $_GET['confirm'] == 16) 
{ 
    include("test/query/test_query.php"); 
} 
?> 

:

PHP주의를 : 정의되지 않은 인덱스

다음은 페이지 중 하나에 코드의 첫 번째 섹션은 다음과 같습니다 온라인 6 [파일 위치] .php에서 확인하십시오.

또한 사용자는 홈 페이지 (표준 HTML 페이지)에서 리디렉션 됨으로써이 페이지에 액세스합니다. . 제대로에 탐색 전체 URL은 다음과 같다 : 오류가 발생하는 이유

http://www.[site].com/test.php#login

... 나는 이해합니다. 내가 이해할 수없는 것은이 코드가 원래 서버에서했던 것처럼 작동 할 수 있다는 것입니다. 구성 설정이 누락 되었습니까?

* 동일한 문제가 사이트 전체의 수십 곳에서 발생합니다. 이는 문제의 한 특정 사건 일뿐입니다.

+0

이전 서버에서 모든 파일을 복사했는지 다시 확인합니다. 또한 복사해야 할 데이터베이스가 있습니까? –

답변

27

새 서버는 error_reporting이 E_ALL로 설정되어 있습니다. 당신이보고있는 것은 오류가 아니라 고지 사항입니다. 시도하십시오 :

error_reporting(E_ALL^E_NOTICE) 

오류보고를 E_ALL로 설정하면 설정되지 않은 배열 구성원에 액세스하면 오류가 발생합니다. 당신이 실제로 $_GET['confirm']에 액세스하기 전에 호출 (는 isset하는)를 추가하여을

if(isset($_GET['confirm']) && ($_GET['confirm'] == 13 || $_GET['confirm'] == 14 || $_GET['confirm'] == 15 || $_GET['confirm'] == 16)) { 

: 당신이 $ _GET을 확인하기 전에, 당신의 오류보고 수준을 낮출하지 않으려면 [ 'VAR는']에 코드를 변경 설정되지 않은 배열 구성원에 액세스하고 있지 않은지 확인합니다. 인덱스의 $의 _GET [ '확인은']가 없기 때문에

+4

+1. OP는 코딩 방법이 엉성함. –

3

를 (URL이 ?confirm=... 또는 ?something...&confirm=...에 끝나는 경우 $_GET['confirm'] 만 설정됩니다), PHP는 정의되지 않은 인덱스 찾고 통지를 던졌습니다. 새 서버에 php.ini 또는 pageloads에서 실행되는 일부 구성 파일 또는 부트 스트랩의 error_reporting 어딘가에 E_NOTICE 플래그가 설정되어있어 알림이 표시되고 있습니다.

PHP 설명서, E_NOTICE : "런타임 알림 : 스크립트에 오류가 있음을 나타낼 수 있지만 스크립트를 실행하는 정상적인 과정에서 발생할 수 있음을 나타냅니다."

걱정하지 않으려는 알림을 끄거나 문제가있는 곳을 추적하는 데 사용할 수 있습니다.당신이 게시 코드에 대한

, 쉽게 수정에는 '확인'인덱스가없는 경우 조건을 평가에서

if(isset($_GET['confirm']) && <list of OR conditions>) 

에 그 방법의 PHP의 보석금을 조건을 변경하는 것입니다.

if (isset($_GET['confirm']) && ($_GET['confirm'] >= 13 && $_GET['confirm'] <= 16)) 

을 그리고 나는 완전히 조쉬의 제안에 동의 :

+0

+1 설명서에 E_NOTICE가 무엇인지에 대한 설명을 추가하십시오. 그러나 (와)에서 <잃어버린 조건>을 동봉해야한다는 것을 기억하십시오. 왜냐하면 || &&!보다 우선 순위가 낮습니다. – Josh

6

나는 독서에 대한 코드를 최적화하는 것이 좋습니다. confirm 쿼리 문자열 변수가 설정 될 것 같지 않기 때문이다

+0

나는 차라리 switch ... case를 제안하고 싶지만 이것은 원래 스크립트보다 낫다. –

2

, 당신은 그것을 좋아 확인할 수 있습니다

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

var_dump($_GET['confirm']); 
3

isset() 유용한 기능입니다. 변수가 있으면 true를 반환하고 그렇지 않으면 false를 반환합니다. 일반적으로 사용자는 $_GET 또는 $_POST과 같은 superglobal과 함께 사이트의 다른 페이지에서 전송되는지 여부를 확인합니다. 이렇게하면 사용자의 출처와 함께 태그 지정되는 데이터에 따라 다양한 작업을 만들 수 있습니다 . 또한 OP와 같이 아직 정의하지 않은 변수를 사용하려고 할 때 발생하는 오류를 방지합니다. 따라서 두 개의 다른 .php 파일을 작성하고 사용자를 잘못된 페이지로 보내는 것에 대해 걱정할 필요없이 한 페이지에서 모두 수행 할 수 있습니다.

Jay, 이러한 호출 중 일부는 사용에주의해야합니다. <?php<?보다 작동 할 가능성이 큽니다. session_start()가 브라우저에 설정된 첫 번째 것이거나 헤더 문제를 일으킬 수 있다고 들었습니다. 그리고 예, 변수를 사용하기 전에 변수를 선언해야합니다. [file].php?confirm=[some number]을 URL로 입력하지 않으면 페이지를 수정하여 휴식을 허용하지 않으면 페이지가 중단됩니다.

관련 문제