• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 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.

    Object properties
    PropertyDescription
    nameThe name of the column
    orgnameOriginal column name if an alias was specified
    tableThe name of the table this field belongs to(if not calculated)
    orgtableOriginal table name if an alias was specified
    defReserved for default value, currently always ""
    dbDatabase(since PHP 5.3.6)
    catalogThe catalog name, always "def"(since PHP 5.3.6)
    max_lengthThe maximum width of the field for the result set.
    lengthThe width of the field, as specified in the table definition.
    charsetnrThe character set number for the field.
    flagsAn integer representing the bit-flags for the field.
    typeThe data type used for this field
    decimalsThe 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