PHP Doku:: Liefert ein Objekt mit Feldinformationen aus einem Anfrageergebnis - function.mysql-fetch-field.html

Verlauf / Chronik / History: (1) anzeigen

Sie sind hier:
Doku-StartseitePHP-HandbuchFunktionsreferenzDatenbankerweiterungenAnbieterspezifische DatenbankerweiterungenMySQLMySQL Funktionenmysql_fetch_field

Ein Service von Reinhard Neidl - Webprogrammierung.

MySQL Funktionen

<<mysql_fetch_assoc

mysql_fetch_lengths>>

mysql_fetch_field

(PHP 4, PHP 5)

mysql_fetch_field Liefert ein Objekt mit Feldinformationen aus einem Anfrageergebnis

Beschreibung

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

Gibt ein Objekt zurück das Feldinformationen enthält. Diese Funktion kann benutzt werden um Informationen über Felder im übergebenen Abfrageergebnis zu erhalten.

Parameter-Liste

Ergebnis

Das Ergebnis Ressource, das ausgewertet wird. Dieses Ergebnis kommt von einem Aufruf von mysql_query().

field_offset

Der numerische Feldoffset. Wird dieser nicht angegeben so werden die Informationen über das nächste bisher noch nicht von dieser Der Feldoffset startet bei 0.

Rückgabewerte

Liefert ein object mit Feldinformationen. Die Eigenschaften des Objekts sind:

  • name - Feldname
  • def - Vorgabewert des Feldes
  • table - Name der Tabelle zu der das Feld gehört
  • max_length - maximale Länge des Feldes
  • not_null - 1, wenn das Feld nicht NULL sein kann
  • primary_key - 1, wenn das Feld ein primary key ist
  • unique_key - 1, wenn das Feld ein unique key ist
  • multiple_key - 1, wenn das Feld ein non-unique key ist
  • numeric - 1, wenn das Feld vom Typ 'numeric' ist
  • blob - 1, wenn das Feld vom Typ 'BLOB' ist
  • type - der Typ des Feldes
  • unsigned - 1, wenn das Feld vorzeichenlos ist
  • zerofill - 1, wenn das Feld zero-filled ist

Beispiele

Beispiel #1 mysql_fetch_field() Beispiel

<?php
$conn 
mysql_connect('localhost''mysql_user''mysql_password');
if (!
$conn) {
    die(
'Keine Verbindung möglich: ' mysql_error());
}
mysql_select_db('database');
$result mysql_query('select * from table');
if (!
$result) {
    die(
'Anfrage fehlgeschlagen: ' mysql_error());
}
/* Metadaten der Felder */
$i 0;
while (
$i mysql_num_fields($result)) {
    echo 
"Information für Feld $i:<br />\n";
    
$meta mysql_fetch_field($result$i);
    if (!
$meta) {
        echo 
"Keine Information vorhanden<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
default:      
$meta->def
unique_key:   
$meta->unique_key
unsigned:     
$meta->unsigned
zerofill:     
$meta->zerofill
</pre>"
;
    
$i++;
}
mysql_free_result($result);
?>

Anmerkungen

Hinweis: Feldnamen, die von dieser Funktion zurückgegeben werden, unterscheiden sich in der Groß-/Kleinschreibung.

Siehe auch


10 BenutzerBeiträge:
- Beiträge aktualisieren...
Jonathan
31.07.2010 2:45
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
7.07.2009 20:18
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 ? 0 : 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
4.02.2009 17:16
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
5.11.2008 0:22
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
25.09.2008 22:09
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
10.06.2008 14:57
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
4.06.2008 5:56
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
15.09.2005 20:18
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
22.03.2002 1: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:

<?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
10.03.2002 15: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....

<?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'];
}
?>



PHP Powered Diese Seite bei php.net
The PHP manual text and comments are covered by the Creative Commons Attribution 3.0 License © the PHP Documentation Group - Impressum - mail("TO:Reinhard Neidl",...)