int mysql_stmt_fetch(MYSQL_STMT *stmt)
Description
mysql_stmt_fetch()
retourne la ligne
suivante dans le résultat. La fonction peut être appelée
uniquement si le résultat existe, c'est à dire après
mysql_stmt_execute()
qui crée le
résultat, ou après
mysql_stmt_store_result()
, qui est appelé
après mysql_stmt_execute()
pour mettre en
buffer tout le résultat.
Si les lignes sont liées à des buffers avec
mysql_stmt_bind_result()
, la fonction
retourne les données dans ces buffers pour toutes les
colonnes de la ligne en cours, et les tailles sont retournées
dans le pointeur de taille.
Notez que toutes les colonnes doivent être liées par
l'application avant d'appeler
mysql_stmt_fetch()
.
Si les données lues contiennent la valeur NULL, alors la
valeur is_null
de
MYSQL_BIND
contiendra TRUE, 1, ou sinon,
les données et leur longueur seront reoturnées dans les
variables *buffer
et
*length
, basées sur le type de buffer,
spécifié par l'application. Tous les nombres ont une taille
fixe, listée en octet ci-dessous. La taille des types
chaînes dépend des données, comme indiqué dans
data_length
.
Type | Length |
MYSQL_TYPE_TINY |
1 |
MYSQL_TYPE_SHORT |
2 |
MYSQL_TYPE_LONG |
4 |
MYSQL_TYPE_LONGLONG |
8 |
MYSQL_TYPE_FLOAT |
4 |
MYSQL_TYPE_DOUBLE |
8 |
MYSQL_TYPE_TIME |
sizeof(MYSQL_TIME) |
MYSQL_TYPE_DATE |
sizeof(MYSQL_TIME) |
MYSQL_TYPE_DATETIME |
sizeof(MYSQL_TIME) |
MYSQL_TYPE_TIMESTAMP |
sizeof(MYSQL_TIME) |
MYSQL_TYPE_STRING |
data length |
MYSQL_TYPE_VAR_STRING |
data_length |
MYSQL_TYPE_TINY_BLOB |
data_length |
MYSQL_TYPE_BLOB |
data_length |
MYSQL_TYPE_MEDIUM_BLOB |
data_length |
MYSQL_TYPE_LONG_BLOB |
data_length |
où *data_length
ne vaut rien d'autre que
'la taille réelle des donées'.
Valeurs retournées
Return Value | Description |
0 | Réussi. Les données ont été lues, et placées dans les buffers. |
1 | Une erreur est survenue. Le code d'erreur et le message d'erreur sont
disponibles grâce aux fonctions
mysql_stmt_errno() et
mysql_stmt_error() . |
100, MYSQL_NO_DATA | Il ne reste plus de données ou de lignes. |
Erreurs
CR_COMMANDS_OUT_OF_SYNC
Commands were executed in an improper
order
: les commandes ont été exécutées
dans un ordre invalide.
CR_OUT_OF_MEMORY
Out of memory
: plus de mémoire.
CR_SERVER_GONE_ERROR
The MySQL server has gone away
: Le
serveur MySQL s'est éteint.
CR_SERVER_LOST
The connection to the server was lost during the
query
: la connexion au serveur a été perdue
durant la requête.
CR_UNKNOWN_ERROR
An unknown error occurred
: Une erreur
inconnue est survenue.
CR_UNSUPPORTED_PARAM_TYPE
If the buffer type is
MYSQL_TYPE_DATE,DATETIME,TIME,or TIMESTAMP; and if the
field type is not DATE, TIME, DATETIME or
TIMESTAMP
Le buffer est de type
MYSQL_TYPE_DATE,DATETIME,TIME ou TIMESTAMP et le type de
champs n'est pas DATE, TIME, DATETIME or TIMESTAMP.
Toutes les autres erreurs de conversions non supportées
sont disponibles avec
mysql_bind_result()
.
Exemple
L'exemple ci-dessous explique l'utilisation de
mysql_get_metadata()
,
mysql_bind_result()
et
mysql_stmt_fetch()
Cette exemple s'attend
à lire les deux lignes insérées dans l'exemple de
Section 24.2.7.10, « mysql_stmt_execute()
».) La variable
mysql
est supposée être une connexion
valide.
#define STRING_SIZE 50 #define SELECT_SAMPLE "SELECT col1, col2, col3, col4 FROM test_table" MYSQL_STMT *stmt; MYSQL_BIND bind[4]; MYSQL_RES *prepare_meta_result; MYSQL_TIME ts; unsigned long length[4]; int param_count, column_count, row_count; short small_data; int int_data; char str_data[STRING_SIZE]; my_bool is_null[4]; /* Prépare une commande SELECT pour lire les données dans la table test_table */ stmt = mysql_prepare(mysql, SELECT_SAMPLE, strlen(SELECT_SAMPLE)); if (!stmt) { fprintf(stderr, " mysql_prepare(), SELECT failed\n"); fprintf(stderr, " %s\n", mysql_error(mysql)); exit(0); } fprintf(stdout, " prepare, SELECT successful\n"); /* Lit le nombre de paramètrs de la commande */ param_count= mysql_param_count(stmt); fprintf(stdout, " total parameters in SELECT: %d\n", param_count); if (param_count != 0) /* validate parameter count */ { fprintf(stderr, " invalid parameter count returned by MySQL\n"); exit(0); } /* Lit les méta-données */ prepare_meta_result = mysql_get_metadata(stmt); if (!prepare_meta_result) { fprintf(stderr, " mysql_get_metadata(), returned no meta information\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Lit le nombre de colonnes de la requête */ column_count= mysql_num_fields(prepare_meta_result); fprintf(stdout, " total columns in SELECT statement: %d\n", column_count); if (column_count != 4) /* validate column count */ { fprintf(stderr, " invalid column count returned by MySQL\n"); exit(0); } /* Exécute la requête SELECT */ if (mysql_execute(stmt)) { fprintf(stderr, " mysql_execute(), failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Lie les buffers de résultats pour les 4 colonnes avant de les lire */ /* INTEGER COLUMN */ bind[0].buffer_type= MYSQL_TYPE_LONG; bind[0].buffer= (char *)&int_data; bind[0].is_null= &is_null[0]; bind[0].length= &length[0]; /* STRING COLUMN */ bind[1].buffer_type= MYSQL_TYPE_VAR_STRING; bind[1].buffer= (char *)str_data; bind[1].buffer_length= STRING_SIZE; bind[1].is_null= &is_null[1]; bind[1].length= &length[1]; /* SMALLINT COLUMN */ bind[2].buffer_type= MYSQL_TYPE_SHORT; bind[2].buffer= (char *)&small_data; bind[2].is_null= &is_null[2]; bind[2].length= &length[2]; /* TIMESTAMP COLUMN */ bind[3].buffer_type= MYSQL_TYPE_TIMESTAMP; bind[3].buffer= (char *)&ts; bind[3].is_null= &is_null[3]; bind[3].length= &length[3]; /* Lit les résultats */ if (mysql_bind_result(stmt, bind)) { fprintf(stderr, " mysql_bind_result() failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Maintenant, lis les résultats dans les buffers */ if (mysql_stmt_store_result(stmt)) { fprintf(stderr, " mysql_stmt_store_result() failed\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); } /* Lit toutes les lignes */ row_count= 0; fprintf(stdout, "Fetching results ...\n"); while (!mysql_stmt_fetch(stmt)) { row_count++; fprintf(stdout, " row %d\n", row_count); /* colonne 1 */ fprintf(stdout, " column1 (integer) : "); if (is_null[0]) fprintf(stdout, " NULL\n"); else fprintf(stdout, " %d(%ld)\n", int_data, length[0]); /* colonne 2 */ fprintf(stdout, " column2 (string) : "); if (is_null[1]) fprintf(stdout, " NULL\n"); else fprintf(stdout, " %s(%ld)\n", str_data, length[1]); /* colonne 3 */ fprintf(stdout, " column3 (smallint) : "); if (is_null[2]) fprintf(stdout, " NULL\n"); else fprintf(stdout, " %d(%ld)\n", small_data, length[2]); /* colonne 4 */ fprintf(stdout, " column4 (timestamp): "); if (is_null[3]) fprintf(stdout, " NULL\n"); else fprintf(stdout, " %04d-%02d-%02d %02d:%02d:%02d (%ld)\n", ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second, length[3]); fprintf(stdout, "\n"); } /* Valide la ligne lue */ fprintf(stdout, " total rows fetched: %d\n", row_count); if (row_count != 2) { fprintf(stderr, " MySQL failed to return all rows\n"); exit(0); } /* Libère les méta-données de résultat */ mysql_free_result(prepare_meta_result); /* Ferme la commande */ if (mysql_stmt_close(stmt)) { fprintf(stderr, " failed while closing the statement\n"); fprintf(stderr, " %s\n", mysql_stmt_error(stmt)); exit(0); }
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.