query
Découvrez la fonction mysqli_query() en PHP pour exécuter des requêtes SQL contre une base de données MySQL.
$mysqli->query() exécute une seule instruction SQL contre une base de données MySQL via une connexion MySQLi ouverte. C'est la façon la plus simple de communiquer avec MySQL depuis PHP, donc c'est le bon point de départ — mais comme vous le verrez ci-dessous, dès que votre requête contient des données saisies par l'utilisateur, vous devriez utiliser des instructions préparées à la place.
Cette page explique ce que query() retourne, comment lire un jeu de résultats, comment il se comporte pour les requêtes d'écriture, et le piège d'injection SQL que vous devez éviter.
Syntaxe
// Object-oriented style
$result = $mysqli->query($sql);
// Procedural style
$result = mysqli_query($mysqli, $sql);Les deux formes font la même chose ; le style orienté objet est utilisé tout au long de cette page.
Ce que query() retourne
La valeur de retour dépend du type d'instruction que vous exécutez :
| Type de requête | En cas de succès | En cas d'échec |
|---|---|---|
SELECT, SHOW, DESCRIBE, EXPLAIN | un objet mysqli_result | false |
INSERT, UPDATE, DELETE, CREATE, ... | true | false |
Comme l'échec est toujours false, vous pouvez brancher sur la valeur de retour avec un simple if. Ne supposez jamais qu'une requête a réussi — un nom de colonne mal orthographié ou une table manquante renvoient tous deux false.
Exécuter une requête SELECT
Pour un SELECT, parcourez le résultat retourné et extrayez chaque ligne avec fetch_assoc() (ou fetch_array()), puis libérez le résultat lorsque vous avez terminé :
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
// Stop early if the connection failed.
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
exit();
}
$result = $mysqli->query("SELECT id, name FROM users");
if ($result) {
while ($row = $result->fetch_assoc()) {
echo $row["id"] . ": " . $row["name"] . "\n";
}
$result->free(); // release the result set's memory
} else {
echo "Query failed: " . $mysqli->error;
}
$mysqli->close();
?>La boucle while se termine quand fetch_assoc() retourne null (plus de lignes). $result->free() libère le jeu de résultats, ce qui est important dans les scripts de longue durée qui exécutent de nombreuses requêtes.
Exécuter INSERT, UPDATE et DELETE
Les requêtes d'écriture ne retournent pas de jeu de résultats — elles retournent true en cas de succès. Pour savoir combien de lignes ont été affectées, lisez $mysqli->affected_rows ; pour obtenir l'identifiant auto-incrémenté d'une ligne fraîchement insérée, lisez $mysqli->insert_id :
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
if ($mysqli->query("UPDATE users SET active = 1 WHERE active = 0")) {
echo $mysqli->affected_rows . " rows updated";
} else {
echo "Query failed: " . $mysqli->error;
}
$mysqli->close();
?>Ne jamais mettre les données utilisateur directement dans une requête
query() prend une chaîne SQL brute, donc la concaténation de données utilisateur ouvre la porte à l'injection SQL — la faille de sécurité des bases de données la plus courante sur le web :
// DANGEROUS — do NOT do this
$id = $_GET['id'];
$result = $mysqli->query("SELECT * FROM users WHERE id = $id");Si un visiteur envoie id=0 OR 1=1, cette requête retourne tous les utilisateurs. La solution est une instruction préparée, qui envoie le SQL et les valeurs séparément afin que les valeurs ne puissent jamais être interprétées comme du SQL :
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $_GET['id']); // "i" = integer
$stmt->execute();
$result = $stmt->get_result();Utilisez query() uniquement pour du SQL fixe sans données utilisateur ; utilisez des instructions préparées pour tout ce qui contient des valeurs provenant de l'extérieur de votre code. Consultez MySQL prepared statements pour un guide complet.
Résumé
$mysqli->query()exécute une instruction SQL sur une connexion MySQLi ouverte.- Un
SELECTretourne unmysqli_resultque vous itérez avecfetch_assoc(); les autres instructions retournenttrue; tout échec retournefalse. - Lisez
affected_rowsaprès une écriture, etinsert_idaprès unINSERT. - Passez aux instructions préparées dès que des données utilisateur sont impliquées.