Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.1Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


23.8.7.21 mysql_fetch_row()

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

説明

結果セットの次の行を取得します。mysql_store_result() のあとで使用すると、mysql_fetch_row() は、それ以上取得する行がない場合に、NULL を返します。mysql_use_result() のあとで使用すると、mysql_fetch_row() は、それ以上取得する行がないか、エラーが発生した場合に NULL を返します。

行内の値の数は mysql_num_fields(result) によって指定されます。rowmysql_fetch_row() への呼び出しからの戻り値を保持している場合、その値へのポインタは、row[0] から row[mysql_num_fields(result)-1] までとしてアクセスされます。行内の NULL 値は NULL ポインタによって示されます。

行内のフィールド値の長さは、mysql_fetch_lengths() を呼び出すことによって取得できます。空のフィールドと NULL を含むフィールドはどちらも長さが 0 です。これらを区別するには、フィールド値のポインタをチェックします。ポインタが NULL である場合、フィールドは NULL です。そうでない場合、フィールドは空です。

戻り値

次の行の MYSQL_ROW 構造。それ以上取得する行がないか、エラーが発生した場合は NULL

エラー

mysql_fetch_row() の呼び出しと呼び出しの間に、エラーはリセットされません。

  • CR_SERVER_LOST

    サーバーへの接続がクエリー中に失われました。

  • CR_UNKNOWN_ERROR

    不明なエラーが発生しました。

MYSQL_ROW 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");
   }
   printf("\n");
}

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.

Example:
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.