MySQL 函数
在线手册:中文  英文

mysql_fetch_field

(PHP 4, PHP 5)

mysql_fetch_field 从结果集中取得列信息并作为对象返回

说明

object mysql_fetch_field ( resource $result [, int $field_offset ] )

返回一个包含字段信息的对象。

mysql_fetch_field() 可以用来从某个查询结果中取得字段的信息。如果没有指定字段偏移量,则下一个尚未被 mysql_fetch_field() 取得的字段被提取。

对象的属性为:

Note: 此函数返回的字段名大小写敏感

Example #1 mysql_fetch_field()

<?php
mysql_connect
('localhost:3306'$user$password)
    or die(
"Could not connect: " mysql_error());
mysql_select_db("database");
$result mysql_query("select * from table")
    or die(
"Query failed: " mysql_error());
/* get column metadata */
$i 0;
while (
$i mysql_num_fields($result)) {
    echo 
"Information for column $i:<br />\n";
    
$meta mysql_fetch_field($result);
    if (!
$meta) {
        echo 
"No information available<br />\n";
    }
    echo 
"<pre>
blob:         
$meta->blob
max_length:   
$meta->max_length
multiple_key: 
$meta->multiple_key
name:         
$meta->name
not_null:     
$meta->not_null
numeric:      
$meta->numeric
primary_key:  
$meta->primary_key
table:        
$meta->table
type:         
$meta->type
unique_key:   
$meta->unique_key
unsigned:     
$meta->unsigned
zerofill:     
$meta->zerofill
</pre>"
;
    
$i++;
}
mysql_free_result($result);
?>

参见 mysql_field_seek()

参数

result

resource 型的结果集。此结果集来自对 mysql_query() 的调用。

field_offset

The numerical field offset. If the field offset is not specified, the next field that was not yet retrieved by this function is retrieved. The field_offset starts at 0.

返回值

Returns an object containing field information. The properties of the object are:

范例

Example #2 mysql_fetch_field() example

<?php
$conn 
mysql_connect('localhost''mysql_user''mysql_password');
if (!
$conn) {
    die(
'Could not connect: ' mysql_error());
}
mysql_select_db('database');
$result mysql_query('select * from table');
if (!
$result) {
    die(
'Query failed: ' mysql_error());
}
/* get column metadata */
$i 0;
while (
$i mysql_num_fields($result)) {
    echo 
"Information for column $i:<br />\n";
    
$meta mysql_fetch_field($result$i);
    if (!
$meta) {
        echo 
"No information available<br />\n";
    }
    echo 
"<pre>
blob:         
$meta->blob
max_length:   
$meta->max_length
multiple_key: 
$meta->multiple_key
name:         
$meta->name
not_null:     
$meta->not_null
numeric:      
$meta->numeric
primary_key:  
$meta->primary_key
table:        
$meta->table
type:         
$meta->type
unique_key:   
$meta->unique_key
unsigned:     
$meta->unsigned
zerofill:     
$meta->zerofill
</pre>"
;
    
$i++;
}
mysql_free_result($result);
?>

注释

Note: 此函数返回的字段名大小写敏感

参见


MySQL 函数
在线手册:中文  英文

用户评论:

mwwaygoo AT hotmail DOT com (2012-05-30 10:20:02)

Using mysql_fetch_field you can produce a more robust version of mysql_fetch_assoc.

When querying 2 tables with the same field names, generally you would need to use mysql_fetch_row to get an integer key'ed array rather than an associated key'ed array. This is because fields of the same name in the second table will over-write the data returned from the first table.
However this simple function will insert the table name prior to the field name for the key and prevent cross-overs.

ie SELECT *, 'test' AS test 4 FROM table AS T_1, table AS T_2 WHERE T_1.a=T_2.b

could produce:

mysql_fetch_assoc() returns
array(
'index'=>2,
'a'=>'pear',
'b'=>'apple',
'test'=>'test',
4=>4
)

mysql_fetch_table_assoc() returns
array(
'T_1.index' =>1,
'T_1.a'=>'apple',
'T_1.b'=>'banana',
'T_2.index'=>2,
'T_2.a'=>'pear',
'T_2.b'=>'apple',
'test'=>'test',
4=>4
)

<?php
function mysql_fetch_table_assoc($resource)
{
    
// function to get all data from a query, without over-writing the same field
    // by using the table name and the field name as the index
    
    // get data first
    
$data=mysql_fetch_row($resource);
    if(!
$data) return $data// end of data
    
    // get field info
    
$fields=array();
    
$index=0;
    
$num_fields=mysql_num_fields($resource);
    while(
$index<$num_fields)
    {
        
$meta=mysql_fetch_field($resource$index);
        if(!
$meta)
        {
            
// if no field info then just use index number by default
            
$fields[$index]=$index;
        }
        else
        {
            
$fields[$index]='';
            
// deal with field aliases - ie no table name (SELECT T_1.a AS temp)
            
if(!empty($meta->table)) $fields[$index]=$meta->table.'.';
            
// deal with raw data - ie no field name (SELECT 1)
            
if(!empty($meta->name))  $fields[$index].=$meta->name; else $fields[$index].=$index;
        }
        
$index++;
    }
    
$assoc_data=array_combine($fields$data);
    return 
$assoc_data;
}
?>

Daniel B (2012-03-26 02:56:15)

Simple function to display all data in a query...
function dumpquery($query) {
$numfields = mysql_num_fields($query);
echo '<table border="1" bgcolor="white"><tr>';
for ($i = 0; $i<$numfields; $i += 1) {
$field = mysql_fetch_field($query, $i);
echo '<th>' . $field->name . '</th>';
}
echo '</tr>';
while ($fielddata = mysql_fetch_array($query)) {
echo '<tr>';
for ($i = 0; $i<$numfields; $i += 1) {
$field = mysql_fetch_field($query, $i);
echo '<td>' . $fielddata[$field->name] . '</td>';
}
echo '</tr>';
}
echo '</table>';
}

lucien at ocia dot nl (2012-02-04 13:08:11)

Performance Notes!

I used this script for testing, the table has 26 colums.

<?php
$t_start 
microtime(true);
$sql mysql_query("SELECT * FROM `table` LIMIT 1") or trigger_error(mysql_error(), E_USER_WARNING);
for (
$i 0$i mysql_num_fields($sql); $i++) {
    
$meta mysql_fetch_field($sql$i);
    echo 
"Information for column ".$meta->name.":\n";
    echo 
"\tblob:         $meta->blob
\tmax_length:   
$meta->max_length
\tmultiple_key: 
$meta->multiple_key
\tname:         
$meta->name
\tnot_null:     
$meta->not_null
\tnumeric:      
$meta->numeric
\tprimary_key:  
$meta->primary_key
\ttable:        
$meta->table
\ttype:         
$meta->type
\tunique_key:   
$meta->unique_key
\tunsigned:     
$meta->unsigned
\tzerofill:     
$meta->zerofill
"
;
}
$t_stop microtime(true);
$t_proc $t_stop $t_start;
echo 
"processing time query 1: ".number_format($t_proc 10003)." ms\n";
unset(
$t_start);
unset(
$t_stop);
unset(
$t_proc);
$t_start microtime(true);
$sql mysql_query("DESCRIBE `table`");
while (
$res mysql_fetch_array($sqlMYSQL_ASSOC)) {
    
print_r($res);
}
$t_stop microtime(true);
$t_proc $t_stop $t_start;
echo 
"processing time query 2: ".number_format($t_proc 10003)." ms\n";
?>

Query 1 => 0.444 ms
Query 2 => 1.146 ms

So for easy usage, Query 2 is advised... But if your a performance-geek, you should use Query 1.

eviltofu at gmail dot com (2011-07-08 17:58:35)

MYSQLI_TYPE_BLOB indicates the field is a BLOB or a TEXT. I think you would need to check the blob value. If its true then it's a BLOB, otherwise it's a TEXT. Can someone confirm?

Jonathan (2010-07-30 17:45:35)

It should be noted that the primary_key member variable is only set to 1 if the primary key on the table is only on that 1 field. If you have a table that has a multiple column primary key, then you will not get what you might expect.
For example:
CREATE TABLE `line_item_table` (
`liForeignKey1` int(11) unsigned not null,
`liForeignKey2` int(11) unsigned not null,
PRIMARY KEY (`liForeignKey1`, `liForeignKey2`)
) ENGINE=MyISAM;
While you might expect that primary_key == 1 for both columns; var_dump() will show you that you get the following for both fields:
["primary_key"]=>int(0)
This is as of PHP 5.2.13 and MySQL 5.0.51

mewsterus at yahoo dot com (2009-07-07 11:18:41)

A nice function to return an array of all fields for a particular table. I've added a few very useful properties to the spec:

'len', which is supplied by the mysql_field_len() function.
'definition', which is a column_definition which could be used to initialize the table.
'auto_increment', which is 1 if the field is auto_increment.

<?php
function mysql_fetch_fields($table) {
        
// LIMIT 1 means to only read rows before row 1 (0-indexed)
        
$result mysql_query("SELECT * FROM $table LIMIT 1");
        
$describe mysql_query("SHOW COLUMNS FROM $table");
        
$num mysql_num_fields($result);
        
$output = array();
        for (
$i 0$i $num; ++$i) {
                
$field mysql_fetch_field($result$i);
                
// Analyze 'extra' field
                
$field->auto_increment = (strpos(mysql_result($describe$i'Extra'), 'auto_increment') === FALSE 1);
                
// Create the column_definition
                
$field->definition mysql_result($describe$i'Type');
                if (
$field->not_null && !$field->primary_key$field->definition .= ' NOT NULL';
                if (
$field->def$field->definition .= " DEFAULT '" mysql_real_escape_string($field->def) . "'";
                if (
$field->auto_increment$field->definition .= ' AUTO_INCREMENT';
                if (
$key mysql_result($describe$i'Key')) {
                        if (
$field->primary_key$field->definition .= ' PRIMARY KEY';
                        else 
$field->definition .= ' UNIQUE KEY';
                }
                
// Create the field length
                
$field->len mysql_field_len($result$i);
                
// Store the field into the output
                
$output[$field->name] = $field;
        }
        return 
$output;
}

// Example:
mysql_connect('localhost''user''pass');
mysql_select_db('database');
$fields mysql_fetch_fields('table');
foreach (
$fields as $key => $field) {
        echo 
$field->name ' ' $field->definition "\n";
}

// May output:
// field1 char(8)
// field2 int PRIMARY KEY
// field3 int AUTO_INCREMENT UNIQUE KEY
// field4 mediumtext NOT NULL DEFAULT 'I\'m a little teapot'
?>

TALU (2009-02-04 08:16:14)

XML generation.

Bit of a security risk allowing parameters to select db and table on live server (unless user is restricted or replace the $_GET with fixed value.)

Outputs xml with standard format for <config> part to generate forms in flash.

<?php
    
//
    //    makeXML.php?db=dbname&table=tablename
    //
    
    
set_time_limit(300);
        
    
$host "localhost";
    
$user "root";
    
$password "root";
    
    
$database $_GET['db'];    
    
$table $_GET['table'];
    
    
mysql_connect($host,$user,$password);
    @
mysql_select_db($database) or die( "Unable to select database");
    

    
$querytext="SELECT * FROM ".$table;  
    
$result=mysql_query($querytext);
    
    if (
$result){
        
$num=mysql_num_rows($result);
    }else{
        
$num=0;
    }
    
?>
<?php 
    header
('Content-Type: text/xml');
     echo 
"<?xml version='1.0'?>"
     
     if (
$num 0){
 
?>
<<?php  echo $table?>>
    <config>
        <?php
            
// Display number of fields
            
echo "<numFields>".mysql_num_fields($result)."</numFields>";
            
$i 0;
            
$primaryKey "";
            
$nameArray = array(); 
            
$maxLengthArray = array(); 
            
$typeArray = array(); 
            while (
$i mysql_num_fields($result)) {
                
$meta mysql_fetch_field($result$i);
                
$nameArray[$i] = $meta->name;
                
$maxLengthArray[$i] = $meta->max_length;
                
$typeArray[$i] = $meta->type;
                if (
$meta->primary_key){
                    
$primaryKey $meta->name;
                }
                
$i++;
            }
            
$i 0;
            echo 
"<fieldNames>";
            while (
$i count($nameArray)) {
                echo 
"<field".$i.">".$nameArray[$i]."</field".$i.">";
                
$i++;
            }
            echo 
"</fieldNames>";
            
$i 0;
            echo 
"<fieldMaxLength>";
            while (
$i count($maxLengthArray)) {
                echo 
"<field".$i.">".$maxLengthArray[$i]."</field".$i.">";
                
$i++;
            }
            echo 
"</fieldMaxLength>";
            
$i 0;
            echo 
"<fieldType>";
            while (
$i count($typeArray)) {
                echo 
"<field".$i.">".$typeArray[$i]."</field".$i.">";
                
$i++;
            }
            echo 
"</fieldType>";
        
?>
        <primaryKey><?php  echo $primaryKey?></primaryKey>
        <numRecords><?php  echo $num?></numRecords>
    </config>
<?php  
    $i
=0;
    while (
$i $num) {
        
$ID=mysql_result($result,$i,"ID");
        
$value=mysql_result($result,$i,"value");
        
$title=mysql_result($result,$i,"title");
        
$description=mysql_result($result,$i,"description");
?>
    <row>
        <ID><?php  echo $ID?></ID>
        <weighting><?php  echo $value?></weighting>
        <title><?php  echo $title?></title>
        <description><?php  echo $description?></description>
    </row>
<?php 
        $i 
$i 1;
    } 
?>
</<?php  echo $table?>>

<?php 
    

?>

php [spat] hm2k.org (2008-11-04 15:22:32)

An improvement on the earlier mysql_column_exists function.

<?php

function mysql_column_exists($table_name$column_name$link=false) {
    
$result = @mysql_query("SHOW COLUMNS FROM $table_name LIKE '$column_name'"$link);
    return (
mysql_num_rows($result) > 0);
}

?>

jorachim at geemail dot com (2008-09-25 13:09:38)

If you want the fields in a table, a simple DESCRIBE query will work:

<?php
$query 
="DESCRIBE Users";
$result mysql_query($query);

echo 
"<ul>";

while(
$i mysql_fetch_assoc($result))
     echo 
"<li>{$i['Field']}</li>";

echo 
"</ul>";
?>

Should do the trick.

david at vitam dot be (2008-06-10 05:57:22)

A little function to help coders to distinct the tablename from a multiselect query where some fields has the same name in differents tables.

<?php
public function sql($sql) {
    
$T_Return=array();
    
$result=@mysql_query($sql);
    
    
$i=0;
    while (
$i mysql_num_fields($result)) {            
        
$fields[]=mysql_fetch_field($result$i);
        
$i++;
    }
    
    while (
$row=mysql_fetch_row($result)) {                
        
$new_row=array();
        for(
$i=0;$i<count($row); $i++) {
            
$new_row$fields[$i]->table][$fields[$i]->name]=$row[$i];
        }
        
$T_Return[]=$new_row;
    }

    
    return 
$T_Return;
}
?>

dheep (2008-06-03 20:56:46)

Simple PHP script for displaying the field names. Presuming the database is seleected already.

<?php
$sql 
"SELECT * FROM table_name;";
$result mysql_query($sql);
$i 0;
while(
$i<mysql_num_fields($result))
{
  
$meta=mysql_fetch_field($result,$i);
  echo 
$i.".".$meta->name."<br />";
  
$i++;
}
?>

OUTPUt:
0.id
1.todo
2.due date
3.priority
4.type
5.status
6.notes

hope this is useful.

Nick Baicoianu (2005-09-15 11:18:20)

Be sure to note that $max_length is the length of the longest value for that field in the returned dataset, NOT the maximum length of data that column is designed to hold.

php at brayra dot com (2002-03-21 16:09:30)

I needed to get the field information and the enum/set values. Here is the function I created to expand the object returned by mysql_fetch_field. I also, decided to return all the fields for a table in an array of field objects by "name" and position much like mysql_fetch_array does.

You could test it by using:

<?php
$myfields 
GetFieldInfo('test_table');
print 
"<pre>";
print_r($myfields);
print 
"</pre>";
?>


The field objects now have 'len', 'values' and 'flags' parameters. 
NOTE: 'values' only has data for set and enum fields.

<?php
//This assumes an open database connection
//I also use a constant DB_DB for current database.
function GetFieldInfo($table)
{
  if(
$table == '') return false;
  
$fields mysql_list_fields(DB_DB$table);
  if(
$fields){
    
$columns mysql_query('show columns from ' $table);
    if(
$columns){
      
$num mysql_num_fields($fields);
      for(
$i=0$i $num; ++$i){
        
$column mysql_fetch_array($columns);
        
$field mysql_fetch_field($fields$i);
        
$flags mysql_field_flags($fields$i);
        if(
$flags == ''$flags=array();
        else 
$flags explode(' ',$flags);
        if (
ereg('enum.(.*).',$column['Type'],$match))
          
$field->values explode(',',$match[1]);
        if (
ereg('set.(.*).',$column['Type'],$match))
          
$field->values explode(',',$match[1]);
        if(!
$field->values$field->values = array();
        
$field->flags $flags;
        
$field->len mysql_field_len($fields$i);
        
$result_fields[$field->name] = $field;
        
$result_fields[$i] = $field;
      }
      
mysql_free_result($columns);
    }
    
mysql_free_result($fields);
    return 
$result_fields;
  }
  return 
false;
}
?>

hope someone else finds this useful.

krang at krang dot org dot uk (2002-03-10 06:12:38)

The field type returns what PHP classifies the data found in the field, not how it is stored in the database; use the following example to retrieve the MySQL information about the field....

<?php
$USERNAME 
'';
$PASSWORD '';

$DATABASE '';
$TABLE_NAME '';

mysql_connect('localhost'$USERNAME$PASSWORD)
    or die (
"Could not connect");

$result mysql_query("SHOW FIELDS FROM $DATABASE.$TABLE_NAME");

$i 0;

while (
$row mysql_fetch_array($result)) {
  echo 
$row['Field'] . ' ' $row['Type'];
}
?>

易百教程