Au cours de l'interaction entre PHP et MySQL, les développeurs entrent souvent en contact avec les fonctions multi_query () et next_result () . Cependant, de nombreux débutants ont tendance à confondre les utilisations de ces deux fonctions lors de la lecture de documents ou de l'essayer de les développer, et même à tort que Next_Result () peut être utilisé pour exécuter plusieurs instructions SQL seules.
Cet article explorera en profondeur les responsabilités, les mécanismes de travail, l'utilisation de ces deux fonctions en PHP, et pourquoi next_result () ne peut pas remplacer Multi_Query () .
Multi_Query () est une fonction dans l'extension PHP MySQLI . Sa fonction est d'exécuter plusieurs instructions SQL à la fois . Ces instructions SQL doivent être séparées par des demi-colons ( ; ) pour former une longue chaîne SQL.
$mysqli = new mysqli("localhost", "user", "password", "database");
$sql = "SELECT * FROM users; SELECT * FROM orders;";
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
print_r($row);
}
$result->free();
}
} while ($mysqli->next_result());
} else {
echo "L'exécution a échoué: " . $mysqli->error;
}
Dans cet exemple, Multi_Query () démarre un flux de traitement de l'ensemble multi-résults, puis accède aux résultats de chaque instruction à son tour via next_result () .
La responsabilité de next_result () est de pousser Mysqli vers le jeu de résultats suivant . Il n'exécute aucun SQL, mais se déplace simplement du résultat qui a été exécuté par Multi_Query () au résultat de retour de l'instruction suivante.
Autrement dit, next_result () lui-même n'exécute pas SQL, il est juste de traverser .
Sans l'appel avant l'appel de multi_query () , next_result () n'a rien à faire. Le contexte dont il dépend est "plusieurs instructions ont été exécutées".
C'est comme demander "pourquoi ne pouvez-vous pas allumer le téléviseur avec une télécommande sans brancher l'alimentation?" Parce que Next_Result () fait partie du flux de processus, pas le point de départ de l'exécution de l'action.
Responsabilités différentes
Multi_Query () est l'exécuteur testamentaire.
Next_result () est un itérateur.
Dépendances
Sans le contexte de Multi_Query () , appeler next_result () reviendra false .
Next_result () n'a du sens qu'après que Multi_Query () a été exécuté avec succès.
Gestion des erreurs et gestion de l'État
Multi_Query () est responsable de l'exécution et de l'initialisation de toutes les instructions. Si une erreur se produit, elle peut être interrompue immédiatement.
Next_result () est l'ensemble de résultats qui ne réessaye pas ou ne réexécute pas SQL.
Scénario: exécutez plusieurs instructions d'initialisation, telles que la création de table et l'insertion de données
$sql = "
CREATE TABLE IF NOT EXISTS logs (id INT AUTO_INCREMENT PRIMARY KEY, message TEXT);
INSERT INTO logs (message) VALUES ('Initialisation avec succès');
SELECT * FROM logs;
";
$mysqli = new mysqli("localhost", "user", "password", "database");
if ($mysqli->multi_query($sql)) {
do {
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_assoc()) {
echo $row['message'] . "\n";
}
$result->free();
}
} while ($mysqli->next_result());
} else {
echo "Une erreur d'exécution: " . $mysqli->error;
}
Vous pouvez appliquer cette application dans des scénarios tels que les scripts de déploiement, l'initialisation par lots des données, etc.
Dans la programmation de la base de données PHP, Multi_Query () et Next_Result () sont une paire d'outils utilisés ensemble. Le premier est responsable de l'envoi de plusieurs instructions à la base de données pour l'exécution, tandis que le second est responsable de la récupération des résultats d'exécution de chaque instruction.
Essayer d'utiliser next_result () pour exécuter des instructions SQL équivaut à "activer uniquement le téléviseur avec la télécommande mais non branché", il ne peut pas terminer la tâche indépendamment. Ce n'est qu'en comprenant pleinement que leurs responsabilités et contextes respectifs peuvent être écrits efficaces et stables à la base de données.
Si vous utilisez toujours l'interface de repos pour tester l'exécution multi-statement, telles que la soumission de plusieurs instructions à https://gitbox.net/api/sql-exec , vous devez également vous rappeler d'utiliser une méthode d'exécution multi-statement pour simuler l'effet de Multi_Query () .