MySQL과 관련된 응용 프로그램을 개발하기 위해 PHP를 사용하여 일부 개발자는 MySQL_Info () 또는 MySQLI_INFO ()를 사용하여 배치 삽입, 업데이트 또는 삭제에 의해 영향을받는 행의 수와 같은 특정 SQL 작업을 수행 한 후 보충 정보를 얻습니다. 그러나 때로는 반환 된 데이터가 정확하지 않으며 일부 작업 직후에 거짓 또는 빈 문자열을 반환 할 수도 있습니다. 이 "신뢰할 수없는"행동으로 무슨 일이 일어나고 있습니까? 이 기사는 작업 원칙에서 시작하여 이유를 분석하며 대처 전략을 제공합니다.
mysql_info () 는 주로 특정 비 선택적 명령문을 실행 한 후 실행 상태에 대한 간단한 설명을 얻는 데 주로 사용됩니다.
$link = mysqli_connect("localhost", "user", "pass", "testdb");
mysqli_query($link, "UPDATE users SET status = 1 WHERE id < 100");
echo mysqli_info($link);
반환 내용은 다음과 같습니다.
Rows matched: 100 Changed: 100 Warnings: 0
이 출력 정보는 일치하는 행 수를 결정하는 것과 수정 된 행 수를 결정하는 등 배치 작업을 디버깅 할 때 매우 유용합니다. 그러나 이것은 기본 MySQL이 반환 한 상태 정보에 따라 다릅니다.
모든 비 선택적 운영이 정보 정보를 생성하는 것은 아니며 공식 MySQL 문서는 다음 명령문 유형만이 정보를 제공 할 수 있음을 명확하게 명시합니다.
삽입 ... 선택 ...
업데이트
삭제
로드 데이터
일반 삽입 , 교체 등과 같은 문장, 특히 하위 쿼리를 통해 데이터가 삽입되지 않는 시나리오에서는 종종 정보 캐시를 채우지 않습니다.
PHP에서 사용하는 MySQL 클라이언트 라이브러리 (libmysql 또는 mysqlnd)도 정보 획득에도 영향을 미칩니다. MySQLND (MySQL Native Driver)를 사용할 때 MySQLI_INFO ()가 반환 한 내용이 더 안정적입니다. libmysql 인 경우 일부 정보는 기록되거나 지연되지 않을 수 있습니다.
연결 (예 : 배치 프로세싱)에서 여러 SQL 문이 실행되면 MySQLI_INFO ()는 마지막 문의 정보 정보 만 반환합니다. 즉, 다음과 같습니다.
mysqli_query($link, "UPDATE table1 SET name = 'A'; UPDATE table2 SET name = 'B';");
echo mysqli_info($link); // 돌아옵니다 table2 실행 정보
이로 인해 많은 개발자들은 이전 작업이 실행되지 않았거나 영향을 미치지 않았다고 실수로 믿게 만듭니다.
MySQL 서버 버전은 정보 컨텐츠를 반환하는 데 차이가 있습니다. 예를 들어, 이전 버전은 행이 일치하거나 경고를 계산하지 않을 수 있거나 잘못된 행 수를 반환하는 버그가 있습니다. 또한 일부 성능 최적화 옵션이 활성화되면 일부 통계 로직이 건너 뛸 수 있습니다.
PHP 환경에서 MySQLND 드라이버가 활성화되어 있는지 확인하십시오. 다음과 같이 확인할 수 있습니다.
if (function_exists('mysqli_get_client_stats')) {
echo "mysqlnd 활성화";
}
MySQLND는보다 포괄적이고 표준화 된 정보 지원을 제공하며 LibMySQL보다 생산 환경에 더 권장됩니다.
여러 문 (Multi_Query)에서 정보의 반환에 의존하지 마십시오. 각 진술은 별도로 실행되어야하며 해당 정보 정보를 즉시 읽어야합니다.
mysqli_query($link, "DELETE FROM logs WHERE created_at < NOW() - INTERVAL 30 DAY");
$logInfo = mysqli_info($link);
echo "로그 청소 결과:" . $logInfo;
일부 중요한 SQL 작업의 경우 MySQL_Info ()가 반환 한 텍스트 설명에 전적으로 의존하지 않고 비즈니스 로직을 기반으로 추가 쿼리 또는 로깅을 수행하여 확인하는 것이 좋습니다. 예를 들어, 전후에 행 카운트 차이를 정리하거나 트랜잭션 제어를 통해 정확한 실행을 보장하십시오.
변경 사항은 다음과 같습니다. 0은 SQL이 성공적으로 실행되지 않았다는 것을 의미하지 않으며 데이터 자체가 변경되지 않았을 수 있습니다 (예 : 동일한 값으로 업데이트 됨). 이 시나리오는 업데이트 에서 매우 일반적이며 행이 일치 하지만 변경되는 이유를 설명합니다.
보다 효율적으로 디버깅하고 기록하기 위해 정보 정보는 다음 방법을 사용하여 로그에 기록하거나 백그라운드 인터페이스에 표시 할 수 있습니다.
$sql = "UPDATE users SET status = 0 WHERE active = 0";
mysqli_query($link, $sql);
file_put_contents("/var/log/mysql_ops.log", date('Y-m-d H:i:s') . " " . $sql . " => " . mysqli_info($link) . "\n", FILE_APPEND);
이러한 작업 레코드는 인터페이스를 통해 원격 모니터링 시스템으로 보낼 수도 있습니다.