데이터베이스 작업에 PHP를 사용하는 경우 다음 _result () 함수는 종종 저장 프로 시저 또는 배치 SQL 쿼리를 실행할 때 다중 저렴한 세트를 처리하는 데 사용됩니다. 그러나 안전 모드를 켜거나 데이터베이스 상호 작용의 보안에 대한 요구 사항이 더 높을 때는 더 신중하게 사용해야합니다.
이 기사는 현실에서 시작하여 Next_result () 의 일반적인 사용법을 안내하고 안전 모드로 모범 사례를 결합하여 다중 자극 세트를보다 안전하고 안정적으로 처리하는 방법을 가르쳐줍니다.
next_result () 는 MySQLI 확장에서 현재 결과 세트를 건너 뛰고 다음 결과 세트로 이동하는 함수입니다. 예를 들어 여러 문의 쿼리를 실행할 때 다음과 같습니다.
CALL getUserData(); SELECT NOW();
다음 결과 세트에 액세스하기 위해 첫 번째 결과 세트를 처리 한 후 Next_Result ()를 호출해야합니다.
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->connect_error) {
die("연결이 실패했습니다: " . $mysqli->connect_error);
}
$query = "CALL multi_result_procedure()";
if ($mysqli->multi_query($query)) {
do {
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
print_r($row);
}
$result->free();
}
} while ($mysqli->more_results() && $mysqli->next_result());
}
위의 코드는 여러 결과 세트를 정상적으로 처리 할 수 있지만 입력 확인 또는 오류 처리 향상을 수행하지는 않습니다.
"안전 모드"는 애플리케이션 계층 자체에서 구현 한 보안 시스템이거나 운영 환경의 특정 기능 및 동작에 대한 제한이 될 수 있습니다. 어떤 것이 있든 다음 요점은 다음에주의를 기울일 가치가 있습니다.
SQL의 직접 스 플라이 싱은 주입 공격에 취약하며 전처리 진술을 사용해야합니다.
$stmt = $mysqli->prepare("CALL getUserData(?)");
$userId = 5;
$stmt->bind_param("i", $userId);
$stmt->execute();
do {
if ($result = $stmt->get_result()) {
while ($row = $result->fetch_assoc()) {
print_r($row);
}
$result->free();
}
} while ($stmt->more_results() && $stmt->next_result());
결과 세트의 과도한 자원 소비로 인해 서비스 예외를 피하십시오.
$maxResults = 5;
$counter = 0;
do {
if ($result = $stmt->get_result()) {
while ($row = $result->fetch_assoc()) {
print_r($row);
}
$result->free();
}
$counter++;
if ($counter >= $maxResults) {
error_log("결과 세트는 최대 처리 수를 초과합니다,강제 서스펜션");
break;
}
} while ($stmt->more_results() && $stmt->next_result());
MySQLI_OPTIONS 및 로그 오류 로그를 통해 연결 시간 초과를 설정하여 차단 문제를 방지합니다.
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli();
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5);
$mysqli->real_connect("localhost", "username", "password", "database");
try {
// 실행 명령문 논리
} catch (mysqli_sql_exception $e) {
error_log("데이터베이스 오류: " . $e->getMessage());
}
Gitbox.net 에서 제공 한 개발 환경 또는 원격 데이터베이스에 연결할 때 사용 된 데이터베이스 계정에 대상 저장 프로 시저를 실행할 수있는 최소 허가 만 있는지 확인해야합니다. 예를 들어:
GRANT EXECUTE ON PROCEDURE getUserData TO 'app_user'@'gitbox.net';
다음 _result ()를 사용하여 여러 결과 세트를 처리 할 때는 편의를 위해 표면적이지만 잠재적 인 성능 문제와 보안 위험이 숨겨져 있습니다. 안전 모델과 함께 우리는 다음을해야합니다.
전처리 진술을 사용하십시오.
결과 세트 수를 제어합니다.
예외 및 시간 초과 처리를 추가하십시오.
최소 권한의 원칙에 따라 계정을 구성하십시오.
이를 통해 응용 프로그램이 여전히 높은 동시성 및 높은 보안 요구 사항 하에서 안정적으로 작동 할 수 있습니다.