mysqli_result::fetch_field()
(PHP 5, PHP 7)
Returns the next field in the result set
说明
面向对象风格
mysqli_result::fetch_field(void): object
过程化风格
mysqli_fetch_field(mysqli_result$result): object
Returns the definition of one column of a result set as an object. Call this function repeatedly to retrieve information about all columns in the result set.
参数
- $result
仅以过程化样式:由mysqli_query(),mysqli_store_result()或mysqli_use_result()返回的结果集标识。
返回值
Returns an object which contains field definition information or FALSE
if no field information is available.
Property | Description |
---|---|
name | The name of the column |
orgname | Original column name if an alias was specified |
table | The name of the table this field belongs to(if not calculated) |
orgtable | Original table name if an alias was specified |
def | Reserved for default value, currently always "" |
db | Database(since PHP 5.3.6) |
catalog | The catalog name, always "def"(since PHP 5.3.6) |
max_length | The maximum width of the field for the result set. |
length | The width of the field, as specified in the table definition. |
charsetnr | The character set number for the field. |
flags | An integer representing the bit-flags for the field. |
type | The data type used for this field |
decimals | The number of decimals used(for integer fields) |
范例
Example #1 面向对象风格
<?php $mysqli = new mysqli("localhost", "my_user", "my_password", "world"); /* check connection */ if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } $query = "SELECT Name, SurfaceArea from Country ORDER BY Code LIMIT 5"; if ($result = $mysqli->query($query)) { /* Get field information for all columns */ while ($finfo = $result->fetch_field()) { 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\n", $finfo->type); } $result->close(); } /* close connection */ $mysqli->close(); ?>
Example #2 过程化风格
<?php $link = mysqli_connect("localhost", "my_user", "my_password", "world"); /* check connection */ if (mysqli_connect_errno()) { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } $query = "SELECT Name, SurfaceArea from Country ORDER BY Code LIMIT 5"; if ($result = mysqli_query($link, $query)) { /* Get field information for all fields */ while ($finfo = mysqli_fetch_field($result)) { 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\n", $finfo->type); } mysqli_free_result($result); } /* close connection */ mysqli_close($link); ?>
以上例程会输出:
Name: Name Table: Country max. Len: 11 Flags: 1 Type: 254 Name: SurfaceArea Table: Country max. Len: 10 Flags: 32769 Type: 4
参见
- mysqli_num_fields() Get the number of fields in a result
- mysqli_fetch_field_direct() Fetch meta-data for a single field
- mysqli_fetch_fields() Returns an array of objects representing the fields in a result set
- mysqli_field_seek() Set result pointer to a specified field offset
here are the data types that correspond to the TYPE number returned by fetch_field. thought i would post this here since i couldn't find the info elsewhere. numerics ------------- BIT: 16 TINYINT: 1 BOOL: 1 SMALLINT: 2 MEDIUMINT: 9 INTEGER: 3 BIGINT: 8 SERIAL: 8 FLOAT: 4 DOUBLE: 5 DECIMAL: 246 NUMERIC: 246 FIXED: 246 dates ------------ DATE: 10 DATETIME: 12 TIMESTAMP: 7 TIME: 11 YEAR: 13 strings & binary ------------ CHAR: 254 VARCHAR: 253 ENUM: 254 SET: 254 BINARY: 254 VARBINARY: 253 TINYBLOB: 252 BLOB: 252 MEDIUMBLOB: 252 TINYTEXT: 252 TEXT: 252 MEDIUMTEXT: 252 LONGTEXT: 252
The flags used by MySql are: NOT_NULL_FLAG = 1 PRI_KEY_FLAG = 2 UNIQUE_KEY_FLAG = 4 BLOB_FLAG = 16 UNSIGNED_FLAG = 32 ZEROFILL_FLAG = 64 BINARY_FLAG = 128 ENUM_FLAG = 256 AUTO_INCREMENT_FLAG = 512 TIMESTAMP_FLAG = 1024 SET_FLAG = 2048 NUM_FLAG = 32768 PART_KEY_FLAG = 16384 GROUP_FLAG = 32768 UNIQUE_FLAG = 65536 To test if a flag is set you can use & like so: <?php $meta = $mysqli_result_object->fetch_field(); if ($meta->flags & 4) { echo 'Unique key flag is set'; } ?>
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); } ?>
The constants in a few other comments above appear to be inaccurate. Here are some more official references that seem quite hard to search. The "type" attribute: https://dev.mysql.com/doc/internals/en/com-query-response.html#column-type The "flags" attribute: https://github.com/google/mysql/blob/master/include/mysql_com.h#L133 In addition, all attributes are explained on the COM_QUERY_RESPONSE page too: https://dev.mysql.com/doc/internals/en/com-query-response.html#column-definition
The predefined constant values returned by the function get_predefined_constants() for: MYSQLI_TYPE_CHAR = 1 MYSQLI _TYPE_TINYINT = 1 If the code is used to categorized the type of field use this values will of course create confusion. For example: if($fieldtype === "CHAR"){ $field_html_attribute = "text"; $field_html_length = 1; } elseif($fieldtype === "TINYINT") { $field_html_attribute = "number"; $field_html_length = 1; } If an array is created to set the key as the numeric value and the value of that key as the the text title, TINYINT will be replaced by CHAR value. But is this process is reversed, then the code will select TINYINT if the foreach statement set to break when the numeric value of the flag equals the value of the current key as the first intance. Base in the note added by Johnathan at http://php.net/manual/en/mysqli.field-count.php the values should be: CHAR = 254 TINYINT = 1 But predefined function attributes the value 254 to MYSQLI_TYPE_STRING. Just for FYI
Beware the values of the predefined constants. They do not always correlate with the actual field types. For example: MYSQLI_TYPE_BLOB: 252 MYSQLI_TYPE_TINY_BLOB: 249 MYSQLI_TYPE_MEDIUM_BLOB: 250 MYSQLI_TYPE_LONG_BLOB: 251 MySQLi will indeed return a value of 252 for a tinytext field, but as you can see, this does not correspond to the value of MYSQLI_TYPE_TINY_BLOB.
It is not possible to get the values for an enum or set field through fetch_fields(). As far as I can tell this is because it hasn't been implemented in the mysqlnd api but whatever the reason it is not possible and you must issue a query like SHOW COLUMNS directly and interrogate the result to determine them. Incidentally you need to check the enum_flag rather than look for the enum_type to determine whether a field is enum or not. The type returned is usually some kind of string.
The constants for the TYPE number returned by fetch_field are enumerated here (MYSQLI_TYPE_*): http://php.net/manual/en/mysqli.constants.php