Documentation Home
MySQL 5.7 Reference Manual
Related Documentation Download this Manual Excerpts from this Manual mysql_fetch_row()

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)


Retrieves the next row of a result set. When used after mysql_store_result(), mysql_fetch_row() returns NULL when there are no more rows to retrieve. When used after mysql_use_result(), mysql_fetch_row() returns NULL when there are no more rows to retrieve or if an error occurred.

The number of values in the row is given by mysql_num_fields(result). If row holds the return value from a call to mysql_fetch_row(), pointers to the values are accessed as row[0] to row[mysql_num_fields(result)-1]. NULL values in the row are indicated by NULL pointers.

The lengths of the field values in the row may be obtained by calling mysql_fetch_lengths(). Empty fields and fields containing NULL both have length 0; you can distinguish these by checking the pointer for the field value. If the pointer is NULL, the field is NULL; otherwise, the field is empty.

Return Values

A MYSQL_ROW structure for the next row. NULL if there are no more rows to retrieve or if an error occurred.


Errors are not reset between calls to mysql_fetch_row()

unsigned int num_fields;
unsigned int i;

num_fields = mysql_num_fields(result);
while ((row = mysql_fetch_row(result)))
   unsigned long *lengths;
   lengths = mysql_fetch_lengths(result);
   for(i = 0; i < num_fields; i++)
       printf("[%.*s] ", (int) lengths[i],
              row[i] ? row[i] : "NULL");

Download this Manual
User Comments
  Posted by Dieter Lucking on November 25, 2005
MYSQL_ROW is an array of null-terminated strings. (However, you cannot treat these as null-terminated strings if field values may contain binary data, because such values may contain null bytes internally.) You can use the row data in any function expecting a null-terminated string.

MYSQL_ROW row = mysql_fetch_row(...);
unsigned long* len = mysql_fetch_lengths(...);
const char* end;
if(row[0]) {
long x = strtol(row[0], &end, 10);
if(end - row[0] != len[0]) {
// strtol found an invalid character or the data contained a null-byte.
  Posted by Vyacheslav Brover on March 29, 2011
Detecting timeout error for non-prepared "select for update" statement:

/* lock table LOG */
MYSQL mysql;
/* initialize mysql */
int status = mysql_query (& mysql, "select Id from LOG for update"); /* Waits for ~1 min., but status == 0 */
unsigned int err = mysql_errno (& mysql); /* err == 0 */
MYSQL_RES* res = mysql_use_result (& mysql);
err = mysql_errno (& mysql); /* err == 0 */
MYSQL_ROW row = mysql_fetch_row (mres);
err = mysql_errno (& mysql); /* err == 1205 (ER_LOCK_WAIT_TIMEOUT) */

For non-prepared DML statements error 1205 is detected by mysql_query().
For prepared statements error 1205 is detected by mysql_stmt_execute().
Sign Up Login You must be logged in to post a comment.