Rechercher une fonction PHP

Requêtes multiples

MySQL autorise optionnellement le fait d'avoir plusieurs requêtes dans une seule chaîne de requête. L'envoi de requêtes multiples en une fois réduit les aller-retour client serveur mais nécessite une gestion spéciale.

Les requêtes multiples ou multi-requêtes doivent être exécutées avec la fonction mysqli_multi_query(). Les requêtes individuelles dans la chaîne de requête sont séparées par un point virgule. Ensuite, tous les jeux de résultats retournés par l'exécution des requêtes doivent être récupérés.

Le serveur MySQL autorise d'avoir des requêtes qui retournent des jeux de résultats ainsi que des requêtes qui ne retournent aucun jeu de résultats dans la même requête multiple.

Exemple #1 Requêtes multiples

<?php
$mysqli 
= new mysqli("example.com""user""password""database");
if (
$mysqli->connect_errno) {
    echo 
"Echec lors de la connexion à MySQL: (" $mysqli->connect_errno ") " $mysqli->connect_error;
}

if (!
$mysqli->query("DROP TABLE IF EXISTS test") || !$mysqli->query("CREATE TABLE test(id INT)")) {
    echo 
"Echec lors de la création de la table : (" $mysqli->errno ") " $mysqli->error;
}

$sql "SELECT COUNT(*) AS _num FROM test; ";
$sql.= "INSERT INTO test(id) VALUES (1); ";
$sql.= "SELECT COUNT(*) AS _num FROM test; ";

if (!
$mysqli->multi_query($sql)) {
    echo 
"Echec lors de l'exécution de la multi-requête : (" $mysqli->errno ") " $mysqli->error;
}

do {
    if (
$res $mysqli->store_result()) {
        
var_dump($res->fetch_all(MYSQLI_ASSOC));
        
$res->free();
    }
} while (
$mysqli->more_results() && $mysqli->next_result());
?>

L'exemple ci-dessus va afficher :

array(1) {
  [0]=>
  array(1) {
    ["_num"]=>
    string(1) "0"
  }
}
array(1) {
  [0]=>
  array(1) {
    ["_num"]=>
    string(1) "1"
  }
}

D'un point de vue de la sécurité

Les fonctions mysqli_query() et mysqli_real_query() de l'API ne définissent pas de drapeau de connexion nécessaire pour l'activation des multi-requêtes sur le serveur. Un appel supplémentaire à l'API est utilisé pour les multi-requêtes pour réduire la probabilité d'injection SQL accidentelle. Un attaquant peut tenter d'ajouter des requêtes comme ; DROP DATABASE mysql ou ; SELECT SLEEP(999). Si l'attaquant arrive à ajouter ce genre de SQL dans la chaîne de requête mais que mysqli_multi_query n'est pas utilisé, le serveur n'excutera que la première requête, mais pas la seconde représentant la requête SQL malicieuse.

Exemple #2 Injection SQL

<?php
$mysqli 
= new mysqli("example.com""user""password""database");
$res    $mysqli->query("SELECT 1; DROP TABLE mysql.user");
if (!
$res) {
    echo 
"Erreur lors de l'exécution de la requête : (" $mysqli->errno ") " $mysqli->error;
}
?>

L'exemple ci-dessus va afficher :

Erreur lors de l'exécution de la requête : (1064) You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax 
to use near 'DROP TABLE mysql.user' at line 1

Prepared statements

L'utilisation des requêtes multiples avec des requêtes préparées n'est pas supportée.

Voir aussi

Rechercher une fonction PHP

Document créé le 30/01/2003, dernière modification le 26/10/2018
Source du document imprimé : https://www.gaudry.be/php-rf-mysqli.quickstart.multiple-statement.html

L'infobrol est un site personnel dont le contenu n'engage que moi. Le texte est mis à disposition sous licence CreativeCommons(BY-NC-SA). Plus d'info sur les conditions d'utilisation et sur l'auteur.

Références

  1. Consulter le document html Langue du document :fr Manuel PHP : http://php.net

Ces références et liens indiquent des documents consultés lors de la rédaction de cette page, ou qui peuvent apporter un complément d'information, mais les auteurs de ces sources ne peuvent être tenus responsables du contenu de cette page.
L'auteur de ce site est seul responsable de la manière dont sont présentés ici les différents concepts, et des libertés qui sont prises avec les ouvrages de référence. N'oubliez pas que vous devez croiser les informations de sources multiples afin de diminuer les risques d'erreurs.

Table des matières Haut