Lors du fonctionnement de SQL Server dans PHP (en particulier en utilisant des extensions SQLSRV ), nous rencontrons souvent des situations renvoyées par des procédures stockées ou des instructions de requête par lots. Pour gérer correctement ces résultats de résultats, l'utilisation de SQLSRV_Fetch_Array () ne suffit pas, nous devons également utiliser la fonction SQLSRV_NEXT_RESULT () avec. Cet article expliquera comment utiliser Next_Result () élégamment et en toute sécurité pour itérer à travers tous les ensembles de résultats retournés.
Dans SQL Server, une requête peut renvoyer plusieurs ensembles de résultats, par exemple:
SELECT * FROM users;
SELECT * FROM orders;
Lors de l'exécution d'une telle requête, PHP doit utiliser SQLSRV_NEXT_RESULT () pour itérer les deux ensembles de résultats.
Regardons d'abord un exemple simple:
<?php
$serverName = "localhost";
$connectionOptions = array(
"Database" => "MyDatabase",
"Uid" => "myuser",
"PWD" => "mypassword"
);
// Établir une connexion
$conn = sqlsrv_connect($serverName, $connectionOptions);
if ($conn === false) {
die(print_r(sqlsrv_errors(), true));
}
// Exécuter plusieurs ensembles de résultats SQL Requête
$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 "Gérer le {$resultIndex} Un ensemble de résultats:\n";
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
print_r($row);
}
$resultIndex++;
} while (sqlsrv_next_result($stmt));
// Libérer les ressources
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>
Dans certaines applications d'entreprise, les procédures stockées couramment utilisées pour implémenter la pagination, et ce type de procédures stockées renvoie souvent deux ensembles de résultats: l'un est une liste de données et l'autre est un nombre total d'enregistrements:
-- En supposant la procédure stockée de la pagination
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
Lorsque nous le traitons en PHP, nous pouvons le faire:
$sql = "{CALL GetPagedUsers()}";
$stmt = sqlsrv_query($conn, $sql);
if ($stmt === false) {
die(print_r(sqlsrv_errors(), true));
}
// 第一Un ensemble de résultats:Liste de données
$users = [];
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
$users[] = $row;
}
// 移动到下一Un ensemble de résultats
if (sqlsrv_next_result($stmt)) {
// 第二Un ensemble de résultats:Records totaux
if ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
$totalCount = $row['TotalCount'];
}
}
print_r([
'users' => $users,
'totalCount' => $totalCount,
]);
Version des ressources : assurez-vous d'appeler SQLSRV_FREE_STMT () à la fin pour publier la ressource de l'instruction.
L'ordre des ensembles de résultats doit être clair : l'ordre de plusieurs ensembles de résultats est entièrement déterminé par l'ordre de SQL.
Empêcher les ensembles de résultats vides : après avoir appelé SQLSRV_NEXT_RESULT (), vous devez vérifier si de nouvelles données ont été renvoyées.
En utilisant rationnellement SQLSRV_NEXT_RESULT () , nous pouvons traiter gracieusement plusieurs ensembles de résultats renvoyés par SQL Server, jouant un rôle énorme dans les scénarios commerciaux tels que la pagination, les statistiques et les requêtes de fusion. N'oubliez pas que lorsque vous appelez de telles interfaces dans un environnement de production, vous devez faire un bon travail de gestion des erreurs et de libération des ressources pour assurer le fonctionnement stable du système.
Pour en savoir plus sur la façon dont SQL Server et PHP sont combinés, vous pouvez accéder à la documentation officielle ou à notre plateforme de didacticiel: https://gitbox.net/php-sqlserver .