데이터베이스 오류 처리는 PHP 응용 프로그램 개발의 피할 수없는 부분입니다. 문제 해결 및 디버그 문제를 개선하려면 데이터베이스 오류를 적시에 기록해야합니다. PHP의 MySQLI Extension은 매우 실용적인 속성을 제공하여 MySQLI :: $ 오류를 제공하여 데이터베이스 연결에서 마지막 오류 메시지를 얻을 수 있습니다. PHP의 내장 Error_Log () 함수와 결합하여 로그 파일에 오류 정보를 녹화하여 개발자가 생산 환경에서 문제를 추적 할 수 있도록 도와줍니다.
이 기사는 MySQLI :: $ ERROR 및 ERROR_LOG ()를 사용하여 MySQL 데이터베이스에서 오류 정보를 기록하고 지정된 파일의 오류 로그를 저장하여 개발자가 적시에 문제를 발견하고 수정할 수 있도록하는 방법을 소개합니다.
MySQLI Extension을 사용하여 MySQL 데이터베이스에 연결할 때 SQL 실행 오류가 발생하면 MySQLI :: $ 오류 속성을 통해 오류 메시지가 제공됩니다. 이 속성은 이전 데이터베이스 작업의 오류 메시지 (예 : 쿼리, 업데이트, 삽입 등)를 반환합니다. mysqli :: $ error는 가장 최근의 조작의 오류 메시지 만 리턴하고 오류가 없으면 빈 문자열을 반환합니다.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-string">"localhost"</span></span><span>, </span><span><span class="hljs-string">"root"</span></span><span>, </span><span><span class="hljs-string">"password"</span></span><span>, </span><span><span class="hljs-string">"test_db"</span></span><span>);
</span><span><span class="hljs-comment">// 연결이 성공했는지 확인하십시오</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"연결이 실패했습니다: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error);
}
</span><span><span class="hljs-comment">// 의도적 인 오류를 실행하십시오 SQL 질문</span></span><span>
</span><span><span class="hljs-variable">$query</span></span><span> = </span><span><span class="hljs-string">"SELECT * FROM non_existing_table"</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-variable">$query</span></span><span>);
</span><span><span class="hljs-comment">// 检查질문是否执行成功</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$result</span></span><span>) {
</span><span><span class="hljs-comment">// 오류 메시지를 가져오고 출력합니다</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"오류 메시지: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>->error;
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
위의 코드에서 존재하지 않는 테이블에 대한 쿼리를 할 때 $ mysqli-> 오류는 "table 'test_db.non_existing_table'과 같은 mysql 오류 메시지를 반환합니다.
Error_Log () 함수는 로그 파일에 오류 정보를 작성하거나 지정된 오류 로그 처리기로 보내기 위해 PHP가 제공하는 매우 편리한 도구입니다. mysqli :: $ error and error_log ()를 결합하여 향후 문제 해결 및 분석을 위해 데이터베이스 오류를 로그 파일에 녹화 할 수 있습니다.
error_log () 함수의 기본 사용량은 다음과 같습니다.
<span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$message</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$message_type</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$destination</span></span><span> = ?, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$extra_headers</span></span><span> = ?)
</span></span>
$ 메시지 : 기록 할 오류 메시지.
$ message_type : 오류 로그 유형. 0은 PHP에 기록 된 오류 로그 파일을 나타내고, 1은 전자 메일 전송을 나타내고, 2는 파일 전송을 나타냅니다.
$ 대상 : $ message_type 가 1 또는 2 인 경우 수신 메일에 주소 또는 로그 파일 경로를 지정하십시오.
다음은 mysqli :: $ error 에서 로그 파일에 오류 정보를 작성하는 방법을 보여주는 예입니다.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-string">"localhost"</span></span><span>, </span><span><span class="hljs-string">"root"</span></span><span>, </span><span><span class="hljs-string">"password"</span></span><span>, </span><span><span class="hljs-string">"test_db"</span></span><span>);
</span><span><span class="hljs-comment">// 연결이 성공했는지 확인하십시오</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"연결이 실패했습니다: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>->connect_error);
}
</span><span><span class="hljs-comment">// 의도적 인 오류를 실행하십시오 SQL 질문</span></span><span>
</span><span><span class="hljs-variable">$query</span></span><span> = </span><span><span class="hljs-string">"SELECT * FROM non_existing_table"</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-variable">$query</span></span><span>);
</span><span><span class="hljs-comment">// 如果질문失败,로그 오류 로그 파일에 오류가 발생합니다</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$result</span></span><span>) {
</span><span><span class="hljs-variable">$error_message</span></span><span> = </span><span><span class="hljs-string">"MySQL 실수: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>->error . </span><span><span class="hljs-string">" | 질문: "</span></span><span> . </span><span><span class="hljs-variable">$query</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-variable">$error_message</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">"/var/log/php_error.log"</span></span><span>);
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
이 코드에서 SQL 쿼리 오류가 발생하면 mysqli :: $ 오류 의 오류 메시지가 /var/log/php_error.log 파일에 SQL 쿼리 문과 함께 기록됩니다. Error_Log () 의 첫 번째 매개 변수는 오류 메시지이고 두 번째 매개 변수는 3 으로 설정되어 오류가 지정된 로그 파일에 기록되었음을 나타냅니다.
PHP가 로그 파일에 오류를 쓸 수 있도록 로그 파일에는 적절한 쓰기 권한이 있어야합니다. Linux를 예로 들어, 로그 파일 자체의 디렉토리와 파일을 PHP 프로세스에 작성할 수 있는지 확인하십시오.
<span><span>sudo </span><span><span class="hljs-built_in">chmod</span></span><span> 777 /var/log/php_error.log
</span></span>
또는 글로벌 쓰기 가능 권한을 설정하지 않으려면 파일이 속한 사용자 및 사용자 그룹을 조정하여 PHP 프로세스를 쓰기 권한을 부여 할 수도 있습니다.
<span><span>sudo </span><span><span class="hljs-built_in">chown</span></span><span> www-data:www-data /var/log/php_error.log
</span></span>
로그 파일에 로깅 오류가 매우 유용하지만 로그가 기록되는 방식을 더욱 최적화 할 수 있습니다. 몇 가지 최적화 제안은 다음과 같습니다.
오류 로그에 타임 스탬프를 추가하면 오류가 발생할 때 쉽게 추적 할 수 있습니다.
<span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$result</span></span><span>) {
</span><span><span class="hljs-variable">$error_message</span></span><span> = </span><span><span class="hljs-string">"["</span></span><span> . </span><span><span class="hljs-title function_ invoke__">date</span></span><span>(</span><span><span class="hljs-string">'Y-m-d H:i:s'</span></span><span>) . </span><span><span class="hljs-string">"] MySQL 실수: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>->error . </span><span><span class="hljs-string">" | 질문: "</span></span><span> . </span><span><span class="hljs-variable">$query</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-variable">$error_message</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">"/var/log/php_error.log"</span></span><span>);
}
</span></span>
애플리케이션이 다중 사용자 시스템 인 경우 클라이언트의 IP 주소를 녹화하고 현재 사용자의 ID는 문제를 포지셔닝하는 데 매우 도움이됩니다.
<span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$result</span></span><span>) {
</span><span><span class="hljs-variable">$error_message</span></span><span> = </span><span><span class="hljs-string">"["</span></span><span> . </span><span><span class="hljs-title function_ invoke__">date</span></span><span>(</span><span><span class="hljs-string">'Y-m-d H:i:s'</span></span><span>) . </span><span><span class="hljs-string">"] IP: "</span></span><span> . </span><span><span class="hljs-variable">$_SERVER</span></span><span>[</span><span><span class="hljs-string">'REMOTE_ADDR'</span></span><span>] . </span><span><span class="hljs-string">" 사용자ID: "</span></span><span> . </span><span><span class="hljs-variable">$_SESSION</span></span><span>[</span><span><span class="hljs-string">'user_id'</span></span><span>] . </span><span><span class="hljs-string">" MySQL 실수: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>->error . </span><span><span class="hljs-string">" | 질문: "</span></span><span> . </span><span><span class="hljs-variable">$query</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-variable">$error_message</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">"/var/log/php_error.log"</span></span><span>);
}
</span></span>
로그 파일이 매우 커진 경우 특정 유형의 오류 만 로그인하거나 Logrotate 와 같은 로그 회전 도구를 사용하여 로그 파일을 관리하는 것을 고려하십시오.
mysqli :: $ error 및 error_log ()를 결합하여 파일 로그에 데이터베이스 오류를 효율적으로 로그인 할 수 있습니다. 이는 개발 프로세스 중에 문제를 신속하게 찾는 데 도움이 될뿐만 아니라 개발자가 생산 환경에서 적시에 잠재적 인 데이터베이스 오류를 감지하는 데 도움이됩니다. 타임 스탬프, 사용자 정보 및 클라이언트 IP를 합리적으로 사용함으로써 로그의 추적 성과 실용성을 더욱 향상시킬 수 있습니다.
보안 위험을 피하기 위해 생산 환경에 배포 할 때 오류 로그 파일의 권한이 올바르게 설정되어 있는지 확인하십시오.
관련 태그:
mysqli