Les requêtes peuvent être exécutées avec les fonctions mysqli::query(), mysqli::real_query() et mysqli::multi_query().. La fonction mysqli::query() est la plus commune, et combine l'exécution de la requête avec une récupération de son jeu de résultats en mémoire tampon, s'il y en a un, en un seul appel. Appeler la fonction mysqli::query() est identique à appeler la fonction mysqli::real_query()suivie d'un appel à la fonction mysqli::store_result().
Exemple #1 Exécution des requêtes
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");
$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT)");
Jeux de résultats en mémoire tampon
Après exécution de la requête, les résultats peuvent être intégralement récupérés en une fois ou bien être lus ligne par ligne. La mise en mémoire tampon du jeu de résultats côté client autorise le serveur à libérer les ressources associées avec le résultat de la requête aussi vite que possible. De manière générale, les clients sont lents à parcourir les jeux de résultats. Toutefois, il est recommandéd'utiliser la mise en mémoire tampon des jeux de résultats. La fonction mysqli::query() combine à la fois l'exécution de la requête et la mise en mémoire tampon du jeu de résultats.
Les applications PHP peuvent naviguer librement dans les résultats mis en mémoire tampon. La navigation est rapide car les jeux de résultats sont stockés dans la mémoire client. Veuillez garder à l'esprit qu'il est souvent plus simple de réaliser cette opération par le client que par le serveur.
Exemple #2 Navigation dans des résultats mis en mémoire tampon
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");
$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT)");
$mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)");
$result = $mysqli->query("SELECT id FROM test ORDER BY id ASC");
echo "Ordre inversé...\n";
for ($row_no = $result->num_rows - 1; $row_no >= 0; $row_no--) {
$result->data_seek($row_no);
$row = $result->fetch_assoc();
echo " id = " . $row['id'] . "\n";
}
echo "Ordre du jeu de résultats...\n";
foreach ($result as $row) {
echo " id = " . $row['id'] . "\n";
}
L'exemple ci-dessus va afficher :
Ordre inversé... id = 3 id = 2 id = 1 Ordre du jeu de résultats... id = 1 id = 2 id = 3
Jeux de résultats non mis en mémoire tampon
Si la mémoire client est une ressource limitée, et que la libération des ressources serveur aussi vite que possible pour conserver une charge serveur basse n'est pas nécessaire, les résultats non mis en mémoire tampon peuvent être utilisés. La navigation au travers de résultats non mis en mémoire tampon n'est pas possible tant que toutes les lignes n'ont pas été lues.
Exemple #3 Navigation dans des résultats non mis en mémoire tampon
<?php
$mysqli->real_query("SELECT id FROM test ORDER BY id ASC");
$result = $mysqli->use_result();
echo "Ordre du jeu de résultats...\n";
foreach ($result as $row) {
echo " id = " . $row['id'] . "\n";
}
Types de données des valeurs du jeu de résultats
Les fonctions mysqli::query(), mysqli::real_query()
et mysqli::multi_query() sont utilisées pour exécuter des
requêtes non-préparées. Au niveau du protocole client-serveur MySQL, la commande
COM_QUERY
ainsi que le protocole texte sont utilisés pour
l'exécution de la requête. Avec le protocole texte, le serveur MySQL convertit
toutes les données d'un jeu de résultats en chaînes de caractères avant de les envoyer.
La bibliothèque cliente mysql reçoit toutes les valeurs des colonnes sous forme
de chaîne de caractères. Aucun autre transtypage côté client n'est effectué
pour retrouver le type natif des colonnes. A la place de cela, toutes les valeurs sont
fournis sous la forme de chaîne de caractères PHP.
Exemple #4 Le protocole texte retourne des chaînes de caractères par défaut
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");
$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT, label CHAR(1))");
$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')");
$result = $mysqli->query("SELECT id, label FROM test WHERE id = 1");
$row = $result->fetch_assoc();
printf("id = %s (%s)\n", $row['id'], gettype($row['id']));
printf("label = %s (%s)\n", $row['label'], gettype($row['label']));
L'exemple ci-dessus va afficher :
id = 1 (string) label = a (string)
Il est possible de convertir des colonnes de type entières et nombres à virgule flottante
en nombre PHP en définissant l'option de connexion
MYSQLI_OPT_INT_AND_FLOAT_NATIVE
, si vous utilisez la bibliothèque
mysqlnd. Si défini, la bibliothèque mysqlnd va vérifier les méta-données des types
des colonnes dans le jeu de résultats et va convertir les colonnes SQL numériques
en nombres PHP, si la valeur entre dans l'intervalle autorisé de PHP.
De cette façon, par exemple, les colonnes SQL INT sont retournées sous la forme
d'entier.
Exemple #5 Types natifs des données avec mysqlnd et l'option de connexion
<?php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli();
$mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);
$mysqli->real_connect("example.com", "user", "password", "database");
$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT, label CHAR(1))");
$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')");
$result = $mysqli->query("SELECT id, label FROM test WHERE id = 1");
$row = $result->fetch_assoc();
printf("id = %s (%s)\n", $row['id'], gettype($row['id']));
printf("label = %s (%s)\n", $row['label'], gettype($row['label']));
L'exemple ci-dessus va afficher :
id = 1 (integer) label = a (string)
Voir aussi