mysql_field_flags

(PHP 4, PHP 5)

mysql_field_flags从结果中取得和指定字段关联的 flags

警告

本扩展自 PHP 5.5.0 起已废弃,并在自 PHP 7.0.0 开始被移除。应使用 MySQLiPDO_MySQL 扩展来替换之。参见 MySQL:选择 API 指南来获取更多信息。用以替代本函数的有:

说明

mysql_field_flags(resource $result, int $field_offset): string|false

mysql_field_flags() 返回指定字段的字段 flags。每个 flag 都用一个单词表示,之间用一个空格分开,因此可以用 explode() 将返回值分开。

参数

result

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

field_offset

数值型字段偏移量。 field_offset0 开始。如果 field_offset 不存在,则会发出一个 E_WARNING 级别的错误

返回值

Returns a string of flags associated with the result 或者在失败时返回 false.

如果 MySQL 版本足够新,以便支持这些 flag,则会报告以下 flag:"not_null""primary_key""unique_key""multiple_key""blob""unsigned""zerofill","binary""enum""auto_increment""timestamp"

示例

示例 #1 mysql_field_flags() 示例

<?php
$result
= mysql_query("SELECT id,email FROM people WHERE id = '42'");
if (!
$result) {
echo
'Could not run query: ' . mysql_error();
exit;
}
$flags = mysql_field_flags($result, 0);

echo
$flags;
print_r(explode(' ', $flags));
?>

以上示例的输出类似于:

not_null primary_key auto_increment
Array
(
    [0] => not_null
    [1] => primary_key
    [2] => auto_increment
)

注释

注意:

为了向下兼容,可以使用下列已废弃的别名: mysql_fieldflags()

参见

add a note add a note

User Contributed Notes 10 notes

up
3
amir at scrounch dot com
21 years ago
returns primary keys of a table using 'show keys'
although it is possible to use desc, show keys offers possible enhancements such a getting sequence in index along with it

function getPrimaryKeyOf($table, $link) {
  $pk = Array();

  $sql = 'SHOW KEYS FROM `'.$table.'`';
  $res = mysql_query($table, $link) or die(mysql_error());
  while ($row = mysql_fetch_assoc($res)) {
    if ($row['Key_name']=='PRIMARY')
      array_push($pk, $row['Column_name']);
  }
  return $pk;
}
up
2
cufarley at nirvanet dot net
23 years ago
Using the "DESC TableName" command may also do the trick and is a bit shorter.
up
1
play at arcadevillage dot com
15 years ago
To really backup the database values, I made a little changement :

My code really looks like bomas 's code, but there is an important diffence :

<?php
$nbc
= mysql_num_fields($req_table);
while (
$ligne = mysql_fetch_array($req_table))
  {
   
$insertions = "INSERT INTO $table VALUES(";
     for (
$i=0; $i<$nbc; $i++)
        {
          if (
$i > 0 ) $insertions .= ", ";
          if ( !isset(
$ligne[$i]))
           
$insertions .= "NULL";
          else
           
$insertions .= "'" . mysql_real_escape_string($ligne[$i]). "'";
        }
    
$insertions .= ");";
    
$dumpsql[] = $insertions;
   }
?>

$dumpslq is the variable where I put the insertion orders before writting them in a text file.

Before, I test that the values if not NULL into the field because it is the only way to make the difference, for example for string text fields, between NULL values and empty strings.

If you don't make this test, you should find empty string instead of NULL values when you do the backup.
up
0
pike-php at kw dot nl
19 years ago
ok, sorry for the code bloat :) but this is how I
get the full power of mysql's DESCRIBE table statement, in
an associative array, including defaults, enum values, float radix et all.

it assumes mysql returns the type as
   "type[(arg[,arg..])] [ add]"
like
   "float(20,6) unsigned"
   "enum('yes','no')"
etc

<?

function getFields($tablename) {
   
       
$fields = array();
       
$fullmatch         = "/^([^(]+)(\([^)]+\))?(\s(.+))?$/";
       
$charlistmatch     = "/,?'([^']*)'/";
       
$numlistmatch     = "/,?(\d+)/";
       
       
$fieldsquery .= "DESCRIBE $tablename";
       
$result_fieldsquery = mysql_query($fieldsquery) or die(mysql_error());
        while (
$row_fieldsquery = mysql_fetch_assoc($result_fieldsquery)) {
           
           
$name     = $row_fieldsquery['Field'];
           
$fields[$name] = array();
           
$fields[$name]["type"]         = "";
           
$fields[$name]["args"]         = array();
           
$fields[$name]["add"]          = "";
           
$fields[$name]["null"]        = $row_fieldsquery['Null'];
           
$fields[$name]["key"]        = $row_fieldsquery['Key'];
           
$fields[$name]["default"]    = $row_fieldsquery['Default'];
           
$fields[$name]["extra"]        = $row_fieldsquery['Extra'];
           
           
$fulltype     = $row_fieldsquery['Type'];
           
$typeregs = array();
           
            if (
preg_match($fullmatch, $fulltype, $typeregs)) {
               
$fields[$name]["type"] = $typeregs[1];
                if (
$typeregs[4]) $fields[$name]["add"] = $typeregs[4];
               
$fullargs = $typeregs[2];
               
$argsreg = array();
                if (
preg_match_all($charlistmatch, $fullargs, $argsreg)) {
                   
$fields[$name]["args"] = $argsreg[1];
                } else {
                   
$argsreg = array();
                    if (
preg_match_all($numlistmatch, $fullargs, $argsreg)) {
                       
$fields[$name]["args"] = $argsreg[1];
                    } else die(
"cant parse type args: $fullargs");
                }
            } else die(
"cant parse type: $fulltype");

        }
        return
$fields;
           
    }

?>
up
0
simone dot t at betisgroup dot com
21 years ago
Another examples :

####################################

function field_keys($host, $user, $password, $database, $field ) {
   $db_link = mysql_connect($host, $user, $password) or die ("error connect");
   mysql_select_db($database,$db_link);
   $query="DESC $field";
   $results=mysql_query($query);
   $i=0;
   while ($row=mysql_fetch_array($results)) {
         if ($row[Key]=="PRI") {
            $array_keys[$i]=$row[Field];
         }
         $i++;
  }
   return $array_keys;
}

####################################

//Example of Main...
$tmp = field_keys("localhost", "myuser", "mypassword", "mydb", "field_name" );

// ...loop through array...
foreach ( $tmp as $array_tmp){
    print "<br>";
    print $array_tmp;
    print "<br>";
}
up
0
jakemsr at jakemsr dot com
22 years ago
I didn't find anything to get the valid values for
ENUM or SET column types, so I came up with the
following

function mysql_enum_values($table, $field)
{
    $sql = "SHOW COLUMNS FROM $table LIKE '$field'";
    $sql_res = mysql_query($sql)
        or die("Could not query:\n$sql");
    $row = mysql_fetch_assoc($sql_res);
    mysql_free_result($sql_res);
    return(explode("','",
        preg_replace("/.*\('(.*)'\)/", "\\1",
            $row["Type"])));
}
up
-1
bomas at cities-of-faith dot com
19 years ago
well, to make a complete backup of your database, i suggest this code:

//open database here
$tab_status = mysql_query("SHOW TABLE STATUS");
while($all = mysql_fetch_assoc($tab_status)):
    $tbl_stat[$all[Name]] = $all[Auto_increment];
endwhile;
unset($backup);
$tables = mysql_list_tables('cofadmin');
while($tabs = mysql_fetch_row($tables)):
    $backup .= "--\n--Tabel structuur voor `$tabs[0]`\n--\n\nDROP IF EXISTS TABLE `$tabs[0]`\nCREATE TABLE IF NOT EXISTS `$tabs[0]` (&nbsp;";
    $res = mysql_query("SHOW CREATE TABLE $tabs[0]");
    while($all = mysql_fetch_assoc($res)):
        $str = str_replace("CREATE TABLE `$tabs[0]` (", "", $all['Create Table']);
        $str = str_replace(",", ",&nbsp;", $str);
        $str2 = str_replace("`) ) TYPE=MyISAM ", "`)\n ) TYPE=MyISAM ", $str);
        $backup .= $str2." AUTO_INCREMENT=".$tbl_stat[$tabs[0]].";\n\n";
    endwhile;
    $backup .= "--\n--Gegevens worden uitgevoerd voor tabel `$tabs[0]`\n--\n\n";
    $data = mysql_query("SELECT * FROM $tabs[0]");
    while($dt = mysql_fetch_row($data)):
        $backup .= "INSERT INTO `$tabs[0]` VALUES('$dt[0]'";
        for($i=1; $i<sizeof($dt); $i++):
            $backup .= ", '$dt[$i]'";
        endfor;
        $backup .= ");\n";
    endwhile;
    $backup .= "\n-- --------------------------------------------------------\n\n";
endwhile;
echo $backup;

this displayes your data the same way as phpmyadmin does.

hope it helps some of you guys
Greetz
up
-1
justin DOT flavin AT ntlworld DOT com
21 years ago
Sometimes, when writing a generic function or class, you want your script to be able to determine what the primary key of a table is.
/* usual MySQL stuff */
$query="DESC UsersTable";
$results=mysql_query($query);

while ($row=mysql_fetch_array($results))
{
if ($row[Type]="PRI")
    {
print "I found the primary key! <br>";
$UserKey=$row[Field];
print $row[Field];
/* drop out , as we've found the key */   
exit;
    }
}

..... later on we might have something like

< some sort of loop through records >

print "<a href='View_User_record.php?userkey=$UserKey'> Users Name </a>";

<end loop>

What's also interesting is the useful data you can get from
a DESC query.

The following prints out the array values grabbed by mysql_fetch_array on a DESC query - VERY useful stuff!!!

/* usual MySQL stuff */
$query="DESC UsersTable";
$results=mysql_query($query);

while ($row=mysql_fetch_array($results))
{
print "<pre>";
print_r ($row);
print "</pre>";
}
up
-1
buttrose at unimelb dot edu dot au
20 years ago
This function is essential for writing a generic table editor (ie one that just takes the name of the table and works out what fields it has, types, sizes etc.). Unfortunately, I am using psotgreSQL not mySql. Postgres has field_type and field_size functions  but not as far as I can tell an equivalent of the mysql_field_flags() function. Without it, there is no way I can do generic ADDs and INSERTs.

Anyone know a workaround to get this information (eg is the field a primary key? Can it be NULL? Is it auto_increment?) in Postgres?

Cheers

Rob Buttrose
up
-2
jurgen at alienguitar dot com
23 years ago
The previous problem to get the default values of a column:
Use the following query and parse the 'Default' column:

"SHOW COLUMNS FROM TableName"

or for a single entry:

"SHOW COLUMNS FROM TableName LIKE 'column'"

It will give you also values for Type,  Null, Key and Extra (check with mysql program first, so you see what you get ;-)
To Top