我想让所有的mysql表的col名称在php数组?
对此有疑问吗?
我想让所有的mysql表的col名称在php数组?
对此有疑问吗?
当前回答
这个问题很老了,但我在这里寻找一种方法,以动态的方式查找给定查询的字段名(不一定只是表的字段)。由于人们在其他相关问题中一直把这个作为给定任务的答案,我在这里分享我发现的方法,使用加文·辛普森的技巧:
//Function to generate a HTML table from a SQL query
function myTable($obConn,$sql)
{
$rsResult = mysqli_query($obConn, $sql) or die(mysqli_error($obConn));
if(mysqli_num_rows($rsResult)>0)
{
//We start with header. >>>Here we retrieve the field names<<<
echo "<table width=\"100%\" border=\"0\" cellspacing=\"2\" cellpadding=\"0\"><tr align=\"center\" bgcolor=\"#CCCCCC\">";
$i = 0;
while ($i < mysqli_num_fields($rsResult)){
$field = mysqli_fetch_field_direct($rsResult, $i);
$fieldName=$field->name;
echo "<td><strong>$fieldName</strong></td>";
$i = $i + 1;
}
echo "</tr>";
//>>>Field names retrieved<<<
//We dump info
$bolWhite=true;
while ($row = mysqli_fetch_assoc($rsResult)) {
echo $bolWhite ? "<tr bgcolor=\"#CCCCCC\">" : "<tr bgcolor=\"#FFF\">";
$bolWhite=!$bolWhite;
foreach($row as $data) {
echo "<td>$data</td>";
}
echo "</tr>";
}
echo "</table>";
}
}
这可以很容易地修改为在数组中插入字段名。
使用简单的:$sql="SELECT * FROM myTable LIMIT 1"可以给你任何表的字段,而不需要使用SHOW COLUMNS或任何额外的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应该替换为特定的数据库设置。
旧的PHP函数“mysql_list_fields()”已弃用。所以,现在获取字段名称的最好方法是查询“SHOW COLUMNS FROM table_name [LIKE 'name']”。这里有一个小例子:
$fields = array();
$res=mysql_query("SHOW COLUMNS FROM mytable");
while ($x = mysql_fetch_assoc($res)){
$fields[] = $x['Field'];
}
foreach ($fields as $f) { echo "<br>Field name: ".$f; }
这将生成一个带逗号分隔符的列名字符串:
SELECT CONCAT('(',GROUP_CONCAT(`COLUMN_NAME`),')')
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_SCHEMA`='database_name'
AND `TABLE_NAME`='table_name';
似乎有两种方法:
DESCRIBE `tablename`
or
SHOW COLUMNS FROM `tablename`
更多描述请点击:http://dev.mysql.com/doc/refman/5.0/en/describe.html
当你想检查你的所有表结构与一些文件,然后使用这段代码。在这个查询中,我选择column_name,column_type和table_name以获取更多详细信息。我使用按列的顺序,所以我可以很容易地看到它。
SELECT `COLUMN_NAME`,COLUMN_TYPE,TABLE_NAME
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_SCHEMA`='yourdatabasename' order by DATA_TYPE;
如果你只想检查双类型文件,那么你可以很容易地做到这一点
SELECT `COLUMN_NAME`,COLUMN_TYPE,TABLE_NAME,DATA_TYPE
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_SCHEMA`='yourdatabasename' AND DATA_TYPE like '%bigint%' order by DATA_TYPE;
如果你想检查哪个字段允许空类型等,那么你可以使用这个
SELECT `COLUMN_NAME`,COLUMN_TYPE,TABLE_NAME,IS_NULLABLE,DATA_TYPE
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_SCHEMA`='yourdatabasename' and DATA_TYPE like '%bigint%' and IS_NULLABLE ='NO' order by COLUMN_TYPE;
你想检查更多,然后认为链接也帮助你。
https://dev.mysql.com/doc/refman/5.7/en/columns-table.html