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 d'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. Ă la place de cela, toutes les valeurs sont
fournies sous la forme de chaĂźnes 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, lors de l'utilisation de 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