ExĂ©cution des requĂȘtes

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

add a note

User Contributed Notes

There are no user contributed notes for this page.