search for in the  
<mysql_fetch_assocmysql_fetch_lengths>
Last updated: Thu, 19 May 2005

mysql_fetch_field

(PHP 3, PHP 4, PHP 5)

mysql_fetch_field -- Get column information from a result and return as an object

Description

object mysql_fetch_field ( resource result [, int field_offset] )

Returns an object containing field information. This function can be used to obtain information about fields in the provided query result.

Parameters

result

The result resource that is being evaluated. This result comes from a call to 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.

Return Values

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

  • name - column name

  • table - name of the table the column belongs to

  • max_length - maximum length of the column

  • not_null - 1 if the column cannot be NULL

  • primary_key - 1 if the column is a primary key

  • unique_key - 1 if the column is a unique key

  • multiple_key - 1 if the column is a non-unique key

  • numeric - 1 if the column is numeric

  • blob - 1 if the column is a BLOB

  • type - the type of the column

  • unsigned - 1 if the column is unsigned

  • zerofill - 1 if the column is zero-filled

Examples

Example 1. mysql_fetch_field() example

<?php
$conn
= mysql_connect('localhost:3306', 'user', '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);
?>

Notes

Note: Field names returned by this function are case-sensitive.



User Contributed Notes
mysql_fetch_field
creak at foolstep dot com
17-Jul-2003 05:26
Sorry, the last pattern doesn't work with type whithout length, so it would be better if you change it with this one :
   "^([a-zA-Z]+)\(?([^\)]*)\)?$"

It's still $type[1] for the type and $type[2] for the length.

Creak
blakjak at nospam dot com
27-Mar-2003 04:18
mysql_fetch_field will fail if your result set's internal pointer has advanced past the end of the result.

So, if you use ...

$result = mysql_query("select * from person where id=1"); // returns 1 row
$row = mysql_fetch_row($result);

while($field = mysql_fetch_field){
 echo $field->name;
}

... you won't see any fields.  If you need to use mysql_fetch_field, you need to do it before you've iterated through all the rows in the result set.
kflam at awc dot net dot au
18-Jun-2002 10:56
#Input: the table name and the enum field
#Output: an array that stores all options of the enum field or
#false if the input field is not an enum
function getEnumOptions($table, $field) {
   $finalResult = array();

   if (strlen(trim($table)) < 1) return false;
   $query  = "show columns from $table";
   $result = mysql_query($query);
   while ($row = mysql_fetch_array($result)){
       if ($field != $row["Field"]) continue;
       //check if enum type
       if (ereg('enum.(.*).', $row['Type'], $match)) {
           $opts = explode(',', $match[1]);
           foreach ($opts as $item)
               $finalResult[] = substr($item, 1, strlen($item)-2);
       }
       else
               return false;
   }
   return $finalResult;
}

The function could be handy when making a selection option without typing all the options items respectively.
chrisshaffer at bellsouth dot net
06-Jun-2002 01:22
Slight error in the above comment:
$fieldLen = split("','",substr(1,-1,$fieldLen));

should read:
$fieldLen = split("','",substr($fieldLen,1,-1));

oops! ;)

I did take the above code (which saved me at least two hours worth of work), and massaged it into a function:

function mysql_enum_values($tableName,$fieldName)
{
  $result = mysql_query("DESCRIBE $tableName");

  //then loop:
  while($row = mysql_fetch_array($result))
  {
   //# row is mysql type, in format "int(11) unsigned zerofill"
   //# or "enum('cheese','salmon')" etc.

   ereg('^([^ (]+)(\((.+)\))?([ ](.+))?$',$row['Type'],$fieldTypeSplit);
   //# split type up into array
   $ret_fieldName = $row['Field'];
   $fieldType = $fieldTypeSplit[1];// eg 'int' for integer.
   $fieldFlags = $fieldTypeSplit[5]; // eg 'binary' or 'unsigned zerofill'.
   $fieldLen = $fieldTypeSplit[3]; // eg 11, or 'cheese','salmon' for enum.

   if (($fieldType=='enum' || $fieldType=='set') && ($ret_fieldName==$fieldName) )
   {
     $fieldOptions = split("','",substr($fieldLen,1,-1));
     return $fieldOptions;
   }
  }

  //if the funciton makes it this far, then it either
  //did not find an enum/set field type, or it
  //failed to find the the fieldname, so exit FALSE!
  return FALSE;

}

The most useful thing that I can think to do with this is to populate a HTML Dropdown box with it:

echo "<SELECT NAME=\"Select\" SIZE='1'>";
foreach($fieldOptions as $tmp)
{
  echo "<OPTION>$tmp";
}

Hope this helps  :D
justin at quadmyre dot com
18-Apr-2002 07:00
Same problem, slightly different solution.

$result = mysql_query("DESCRIBE tablename");
# or SHOW COLUMNS FROM
# or SHOW FIELDS FROM

then loop:

$row = mysql_fetch_array($result);
# row is mysql type, in format "int(11) unsigned zerofill"
# or "enum('cheese','salmon')" etc.

ereg('^([^ (]+)(\((.+)\))?([ ](.+))?$',$row['Type'],$fieldTypeSplit);
# split type up into array

$fieldType = $fieldTypeSplit[1]; # eg 'int' for integer.
$fieldFlags = $fieldTypeSplit[5]; # eg 'binary' or 'unsigned zerofill'.
$fieldLen = $fieldTypeSplit[3]; # eg 11, or 'cheese','salmon' for enum.

You might then like to:

if ($fieldType=='enum' or $fieldType=='set')
  $fieldLen = split("','",substr(1,-1,$fieldLen));

So for enum or set types, $fieldLen becomes an array of possible values.

Hope that helps someone out there...
php at brayra dot com
21-Mar-2002 06:09
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:
$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.

//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
10-Mar-2002 08:12
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....

$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'];
}
etiennesky at hotmail dot com
14-Oct-2001 03:55
If you need the 'Default' value of a column, you can use

$meta->def

to get it as in example 1. 

This has not been documented yet and can sure save others some time.
dave at techweavers dot net
04-Oct-2000 03:48
If you want to get the max length of a column not just the data use this:
$result = mysql_query ("SELECT * FROM table");
$fields = mysql_num_fields ($result);
$i = 0;
while ($i < $fields) {
$len  = mysql_field_len  ($result, $i);
$i++;
}
Or refer to http://www.php.net/manual/function.mysql-field-type.php

<mysql_fetch_assocmysql_fetch_lengths>
 Last updated: Thu, 19 May 2005
Copyright © 2001-2005 The PHP Group
All rights reserved.
This unofficial mirror is operated at: The Server Pages
Last updated: Thu May 19 17:35:34 2005 CDT