Dans le développement réel, en particulier lorsque vous utilisez la fonction MySQL multi-Quey, vous rencontrez souvent des situations où plusieurs ensembles de résultats doivent être traités. S'il n'y a pas de méthode de traitement unifiée, appelez manuellement next_result () et store_result () à chaque fois n'est pas seulement gênant, mais aussi sujet aux erreurs.
Pour rendre le code plus élégant et robuste, nous pouvons encapsuler une fonction générale et traiter automatiquement tous les ensembles de résultats. Ensuite, je vous guiderai sur la façon de le faire étape par étape.
Lorsque vous utilisez MySQLI pour plusieurs requêtes (c'est-à-dire envoyer plusieurs instructions SQL à la fois), chaque instruction correspond à un ensemble de résultats. Utilisez Next_Result () pour déplacer l'objet MySQLI vers le jeu de résultats suivant, tandis que Store_Result () est responsable de l'extraction des données de l'ensemble de résultats actuel.
Si ces ensembles de résultats ne sont pas traités correctement, il est facile de provoquer des exceptions de connexion ou la prochaine requête échoue. Par conséquent, il est très important de nettoyer tous les ensembles de résultats de manière complète .
Voici un exemple montrant comment encapsuler une fonction qui traite tous les ensembles de résultats et renvoie un tableau de toutes les données:
<?php
/**
* Effectuer plusieurs requêtes et traiter tous les ensembles de résultats
*
* @param mysqli $mysqli MySQLiConnecter les objets
* @param string $multiQuery Plusieurs éléments à exécuterSQLDéclaration de requête(Séparer avec les demi-colons)
* @return array Renvoie un tableau contenant toutes les données de jeu de résultats
*/
function executeMultiQuery(mysqli $mysqli, string $multiQuery): array
{
$allResults = [];
if ($mysqli->multi_query($multiQuery)) {
do {
if ($result = $mysqli->store_result()) {
$data = [];
while ($row = $result->fetch_assoc()) {
$data[] = $row;
}
$allResults[] = $data;
$result->free();
} else {
// Le résultat actuel peut être sans définition de résultats,Par exempleUPDATEouINSERT
if ($mysqli->errno) {
throw new Exception("MySQLerreur:" . $mysqli->error);
}
$allResults[] = null;
}
} while ($mysqli->more_results() && $mysqli->next_result());
} else {
throw new Exception("Les requêtes multiples ont échoué:" . $mysqli->error);
}
return $allResults;
}
// Exemple d'utilisation
$mysqli = new mysqli('localhost', 'root', 'password', 'testdb');
if ($mysqli->connect_errno) {
die("Échec de la connexion:" . $mysqli->connect_error);
}
try {
$sql = "
SELECT * FROM users;
SELECT * FROM orders;
UPDATE products SET stock = stock - 1 WHERE id = 5;
";
$results = executeMultiQuery($mysqli, $sql);
// Sortir tous les résultats de la requête
foreach ($results as $index => $resultSet) {
echo "1 et 1 " . ($index + 1) . " Un ensemble de résultats:<br>";
if (is_array($resultSet)) {
foreach ($resultSet as $row) {
echo htmlspecialchars(json_encode($row)) . "<br>";
}
} else {
echo "(Aucun résultat de retour,Par exempleUPDATEouINSERTDéclaration)<br>";
}
echo "<hr>";
}
} catch (Exception $e) {
echo "发生erreur:" . $e->getMessage();
}
$mysqli->close();
?>
Libérez les ressources de définition des résultats dans le temps : il est très important d'appeler $ result-> free () pour éviter la fuite de mémoire.
Détection d'erreur : si Multi_Query () ou une certaine ronde d'erreur store_result () se produit, l'exception doit être capturée à temps pour éviter d'autres erreurs dans les opérations suivantes.
L'adaptation aux opérations sans ensembles de résultats : Mettre à jour , insérer , supprimer et d'autres instructions ne renvoie pas l'ensemble de résultats, et des jugements spéciaux sont nécessaires pendant le traitement.
En encapsulant et en traitant plusieurs ensembles de résultats, nous rendons non seulement le code plus concis, mais évitons également efficacement le problème du chaos de connexion MySQL. Si votre projet doit gérer fréquemment plusieurs requêtes SQL, il est fortement recommandé d'utiliser une méthode similaire pour l'encapsulation standardisée.
Si vous voulez en savoir plus sur l'utilisation avancée des multi-Queues, telles que les transactions combinées avec des multi-Queues, ou comment intégrer une telle encapsulation dans de grands projets, vous pouvez continuer à suivre notre site Web: https://gitbox.net ! ??