mysqli_result::fetch_field_direct
mysqli_fetch_field_direct
(PHP 5, PHP 7, PHP 8)
mysqli_result::fetch_field_direct -- mysqli_fetch_field_direct — 単一のフィールドのメタデータを取得する
説明
オブジェクト指向型
手続き型
指定した結果セットから、フィールド定義情報を含むオブジェクトを返します。
パラメータ
result
-
手続き型のみ: mysqli_query()、mysqli_store_result()、mysqli_use_result()、mysqli_stmt_get_result() が返す mysqli_result オブジェクト。
index
-
フィールド番号。この値は
0
からフィールド数 - 1
までの範囲でなければなりません。
戻り値
フィールド定義情報を含むオブジェクトを返します。もし、指定した
index
のフィールドの情報が取得できない場合は
false
を返します。
プロパティ | 説明 |
---|---|
name | カラムの名前。 |
orgname | エイリアスが指定されている場合の、本来の名前。 |
table | フィールドが属するテーブルの名前 (演算をしていない場合)。 |
orgtable | エイリアスが指定されている場合の、本来のテーブル名。 |
def | 未使用。常に空文字列になります。 |
db | データベースの名前。 |
catalog | 未使用。常に "def" になります。 |
max_length | 結果セットにおけるフィールドの最大幅。PHP 8.1 以降では、この値は常に 0 です。 |
length |
テーブルの定義で指定されているフィールド幅 (バイト単位)。
文字列型のカラムの場合、
値の長さは接続の文字セットによって異なります。
たとえば文字セットが latin1 、
つまりシングルバイトの文字セットの場合、
クエリ SELECT 'abc' の値の長さは3になります。
一方で文字セットが utf8mb4 の場合、
つまりマルチバイトの文字セットの場合、
文字は4バイトまでの長さをとります。値の長さは12になります。
|
charsetnr | フィールドの文字セット番号。 |
flags | フィールドのビットフラグを整数型で表す。 |
type | フィールドのデータ型。 |
decimals | 数値型のフィールドの場合の桁数。時間フィールドの場合は、秒単位の精度。 |
例
例1 オブジェクト指向型
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* 接続状況をチェックします */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, SurfaceArea from Country ORDER BY Name LIMIT 5";
if ($result = $mysqli->query($query)) {
/* カラム 'SurfaceArea' のフィールド情報を取得します */
$finfo = $result->fetch_field_direct(1);
printf("Name: %s\n", $finfo->name);
printf("Table: %s\n", $finfo->table);
printf("max. Len: %d\n", $finfo->max_length);
printf("Flags: %d\n", $finfo->flags);
printf("Type: %d\n", $finfo->type);
$result->close();
}
/* 接続を閉じます */
$mysqli->close();
?>
例2 手続き型
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* 接続状況をチェックします */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT Name, SurfaceArea from Country ORDER BY Name LIMIT 5";
if ($result = mysqli_query($link, $query)) {
/* カラム 'SurfaceArea' のフィールド情報を取得します */
$finfo = mysqli_fetch_field_direct($result, 1);
printf("Name: %s\n", $finfo->name);
printf("Table: %s\n", $finfo->table);
printf("max. Len: %d\n", $finfo->max_length);
printf("Flags: %d\n", $finfo->flags);
printf("Type: %d\n", $finfo->type);
mysqli_free_result($result);
}
/* 接続を閉じます */
mysqli_close($link);
?>
上の例の出力は以下となります。
Name: SurfaceArea Table: Country max. Len: 10 Flags: 32769 Type: 4
参考
- mysqli_num_fields() - 結果セットのフィールド数を取得する
- mysqli_fetch_field() - 結果セットの次のフィールドを返す
- mysqli_fetch_fields() - 結果セットのフィールド情報をオブジェクトの配列で返す
+add a note
User Contributed Notes 12 notes
daniel at summit cove dot com ¶
15 years ago
Here's a bigger list of data types. I got this by creating every type I could and calling fetch_fields():
<?php
$mysql_data_type_hash = array(
1=>'tinyint',
2=>'smallint',
3=>'int',
4=>'float',
5=>'double',
7=>'timestamp',
8=>'bigint',
9=>'mediumint',
10=>'date',
11=>'time',
12=>'datetime',
13=>'year',
16=>'bit',
//252 is currently mapped to all text and blob types (MySQL 5.0.51a)
253=>'varchar',
254=>'char',
246=>'decimal'
);
?>
ben dot NOSPAM at NOSPAM dot seraphire dot com ¶
12 years ago
This may be obvious, but the constants for the field types are already defined in PHP, and can be found in the documentation at: http://php.net/manual/en/mysqli.constants.php
cjs at ashdowntech dot com ¶
16 years ago
According to
http://www.redferni.uklinux.net/mysql/MySQL-Protocol.html
Data type values are:
DECIMAL 0 ENUM 247
TINY 1 SET 248
SHORT 2 TINY_BLOB 249
LONG 3 MEDIUM_BLOB 250
FLOAT 4 LONG_BLOB 251
DOUBLE 5 BLOB 252
NULL 6 VAR_STRING 253
TIMESTAMP 7 STRING 254
LONGLONG 8 GEOMETRY 255
INT24 9
DATE 10
TIME 11
DATETIME 12
YEAR 13
NEWDATE 14
Note that this is not tested and does not contain
all the values noted by deluxmozart
cjs at ashdowntech dot com ¶
16 years ago
According to
dev.mysql.com/sources/doxygen/mysql-5.1/mysql__com_8h-source.html
the flag bits are:
NOT_NULL_FLAG 1 /* Field can't be NULL */
PRI_KEY_FLAG 2 /* Field is part of a primary key */
UNIQUE_KEY_FLAG 4 /* Field is part of a unique key */
MULTIPLE_KEY_FLAG 8 /* Field is part of a key */
BLOB_FLAG 16 /* Field is a blob */
UNSIGNED_FLAG 32 /* Field is unsigned */
ZEROFILL_FLAG 64 /* Field is zerofill */
BINARY_FLAG 128 /* Field is binary */
ENUM_FLAG 256 /* field is an enum */
AUTO_INCREMENT_FLAG 512 /* field is a autoincrement field */
TIMESTAMP_FLAG 1024 /* Field is a timestamp */
andre at koethur dot de ¶
10 years ago
Here are two methods for converting the 'type' and 'flags' attributes to text for debugging purposes. They both use the predefined MYSQLI_ constants to generate the text.
<?php
public static function h_type2txt($type_id)
{
static $types;
if (!isset($types))
{
$types = array();
$constants = get_defined_constants(true);
foreach ($constants['mysqli'] as $c => $n) if (preg_match('/^MYSQLI_TYPE_(.*)/', $c, $m)) $types[$n] = $m[1];
}
return array_key_exists($type_id, $types)? $types[$type_id] : NULL;
}
public static function h_flags2txt($flags_num)
{
static $flags;
if (!isset($flags))
{
$flags = array();
$constants = get_defined_constants(true);
foreach ($constants['mysqli'] as $c => $n) if (preg_match('/MYSQLI_(.*)_FLAG$/', $c, $m)) if (!array_key_exists($n, $flags)) $flags[$n] = $m[1];
}
$result = array();
foreach ($flags as $n => $t) if ($flags_num & $n) $result[] = $t;
return implode(' ', $result);
}
?>
gmx dot net at Hoffmann dot P ¶
10 years ago
Warning!
This function is not only more memory consuming than expected but the consumption also depends on the size of the result set. So if you realy only want to get your field_names you might want to append " LIMIT 1" or use mysqli->unbuffered_query() to save yourself from a memory bloat.
shoresofnowhere at gmail dot com ¶
15 years ago
Beware of the fact that the ->def property NEVER gets filled with the correct default field value, so it's totally USELESS.
This happens NOT for a bug in php (so don't go filling in a bug report), but happens BY DESIGN, since the MySQL C API call doesn't fill in this value, unless you call the mysql_list_fields() function, which Php doesn't.
See here for reference.
http://dev.mysql.com/doc/refman/5.0/en/c-api-datatypes.html
Also, be aware that if you're using a query which contains subqueries, the primary key/autoincrement flags do NOT get passed along, even if the field you're looking at is the primary autoincrement key of the master table:
SELECT * from (SELECT id from areas) AS subareas
and you'll find primary key and autoinc flags off on id field, even if id was the primary autoinc key of areas table.
This also is by design, i think, since it's supposed that if we're using a subquery then the primary key/autoinc stuff might have no sense at all, since in the result set we can compose fileds from many different tables.
Hoping this is useful, bye!
anatoliy at ukhvanovy dot name ¶
9 years ago
You can find all available data types here:
https://php.net/manual/ru/mysqli.constants.php
(search "MYSQLI_TYPE_" in your browser)
bl at example dot com ¶
14 years ago
note that
"SELECT <timestamp-field>, ..."
will return the field with type 7 (timestamp) but with content like "2010-07-14 14:35:08". the point being it is a string.
"SELECT <timestamp-field> + 0, ..."
returns a type 5 (double) but while a number, is not seconds since epoch, but a number in MySQL's "YYYYMMDDHHMMSS" format, in this example:
20100714143508
(PHP 5.2.12)
deluxmozart at yahoo dot de ¶
16 years ago
Here are some Numbers of Datatypes. I searched for it but i didn't find a list, where the datatypes of the numbers are listed.
so first I can give this:
3 - Int
10 - Date
246 - Decimal
252 - text
253 - VarChar
254 - Boolean
gcdreak at example dot com ¶
15 years ago
I wrote a simple class to get info about fields.
Try it!
<?php
class MysqlFieldsInfo implements Iterator
{
private $result;
private $position;
private $row;
function __construct($result){
$this->result = $result;
$this->position = 0;
$this->rewind(); // W $results wewnętrzny wskaźnik może być przesunięty więc powracamy do początku
}
public function current(){
return $this->row;
}
public function next(){
$this->position++;
$this->row = $this->result->fetch_field();
}
public function valid(){
return (boolean) $this->row;
}
public function key(){
return $this->position;
}
public function rewind(){
$this->position = 0;
$this->result->field_seek(0);
$this->next();
}
// This function show data in table
public function export(){
echo '<table id="db_table_info">';
echo '<tr>
<th>Name</th>
<th>Orgname</th>
<th>Table</th>
<th>Orgtable</th>
<th>Def</th>
<th>Max_length</th>
<th>Length</th>
<th>Charsetnr</th>
<th>Flags</th>
<th>Type</th>
<th>Decimals</th>
</tr>';
while($this->valid()){
echo '<tr>';
printf("\n\t<td>%s</td>\n", $this->current()->name);
printf("\t<td>%s</td>\n", $this->current()->orgname);
printf("\t<td>%s</td>\n", $this->current()->orgtable);
printf("\t<td>%s</td>\n", $this->current()->def);
printf("\t<td>%s</td>\n", $this->current()->max_length);
printf("\t<td>%s</td>\n", $this->current()->length);
printf("\t<td>%s</td>\n", $this->current()->charsetnr);
printf("\t<td>%s</td>\n", $this->current()->flags);
printf("\t<td>%s</td>\n", $this->current()->type);
printf("\t<td>%s</td>\n", $this->current()->decimals);
echo '</tr>';
$this->next();
}
echo '</table>';
}
}
?>