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'
?>
mysql_fetch_field
(PHP 4, PHP 5)
mysql_fetch_field — Obtém informações sobre uma coluna de um resultado e retorna como um objeto
Descrição
Retorna um objeto contendo informações sobre o campo. Esta função pode ser usada para obter informações sobre os campos de um resultado de uma consulta.
Parâmetros
- result
-
O resultado resource que esta sendo avaliado. Este resultado vem de uma chamada a mysql_query().
- field_offset
-
O índice numérico do campo. Se o índice não for especificado, o próximo campo que não tenha sido obtido por esta função é retornado. O parâmetro field_offset começa em 0.
Valor Retornado
Retorna um object contendo a informação sobre o campo. As propriedades do objeto são:
- name - nome da coluna
- table - a tabela a qual o objeto pertence
- def - o valor padrão da coluna
- max_length - o limite de tamanho da coluna
- not_null - 1 se a coluna não puder ser NULL
- primary_key - 1 se a coluna é a chave primária
- unique_key - 1 se a coluna é a chave única
- multiple_key - 1 se a coluna é uma chave não-única
- numeric - 1 se a coluna é numérica
- blob - 1 se a coluna é um BLOB
- type - o tipo da coluna
- unsigned - 1 se a coluna é sem sinal
- zerofill - 1 se a coluna é prenchida com zero
Exemplos
Exemplo #1 Exemplo mysql_fetch_field()
<?php
$conn = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$conn) {
die('Não foi possível conectar: ' . mysql_error());
}
mysql_select_db('database');
$result = mysql_query('select * from table');
if (!$result) {
die('A consulta falhou: ' . mysql_error());
}
/* obtém as informações da coluna */
$i = 0;
while ($i < mysql_num_fields($result)) {
echo "Informação para a coluna $i:<br />\n";
$meta = mysql_fetch_field($result, $i);
if (!$meta) {
echo "Sem informação disponível<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);
?>
Notas
Nota: Nomes de campos nesta função diferenciam maiúsculas e minusculas.
mysql_fetch_field
07-Jul-2009 04:18
04-Feb-2009 02: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
}
?>
04-Nov-2008 09: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);
}
?>
25-Sep-2008 06: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.
10-Jun-2008 10: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;
}
?>
04-Jun-2008 01: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.
15-Sep-2005 04: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.
21-Mar-2002 10: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.
10-Mar-2002 12: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'];
}
?>
