mysql_fetch_field

(PHP 4, PHP 5)

mysql_fetch_fieldВозвращает информацию о колонке из результата запроса в виде объекта

Внимание

Данное расширение устарело, начиная с версии PHP 5.5.0, и будет удалено в будущем. Используйте вместо него MySQLi или PDO_MySQL. Смотрите также инструкцию MySQL: выбор API и соответствующий FAQ для получения более подробной информации. Альтернативы для данной функции:

Описание

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

Возвращает объект, содержащий информацию о колонке. Эту функцию можно использовать для получения информации о полях в переданном результате запроса.

Список параметров

result

Обрабатываемый результат запроса. Этот результат может быть получен с помощью функции mysql_query().

field_offset

Числовое смещение поля. Если смещение не указано, функция возвращает информацию о первой колонке, которая ещё не была обработана этой функцией. Нумерация field_offset начинается с 0.

Возвращаемые значения

Возвращает object, содержащий информацию о колонке. Объект содержит следующие свойства:

  • name - название колонки
  • table - название таблицы, которой принадлежит колонка, или псевдоним таблицы, если он был определен
  • max_length - максимальная длина колонки
  • not_null - 1, если колонка не может быть NULL
  • primary_key - 1, если колонка является первичным индексом
  • unique_key - 1, если колонка является уникальным индексом
  • multiple_key - 1, если колонка является неуникальным индексом
  • numeric - 1, если колонка численная
  • blob - 1, если колонка является BLOB
  • type - тип колонки
  • unsigned - 1, если колонка не содержит знака (unsigned)
  • zerofill - 1, если колонка заполняется нулями (zero-filled)

Примеры

Пример #1 Пример использования mysql_fetch_field()

<?php
$conn 
mysql_connect('localhost''mysql_user''mysql_password');
if (!
$conn) {
    die(
'Ошибка при соединении: ' mysql_error());
}
mysql_select_db('database');
$result mysql_query('select * from table');
if (!
$result) {
    die(
'Ошибка в запросе: ' mysql_error());
}
/* получаем данные о колонке */
$i 0;
while (
$i mysql_num_fields($result)) {
    echo 
"Информация о колонке $i:<br />\n";
    
$meta mysql_fetch_field($result$i);
    if (!
$meta) {
        echo 
"Информация недоступна<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);
?>

Примечания

Замечание: Имена полей, возвращаемые этой функцией являются регистро-зависимыми.

Замечание:

Если поля или таблицы имеют дополнительные имена в запросе SQL, то будет возвращены эти дополнительные имена. Исходное имя может быть получено, например, с помощью mysqli_result::fetch_field().

Смотрите также

  • mysql_field_seek() - Устанавливает внутренний указатель результата на переданное смещение поля

Коментарии

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'];
}
?>
2002-03-10 08:12:38
http://php5.kiev.ua/manual/ru/function.mysql-fetch-field.html
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.
2002-03-21 18:09:30
http://php5.kiev.ua/manual/ru/function.mysql-fetch-field.html
Автор:
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.
2005-09-15 14:18:20
http://php5.kiev.ua/manual/ru/function.mysql-fetch-field.html
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;
}
?>
2008-06-10 08:57:22
http://php5.kiev.ua/manual/ru/function.mysql-fetch-field.html
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.
2008-09-25 16:09:38
http://php5.kiev.ua/manual/ru/function.mysql-fetch-field.html
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);
}

?>
2008-11-04 17:22:32
http://php5.kiev.ua/manual/ru/function.mysql-fetch-field.html
Автор:
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 
   

?>
2009-02-04 10:16:14
http://php5.kiev.ua/manual/ru/function.mysql-fetch-field.html
Автор:
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
2010-07-30 20:45:35
http://php5.kiev.ua/manual/ru/function.mysql-fetch-field.html
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?
2011-07-08 20:58:35
http://php5.kiev.ua/manual/ru/function.mysql-fetch-field.html
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.
2012-02-04 15:08:11
http://php5.kiev.ua/manual/ru/function.mysql-fetch-field.html
Автор:
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>';   
}
2012-03-26 05:56:15
http://php5.kiev.ua/manual/ru/function.mysql-fetch-field.html
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;
}
?>
2012-05-30 13:20:02
http://php5.kiev.ua/manual/ru/function.mysql-fetch-field.html

    Поддержать сайт на родительском проекте КГБ