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 requete 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 Connexion à MySQL

<?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)") ||
	!$mysqli->query("INSERT INTO test(id) VALUES (1)")) {
	echo "Echec lors de la création de la table : (" . $mysqli->errno . ") " . $mysqli->error;
}
?>

Jeux de résultats en mémoire tampon

Après exécution de la requête, les résultats peuvent être récupérés afin d'être placés en mémoire tampon par le client 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 = 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)") ||
	!$mysqli->query("INSERT INTO test(id) VALUES (1), (2), (3)")) {
	echo "Echec lors de la création de la table : (" . $mysqli->errno . ") " . $mysqli->error;
}

$res = $mysqli->query("SELECT id FROM test ORDER BY id ASC");

echo "Ordre inversé...\n";
for ($row_no = $res->num_rows - 1; $row_no >= 0; $row_no--) {
	$res->data_seek($row_no);
	$row = $res->fetch_assoc();
	echo " id = " . $row['id'] . "\n";
}

echo "Ordre du jeu de résultats...\n";
$res->data_seek(0);
while ($row = $res->fetch_assoc()) {
	echo " id = " . $row['id'] . "\n";
}
?>
<?php
$mysqli->real_query("SELECT id FROM test ORDER BY id ASC");
$res = $mysqli->use_result();

echo "Ordre du jeu de résultats...\n";
while ($row = $res->fetch_assoc()) {
	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 = 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, label CHAR(1))") ||
	!$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')")) {
	echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error;
}

$res = $mysqli->query("SELECT id, label FROM test WHERE id = 1");
$row = $res->fetch_assoc();

printf("id = %s (%s)\n", $row['id'], gettype($row['id']));
printf("label = %s (%s)\n", $row['label'], gettype($row['label']));
?>
<?php
$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);
$mysqli->real_connect("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, label CHAR(1))") ||
	!$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')")) {
	echo "Echec lors de la création de la table : (" . $mysqli->errno . ") " . $mysqli->error;
}

$res = $mysqli->query("SELECT id, label FROM test WHERE id = 1");
$row = $res->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

LoadingChargement en cours