使用「DESC TableName」命令也可能達到目的,而且稍微簡短一點。
(PHP 4、PHP 5)
mysql_field_flags — 取得結果中指定欄位的旗標
此擴充功能在 PHP 5.5.0 中已棄用,並在 PHP 7.0.0 中已移除。應改用 MySQLi 或 PDO_MySQL 擴充功能。另請參閱 MySQL:選擇 API 指南。此函式的替代方案包括
mysql_field_flags() 會傳回指定欄位的欄位旗標。這些旗標會以單一文字表示每個旗標,並以單一空格分隔,因此您可以使用 explode() 來分割傳回的值。
result
正在評估的結果 資源。此結果來自對 mysql_query() 的呼叫。
field_offset
數值欄位偏移量。 field_offset
從 0
開始。如果 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()
使用「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;
}
為了真正備份資料庫值,我做了一點改變
我的程式碼看起來很像 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 值。
好的,抱歉程式碼有點臃腫 :) 但這是我如何
取得 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;
}
?>
其他範例
####################################
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>";
}
我找不到任何方法可以取得 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"])));
}
好吧,為了完整備份您的資料庫,我建議使用此程式碼
//在這裡開啟資料庫
$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]` ( ";
$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(",", ", ", $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
此函式對於撰寫通用表格編輯器(也就是說,只需要表格名稱並找出其擁有的欄位、類型、大小等)至關重要。不幸的是,我使用的是 PostgreSQL 而不是 MySQL。Postgres 有 field_type 和 field_size 函式,但據我所知,沒有與 mysql_field_flags() 函式等效的功能。如果沒有它,我沒有辦法進行通用的 ADD 和 INSERT 操作。
有人知道在 Postgres 中取得此資訊的解決方案嗎(例如,欄位是否為主鍵?可以為 NULL 嗎?是自動遞增嗎?)
乾杯
Rob Buttrose
有時,在撰寫通用函式或類別時,您會希望您的腳本能夠判斷表格的主鍵是什麼。
/* 一般 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>";
}
先前取得欄位預設值的問題
使用以下查詢並解析 'Default' 欄位
"SHOW COLUMNS FROM TableName"
或者針對單一條目
"SHOW COLUMNS FROM TableName LIKE 'column'"
它也會提供 Type、Null、Key 和 Extra 的值(請先使用 mysql 程式檢查,以便查看您取得的內容 ;-)