我想让所有的mysql表的col名称在php数组?
对此有疑问吗?
我想让所有的mysql表的col名称在php数组?
对此有疑问吗?
当前回答
mysql 5.1(不是5.5)中的SHOW COLUMNS使用了一个临时磁盘表。
http://dev.mysql.com/doc/refman/5.1/en/internal-temporary-tables.html http://dev.mysql.com/doc/refman/5.1/en/show-columns.html
所以在某些情况下,它可以被认为是很慢的。至少,它可以提高created_tmp_disk_tables的值。假设每个连接或每个页面请求都有一个临时磁盘表。
SHOW COLUMNS并不是真的那么慢,可能是因为它使用了文件系统缓存。Phpmyadmin始终表示~0.5ms。这与服务一个wordpress页面的500 -1000毫秒相比根本不算什么。但有时还是很重要的。其中涉及到磁盘系统,你永远不知道当服务器忙、缓存满、硬盘卡住等情况下会发生什么。
通过SELECT * FROM…获取列名LIMIT 1大约0.1ms,它也可以使用查询缓存。
下面是我优化的从表中获取列名的代码,如果可能的话不使用show columns:
function db_columns_ar($table)
{
//returns Array('col1name'=>'col1name','col2name'=>'col2name',...)
if(!$table) return Array();
if(!is_string($table)) return Array();
global $db_columns_ar_cache;
if(!empty($db_columns_ar_cache[$table]))
return $db_columns_ar_cache[$table];
//IMPORTANT show columns creates a temp disk table
$cols=Array();
$row=db_row_ar($q1="SELECT * FROM `$table` LIMIT 1");
if($row)
{
foreach($row as $name=>$val)
$cols[$name]=$name;
}
else
{
$coldata=db_rows($q2="SHOW COLUMNS FROM `$table`");
if($coldata)
foreach($coldata as $row)
$cols[$row->Field]=$row->Field;
}
$db_columns_ar_cache[$table]=$cols;
//debugexit($q1,$q2,$row,$coldata,$cols);
return $cols;
}
注:
只要您的表的第一行不包含兆字节范围的数据,它应该工作正常。 函数名db_rows和db_row_ar应该替换为特定的数据库设置。
其他回答
调用DESCRIBE可以很好地获取表的所有列,但如果需要对其进行筛选,则需要使用SHOW columns FROM。
PHP函数获取表的所有信息的例子:
// get table columns (or return false if table not found)
function get_table_columns($db, $table) {
global $pdo;
if($cols = $pdo->query("DESCRIBE `$db`.`$table`")) {
if($cols = $cols->fetchAll(PDO::FETCH_ASSOC)) {
return $cols;
}
}
return false;
}
在我的例子中,我必须找到一个表的主键。所以,我用了:
SHOW COLUMNS FROM `table` WHERE `Key`='PRI';
下面是我的PHP函数:
// get table Primary Key
function get_table_pk($db, $table) {
global $pdo;
$q = "SHOW COLUMNS FROM `$db`.`$table` WHERE `Key` = 'PRI'";
if($cols = $pdo->query($q)) {
if($cols = $cols->fetchAll(PDO::FETCH_ASSOC)) {
return $cols[0];
}
}
return false;
}
此查询获取数据库中所有列的列表,而无需指定表名。它返回一个只包含列名的列表:
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE table_schema = 'db_name'
但是,当我在phpmyadmin中运行这个查询时,它显示了一系列错误。尽管如此,它还是奏效了。所以要谨慎使用。
似乎有两种方法:
DESCRIBE `tablename`
or
SHOW COLUMNS FROM `tablename`
更多描述请点击:http://dev.mysql.com/doc/refman/5.0/en/describe.html
我不是专家,但这对我有用。
$sql = "desc MyTable";
$result = @mysql_query($sql);
while($row = @mysql_fetch_array($result)){
echo $row[0]."<br>"; // returns the first column of array. in this case Field
// the below code will return a full array-> Field,Type,Null,Key,Default,Extra
// for ($c=0;$c<sizeof($row);$c++){echo @$row[$c]."<br>";}
}
最好的方法是使用INFORMATION_SCHEMA元数据虚拟数据库。特别是INFORMATION_SCHEMA。列的表…
SELECT `COLUMN_NAME`
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_SCHEMA`='yourdatabasename'
AND `TABLE_NAME`='yourtablename';
它非常强大,可以给你大量的信息,而不需要解析文本(比如列类型,列是否为空,最大列大小,字符集,等等)…
哦,它是标准SQL(而SHOW…是一个MySQL特定的扩展)…
有关SHOW…使用INFORMATION_SCHEMA表,查看MySQL文档中关于INFORMATION_SCHEMA的一般内容…