Beim Betrieb von SQL -Server in PHP (insbesondere unter Verwendung von SQLSRV -Erweiterungen) stoßen wir häufig auf Situationen, die durch gespeicherte Prozeduren oder Batch -Abfrageanweisungen zurückgegeben werden. Um diese Ergebnissätze korrekt zu verarbeiten, müssen wir mit sqlsrv_fetch_array () nicht ausreichen, sondern auch die Funktion SQLSRV_NEXT_RESULT () damit verwenden. In diesem Artikel wird erläutert, wie man next_result () elegant und sicher verwendet, um alle zurückgegebenen Ergebnissätze zu iterieren.
In SQL Server kann beispielsweise eine Abfrage mehrere Ergebnissätze zurückgeben:
SELECT * FROM users;
SELECT * FROM orders;
Bei der Ausführung einer solchen Abfrage muss PHP SQLSRV_NEXT_RESULT () verwenden, um die beiden Ergebnissätze zu iterieren.
Schauen wir uns zuerst ein einfaches Beispiel an:
<?php
$serverName = "localhost";
$connectionOptions = array(
"Database" => "MyDatabase",
"Uid" => "myuser",
"PWD" => "mypassword"
);
// Eine Verbindung herstellen
$conn = sqlsrv_connect($serverName, $connectionOptions);
if ($conn === false) {
die(print_r(sqlsrv_errors(), true));
}
// Führen Sie mehrere Ergebnissätze aus SQL Abfrage
$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 "Umgehen {$resultIndex} Ein Ergebnissatz:\n";
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
print_r($row);
}
$resultIndex++;
} while (sqlsrv_next_result($stmt));
// Ressourcen frei machen
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
In einigen Unternehmensanwendungen werden häufig verwendete gespeicherte Verfahren zur Implementierung von Paging und diese Art von gespeicherten Verfahren häufig zwei Ergebnissätze zurückgegeben: Eine ist eine Datenliste und die andere ist eine Gesamtzahl der Datensätze:
-- Vorausgesetzt, ein Paging -Speichern vor dem Verfahren
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
Wenn wir es in PHP verarbeiten, können wir dies tun:
$sql = "{CALL GetPagedUsers()}";
$stmt = sqlsrv_query($conn, $sql);
if ($stmt === false) {
die(print_r(sqlsrv_errors(), true));
}
// 第一Ein Ergebnissatz:Datenliste
$users = [];
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
$users[] = $row;
}
// 移动到下一Ein Ergebnissatz
if (sqlsrv_next_result($stmt)) {
// 第二Ein Ergebnissatz:Gesamtdatensätze
if ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
$totalCount = $row['TotalCount'];
}
}
print_r([
'users' => $users,
'totalCount' => $totalCount,
]);
Ressourcenveröffentlichung : Rufen Sie am Ende sqlsrv_free_stmt () an, um die Anweisungsressource zu veröffentlichen.
Die Reihenfolge der Ergebnissätze sollte klar sein : Die Reihenfolge mehrerer Ergebnissätze wird vollständig in der Reihenfolge von SQL bestimmt.
Verhindern Sie leere Ergebnissätze : Nach dem Aufrufen von SQLSRV_NEXT_RESULT () müssen Sie überprüfen, ob neue Daten zurückgegeben wurden.
Indem wir sQLSRV_NEXT_RESULT () rational unter Verwendung von SQLSRV_NEXT_RESULT () verarbeiten können, können wir mehrere von SQL Server zurückgegebene Ergebnissätze verarbeiten und eine große Rolle in Geschäftsszenarien wie Paging, Statistiken und Zusammenführungen spielen. Denken Sie daran, dass Sie bei der Aufrufen solcher Schnittstellen in einer Produktionsumgebung eine gute Aufgabe des Fehlerbehandlung und der Ressourcenfreigabe erledigen müssen, um den stabilen Betrieb des Systems sicherzustellen.
Um mehr darüber zu erfahren, wie SQL Server und PHP kombiniert werden, können Sie auf die offizielle Dokumentation oder unsere Tutorial-Plattform zugreifen: https://gitbox.net/php-sqlserver .