mysqli::multi_query
mysqli_multi_query
(PHP 5, PHP 7, PHP 8)
mysqli::multi_query -- mysqli_multi_query — Exécute une ou plusieurs requêtes sur la base de données
Description
Style orienté objet
Avertissement
Avertissement de Sécurité : injection SQL
Si la requête contiens des variables d'entrées alors des
déclarations préparées paramétrisées
devrait être utilisé à la place. Alternativement, les données doivent être correctement
formatées et toutes les chaînes de caractères doivent être échappées en utilisant la fonction
mysqli_real_escape_string().
Les requêtes sont envoyées en un seul appel à la base de données et traitées séquentiellement.
mysqli_multi_query() attend que la première requête
soit terminée avant de rendre le contrôle à PHP. Entre-temps, le serveur MySQL
continue de traiter les requêtes restantes de manière asynchrone par rapport à PHP
et rend les résultats disponibles pour la récupération.
Il est recommandé d'utiliser une
do-while pour traiter
plusieurs requêtes. La connexion sera occupée jusqu'à ce que toutes les
requêtes soient complétées et que leur résultat soit récupéré par PHP.
Aucune autre requête ne peut être émise sur la même connexion, jusqu'à ce
que toutes les requêtes soient traitées.
Pour traiter la prochaine requête dans la suite, utiliser
mysqli_next_result(). Si le prochain résultat n'est pas
encore prêt mysqli attendra pour la réponse depuis le serveur MySQL.
Pour vérifier s'il y a plus de résultats, utiliser
mysqli_more_results().
Pour les requêtes qui produisent un jeu de résultat, tel que
SELECT, SHOW, DESCRIBE ou
EXPLAIN,
mysqli_use_result() ou mysqli_store_result()
peut être utilisé pour récupérer le jeu de résultat. Pour les requêtes qui
ne produisent pas de jeu de résultat, les mêmes fonctions peuvent être
utilisées pour récupérer les informations telles que le nombre de lignes affectées.
Astuce
Exécuter une requête CALL pour les procédures stockées
peut produire plusieurs jeux de résultats. Si la procédure stockée contient
des requêtes SELECT, les jeux de résultats sont retournés
dans l'ordre dans lequel ils sont produits par l'exécution de la procédure.
En général, l'appeleur ne peut pas savoir combien de jeux de résultats une
procédure retournera et doit être préparé à récupérer plusieurs résultats.
Le résultat final de la procédure est un résultat de statut qui n'inclut
pas de jeu de résultat. Le statut indique si la procédure a succédé
ou si une erreur s'est produite.
Valeurs de retour
Retourne false uniquement si la première requête échoue. Pour récupérer
les sous-séquences d'erreurs issues des autres requêtes, il faut appeler
d'abord la fonction mysqli_next_result().
Exemples
Exemple #1 Exemple avec mysqli::multi_query()
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
$query = "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";
/* Exécution d'une requête multiple */
$mysqli->multi_query($query);
do {
/* store the result set in PHP */
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_row()) {
printf("%s\n", $row[0]);
}
}
/* print divider */
if ($mysqli->more_results()) {
printf("-----------------\n");
}
} while ($mysqli->next_result());
?>
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
$query = "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";
/* Exécution d'une requête multiple */
mysqli_multi_query($link, $query);
do {
/* store the result set in PHP */
if ($result = mysqli_store_result($link)) {
while ($row = mysqli_fetch_row($result)) {
printf("%s\n", $row[0]);
}
/* Affichage d'une séparation */
if (mysqli_more_results($link)) {
printf("-----------------\n");
}
}
/* print divider */
if (mysqli_more_results($link)) {
printf("-----------------\n");
}
} while (mysqli_next_result($link));
?>
Les exemples ci-dessus vont afficher quelque chose de similaire à :
my_user@localhost
-----------------
Amersfoort
Maastricht
Dordrecht
Leiden
Haarlemmermeer