PHP Conference Japan 2024

mysql_field_flags

(PHP 4、PHP 5)

mysql_field_flags取得結果中指定欄位的旗標

警告

此擴充功能在 PHP 5.5.0 中已棄用,並在 PHP 7.0.0 中已移除。應改用 MySQLiPDO_MySQL 擴充功能。另請參閱 MySQL:選擇 API 指南。此函式的替代方案包括

描述

mysql_field_flags(資源 $result, 整數 $field_offset): 字串|false

mysql_field_flags() 會傳回指定欄位的欄位旗標。這些旗標會以單一文字表示每個旗標,並以單一空格分隔,因此您可以使用 explode() 來分割傳回的值。

參數

result

正在評估的結果 資源。此結果來自對 mysql_query() 的呼叫。

field_offset

數值欄位偏移量。 field_offset0 開始。如果 field_offset 不存在,也會發出 E_WARNING 等級的錯誤。

傳回值

傳回與結果關聯的旗標字串,或在失敗時傳回 false

如果您的 MySQL 版本夠新,足以支援它們,則會回報以下旗標: "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
'無法執行查詢:' . 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()

另請參閱

新增註記

使用者貢獻的註記 10 個註記

2
cufarley at nirvanet dot net
23 年前
使用「DESC TableName」命令也可能達到目的,而且稍微簡短一點。
2
amir at scrounch dot com
21 年前
使用「show keys」傳回資料表的主索引鍵
雖然可以使用 desc,但 show keys 提供了可能的增強功能,例如取得索引中的順序以及其他內容

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;
}
1
play at arcadevillage dot com
15 年前
為了真正備份資料庫值,我做了一點改變

我的程式碼看起來很像 bomas 的程式碼,但有一個重要的差異

<?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 是我將插入指令放入文字檔案之前所用的變數。

在此之前,我會測試欄位中的值是否不是 NULL,因為這是區分 NULL 值和空字串的唯一方法,例如針對字串文字欄位。

如果您不進行此測試,當您執行備份時,您應該會發現空字串而不是 NULL 值。
0
pike-php at kw dot nl
19 年前
好的,抱歉程式碼有點臃腫 :) 但這是我如何
取得 MySQL `DESCRIBE table` 語句的完整威力,以
一個關聯陣列的形式,包含預設值、枚舉值、浮點數基數等所有資訊。

它假設 MySQL 回傳的類型格式為
"type[(arg[,arg..])] [ add]"
像這樣
"float(20,6) unsigned"
"enum('yes','no')"
等等

<?

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("無法解析類型參數: $fullargs");
}
} else die("無法解析類型: $fulltype");

}
return $fields;

}

?>
0
simone dot t at betisgroup dot com
21 年前
其他範例

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

function field_keys($host, $user, $password, $database, $field ) {
$db_link = mysql_connect($host, $user, $password) or die ("連線錯誤");
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;
}

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

//主要範例...
$tmp = field_keys("localhost", "myuser", "mypassword", "mydb", "field_name" );

// ... 迴圈遍歷陣列...
foreach ( $tmp as $array_tmp){
print "<br>";
print $array_tmp;
print "<br>";
}
0
jakemsr at jakemsr dot com
22 年前
我找不到任何方法可以取得 ENUM 或 SET 欄位類型的有效值,所以我想到以下的方法
ENUM 或 SET 欄位類型,所以我提出了以下方法
以下方法

function mysql_enum_values($table, $field)
{
$sql = "SHOW COLUMNS FROM $table LIKE '$field'";
$sql_res = mysql_query($sql)
or die("無法查詢:\n$sql");
$row = mysql_fetch_assoc($sql_res);
mysql_free_result($sql_res);
return(explode("','",
preg_replace("/.*\('(.*)'\)/", "\\1",
$row["Type"])));
}
-1
bomas at cities-of-faith dot com
19 年前
好吧,為了完整備份您的資料庫,我建議使用此程式碼

//在這裡開啟資料庫
$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--`$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--為表格 `$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;

這會以與 phpMyAdmin 相同的方式顯示您的資料。

希望對你們有些幫助
Greetz
-1
buttrose at unimelb dot edu dot au
20 年前
此函式對於撰寫通用表格編輯器(也就是說,只需要表格名稱並找出其擁有的欄位、類型、大小等)至關重要。不幸的是,我使用的是 PostgreSQL 而不是 MySQL。Postgres 有 field_type 和 field_size 函式,但據我所知,沒有與 mysql_field_flags() 函式等效的功能。如果沒有它,我沒有辦法進行通用的 ADD 和 INSERT 操作。

有人知道在 Postgres 中取得此資訊的解決方案嗎(例如,欄位是否為主鍵?可以為 NULL 嗎?是自動遞增嗎?)

乾杯

Rob Buttrose
-2
justin DOT flavin AT ntlworld DOT com
21 年前
有時,在撰寫通用函式或類別時,您會希望您的腳本能夠判斷表格的主鍵是什麼。
/* 一般 MySQL 程式碼 */
$query="DESC UsersTable";
$results=mysql_query($query);

while ($row=mysql_fetch_array($results))
{
if ($row[Type]="PRI")
{
print "我找到主鍵了! <br>";
$UserKey=$row[Field];
print $row[Field];
/* 退出,因為我們已經找到主鍵 */
exit;
}
}

..... 稍後我們可能會有一些類似的東西

< 某種迴圈遍歷記錄 >

print "<a href='View_User_record.php?userkey=$UserKey'> 使用者名稱 </a>";

<迴圈結束>

DESC 查詢也可以取得有用的資料,這也很有趣。
DESC 查詢。

以下程式碼會印出 mysql_fetch_array 在 DESC 查詢中擷取的陣列值 - 非常有用的東西!!!

/* 一般 MySQL 程式碼 */
$query="DESC UsersTable";
$results=mysql_query($query);

while ($row=mysql_fetch_array($results))
{
print "<pre>";
print_r ($row);
print "</pre>";
}
-2
jurgen at alienguitar dot com
23 年前
先前取得欄位預設值的問題
使用以下查詢並解析 'Default' 欄位

"SHOW COLUMNS FROM TableName"

或者針對單一條目

"SHOW COLUMNS FROM TableName LIKE 'column'"

它也會提供 Type、Null、Key 和 Extra 的值(請先使用 mysql 程式檢查,以便查看您取得的內容 ;-)
To Top