mysqli::multi_query

mysqli_multi_query

(PHP 5, PHP 7, PHP 8)

mysqli::multi_query -- mysqli_multi_queryExécute une ou plusieurs requêtes sur la base de donnée

Description

Style orienté objet

public mysqli::multi_query(string $query): bool

Style procédural

mysqli_multi_query(mysqli $mysql, string $query): bool

Exécute une ou plusieurs requêtes, rassemblées dans le paramètre query par des points-virgules.

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 de manière asynchrone dans un seul appel à la base de données, mais la base de données les traitent de manière séquentielle. mysqli_multi_query() attend pour la première requête de compléter avant de retourner le contrôle à PHP. Le serveur MySQL traitera alors la prochaine requête dans la suite. Une fois que le résultat est prêt, MySQL attendra pour la prochaine exécution de mysqli_next_result() depuis PHP.

Il est recommandé d'utiliser une do-while pour traiter plusieurs requêtes. La connexion sera occupé jusqu'à ce que toutes les requêtes soit complété 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 soit 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é pour récupérer les informations tel que le nombre de ligne affectés.

Astuce

Exécuter une requête CALL pour les procédures stocké peut produire plusieurs jeux de résultats. Si la procédure stocké contient des requêtes SELECT, les jeux de résultats sont retournés dans l'ordre dans lequel ils sont produit 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'inclus pas de jeu de résultat. Le statut indique si la procédure a succédé ou si une erreur c'est produit.

Liste de paramètres

mysql

Seulement en style procédural : Un objet mysqli retourné par la fonction mysqli_connect() ou par la fonction mysqli_init().

query

Une chaîne de caractères contenant les requêtes à exécuter. Plusieurs requêtes doivent être séparé par un point-virgule.

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, vous devez appeler d'abord la fonction mysqli_next_result().

Erreurs / Exceptions

Si le rapport d'erreurs mysqli est activé (MYSQLI_REPORT_ERROR) et que l'opération demandée échoue, un avertissement est généré. Si, en plus, le mode est défini sur MYSQLI_REPORT_STRICT, une mysqli_sql_exception est lancée à la place.

Exemples

Exemple #1 Exemple avec mysqli::multi_query()

Style orienté objet

<?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());
?>

Style procédural

<?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

Voir aussi