PHP에서 SQL Server를 작동 할 때 (특히 SQLSRV 확장을 사용하여) 저장된 절차 또는 배치 쿼리 문으로 반환되는 상황이 종종 발생합니다. 이러한 결과 세트를 올바르게 처리하려면 SQLSRV_FETCH_ARRAY ()를 사용하면 충분하지 않으므로 SQLSRV_NEXT_RESULT () 기능을 사용해야합니다. 이 기사에서는 다음 반환 된 결과 세트를 통해 Next_result ()를 우아하고 안전하게 사용하는 방법을 설명합니다.
SQL Server에서 쿼리는 여러 결과 세트를 반환 할 수 있습니다.
SELECT * FROM users;
SELECT * FROM orders;
이러한 쿼리를 실행할 때 PHP는 SQLSRV_NEXT_RESULT ()를 사용하여 두 결과 세트를 반복해야합니다.
먼저 간단한 예를 살펴 보겠습니다.
<?php
$serverName = "localhost";
$connectionOptions = array(
"Database" => "MyDatabase",
"Uid" => "myuser",
"PWD" => "mypassword"
);
// 연결을 설정하십시오
$conn = sqlsrv_connect($serverName, $connectionOptions);
if ($conn === false) {
die(print_r(sqlsrv_errors(), true));
}
// 여러 결과 세트를 실행합니다 SQL 질문
$sql = "SELECT * FROM users; SELECT * FROM orders;";
$stmt = sqlsrv_query($conn, $sql);
if ($stmt === false) {
die(print_r(sqlsrv_errors(), true));
}
$resultIndex = 1;
do {
echo "처리 {$resultIndex} 결과 세트:\n";
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
print_r($row);
}
$resultIndex++;
} while (sqlsrv_next_result($stmt));
// 리소스를 자유롭게합니다
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
일부 엔터프라이즈 응용 프로그램에서 일반적으로 사용되는 저장된 절차는 페이징을 구현하고,이 유형의 저장된 절차는 종종 두 가지 결과 세트를 반환합니다. 하나는 데이터 목록이고 다른 하나는 총 레코드 수입니다.
-- 페이징 저장 절차를 가정합니다
CREATE PROCEDURE GetPagedUsers
AS
BEGIN
SELECT * FROM users ORDER BY id OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY;
SELECT COUNT(*) AS TotalCount FROM users;
END
PHP에서 처리하면 다음을 수행 할 수 있습니다.
$sql = "{CALL GetPagedUsers()}";
$stmt = sqlsrv_query($conn, $sql);
if ($stmt === false) {
die(print_r(sqlsrv_errors(), true));
}
// 第一결과 세트:데이터 목록
$users = [];
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
$users[] = $row;
}
// 移动到下一결과 세트
if (sqlsrv_next_result($stmt)) {
// 第二결과 세트:총 기록
if ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
$totalCount = $row['TotalCount'];
}
}
print_r([
'users' => $users,
'totalCount' => $totalCount,
]);
리소스 릴리스 : 끝에 SQLSRV_FREE_STMT () 에게 전화하여 문자 자원을 해제하십시오.
결과 세트의 순서는 명확해야합니다 . 여러 결과 세트의 순서는 전적으로 SQL의 순서에 의해 결정됩니다.
빈 결과를 방지 : sqlsrv_next_result ()를 호출 한 후 새 데이터가 반환되었는지 확인해야합니다.
SQLSRV_NEXT_RESULT ()를 합리적으로 사용하면 SQL Server에서 반환 한 여러 결과 세트를 우아하게 처리 할 수 있으며 페이징, 통계 및 병합 쿼리와 같은 비즈니스 시나리오에서 큰 역할을 할 수 있습니다. 생산 환경에서 이러한 인터페이스를 호출 할 때 시스템의 안정적인 작동을 보장하기 위해 오류 처리 및 리소스 릴리스를 잘 수행해야합니다.
SQL Server 및 PHP가 결합되는 방법에 대한 자세한 내용은 공식 문서 또는 튜토리얼 플랫폼 ( https://gitbox.net/php-sqlserver )에 액세스 할 수 있습니다.