PHPでSQL Serverを操作する場合(特にSQLSRV拡張機能を使用)、ストアドプロシージャまたはバッチクエリステートメントによって返される状況に遭遇することがよくあります。これらの結果セットを正しく処理するには、 SQLSRV_FETCH_ARRAY()を使用するだけでは不十分な場合、 SQLSRV_NEXT_RESULT()関数を使用する必要があります。この記事では、next_result()をエレガントかつ安全に使用して、返されたすべての結果セットを繰り返す方法について説明します。
SQL Serverでは、クエリは複数の結果セットを返すことができます。たとえば、:
SELECT * FROM users;
SELECT * FROM orders;
このようなクエリを実行する場合、PHPはSQLSRV_NEXT_RESULT()を使用して、2つの結果セットを反復する必要があります。
まず、簡単な例を見てみましょう。
<?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);
?>
一部のエンタープライズアプリケーションでは、一般的に使用されるストアドプロシージャにページングを実装します。このタイプのストアドプロシージャは、多くの場合、2つの結果セットを返します。1つはデータリストであり、もう1つは総数のレコードです。
-- ページングストアドプロシージャを仮定する
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にアクセスできます。