오류 제어 연산자 @를 php코드 앞에 붙이면 생성되는 모든 오류 메시지를 무시하게 됩니다. 이는 다른 방문자에게 오류 코드를 감추게 하여 보안 유효성을 높여 줍니다. 이 연산자로 변수, 함수, include()호출, 상수 등에 붙일 수 있지만, if나 foreach와 같은 조건부 제어문에는 사용할 수 없습니다.

다음 예는 분명 코드가 잘못되어 있지만 @로 인해 오류를 표시하지 않습니다.

예제 (ex #1
 <?php
 
@mkdir('폴더경로'
);
 @
file('test file'
);

 
// 변수에 @를 붙이지 않아도 오류 코드는 표시하지 않습니다.
 
$str = @$var[$key
];

 
// test.php는 실제 존재하지 않는 파일입니다. 
 
@include('test.php'
);

 
$var = @new some_class
();
 
?>

@를 어떠한 함수에서 오류를 제거하려고 사용하였을 때, 그 함수가 존재하지 않거나, 오타를 내면 그 위치에서 아무런 이유를 알려주지 않고 스크립트가 종료되는 점에 주의가 필요합니다.

예제 (ex #2

 <?php
 
(@include('test.php')) or die(" 실제 존재하지 않는 파일입니다."
);
 
// 결과: 실제 존재하지 않는 파일입니다.

 
$my_file = @file ('non_existent_file') or die ("파일을 오픈할 수 없습니다."
);
 
// 결과: 파일을 오픈할 수 없습니다.

 
@mkdir() or die('폴더 경로를 지정하지 않았습니다.'
);
 
// 결과: 폴더 경로를 지정하지 않았습니다.

 // 변수에 @를 사용한 예입니다.
 
if( @$var === $something 
){ }
 if( @
$_SERVER'HTTP_REFERER' ] !== '/www/some/path/file' 
) { }
 if( @
$_POST'checkbox' ] === 'yes' 
) { }
 
?>


$php_errormsg 오류 메시지 변수

@로 인해 만들어진 모든 오류 메시지는 $php_errormsg 변수에 저장됩니다. 이 변수는 각 오류마다 덮여 씌워지므로, 배열로 만들거나, 즉시 보여줘야 합니다.

예제 (ex #3

 <?php
 $my_file 
= @file ('non_existent_file'
) or
    die (
"Failed opening file: error was '$php_errormsg'"
);
 
/*
 결과:
 Failed opening file: error was 'file(non_existent_file) [function.file]: failed to open stream: No such 
file or directory'
 */

 
(@include("no file")) or die("Could not find file.php!"); 
// 결과: Could not find file.php!
 
?>


$php_errormsg 변수를 사용하기 위해서 php.ini의 track_errors를 On했을 때만 동작합니다.

 


다음은 모든 에러 메시지를 배열로 저장한 예입니다.

예제 (ex #4
 <?php
 
// 에러를 배열로 담기 위해 초기화합니다.
 
$errormsg 
= array();


 
$value = @$take
;
 
$errormsg[] = "파일명: ".__FILE__.", 소스: ".__LINE__."라인, 에러코드: ".$php_errormsg."\n"
;

 function 
test
(){
       
mkdir
();
 }

 @
test
();
 
$errormsg[] = "파일명: ".__FILE__.", 소스: ".__LINE__."라인, 에러코드: ".$php_errormsg."\n"
;

 @
strpos
();
 
$errormsg[] = "파일명: ".__FILE__.", 소스: ".__LINE__."라인, 에러코드: ".$php_errormsg."\n"
;

 @
file ('non_existent_file'
);
 
$errormsg[] = "파일명: ".__FILE__.", 소스: ".__LINE__."라인, 에러코드: ".$php_errormsg."\n"
;

 @
mkdir('폴더경로'
);
 
$errormsg[] = "파일명: ".__FILE__.", 소스: ".__LINE__."라인, 에러코드: ".$php_errormsg."\n"
;

 
$my_file = @file ('non_existent_file'
);
 
$errormsg[] = "파일명: ".__FILE__.", 소스: ".__LINE__."라인, 에러코드: ".$php_errormsg."\n"
;


 
print_r($errormsg
);



  
/*
 결과:
 Array
 (
    [0] => 파일명: C:\Server\public_html\test.php, 소스: 7라인, 
에러코드: Undefined variable: take
    [1] => 파일명: C:\Server\public_html\test.php, 소스: 14라인, 에러코드: Undefined variable: take
    [2] => 파일명: C:\Server\public_html\test.php, 소스: 17라인, 에러코드: Wrong par ameter count for strpos()
    [3] => 파일명: C:\Server\public_html\test.php, 소스: 20라인, 에러코드: file (non_existent_file) [<a href='function.file'>function.file
</a>]: failed to open stream: No such file or directory
    [4] => 파일명: C:\Server\public_html\test.php, 소스: 23라인, 에러
코드: mkdir() [<a href='function.mkdir'> function.mkdir</a>]: File 
exists
    [5] => 파일명: C:\Server\public_html\test.php, 소스: 26라인, 에러코드: 
file (non_existent_file) [<a href='function.file'>function.file</a>]: 
failed to open
 stream: No such file or directory
 }
 */
 
?>


◀ PREV : [1] : [2] : [3] : [4] : [5] : [6] : [7] : [8] : [9] : [10] : NEXT ▶