php pdo:获取表的列名
Posted
技术标签:
【中文标题】php pdo:获取表的列名【英文标题】:php pdo: get the columns name of a table 【发布时间】:2011-07-22 15:29:04 【问题描述】:如何使用 PDO 从表中获取所有列名?
id name age
1 Alan 35
2 Alex 52
3 Amy 15
我想得到的信息是,
id name age
编辑:
这是我的尝试,
$db = $connection->get_connection();
$select = $db->query('SELECT * FROM contacts');
$total_column = $select->columnCount();
var_dump($total_column);
for ($counter = 0; $counter < $total_column; $counter ++)
$meta = $select->getColumnMeta($counter);
$column[] = $meta['name'];
print_r($column);
然后我明白了,
Array
(
[0] => id
[1] => name
[2] => age
...
)
【问题讨论】:
您想要表中的列名,还是查询记录集中的列名?这是以两种不同的方式完成的两种不同的事情。菲尔的回答是前者,JapanPro 的回答是后者! @charles:我想我只想获取表中的列名。我不太明白你所说的查询记录集中的列名是什么意思。但请在上面的编辑中查看我的答案。谢谢。 @lauthiamkok:你在更新后的帖子中这样做了——你正在做一个查询,它返回一组记录,然后你正在获取特定的列名 设置。碰巧结果集中的列名与表中的列名相同。请记住,SQL 列可以有别名。 @lauthiamkok,如果您试图从表中获取列名,那么下面@JapanPro 的答案是最好的方法——使用information_schema
方法。你在做什么做的工作,但不是“正确”的方式。
当你有一个空表时,你的方法会失败,因为没有记录可以从中获取列。
【参考方案1】:
$sql = "选择列名 information_schema.columns 在哪里 table_name = 'myTable'";
php 函数 学分:http://www.sitepoint.com/forums/php-application-design-147/get-pdo-column-name-easy-way-559336.html
function getColumnNames()
$sql = "SELECT column_name FROM information_schema.columns WHERE table_name = 'myTable'";
#$sql = 'SHOW COLUMNS FROM ' . $this->table;
$stmt = $this->connection->prepare($sql);
try
if ($stmt->execute())
$raw_column_data = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach($raw_column_data as $outer_key => $array)
foreach($array as $inner_key => $value
if (!(int)$inner_key)
$this->column_names[] = $value;
return $this->column_names;
catch (Exception $e)
return $e->getMessage(); //return exception
【讨论】:
还将schema_name
添加到where
+1 表示information_schema
而不是特定于数据库的内容。
@Charles information_schema
mysql 不是特定的吗?这个问题没有标记MySQL
,所以它可以是任何东西。请注意,我回答中的方法可能也不适用于每个数据库;)
@Phil, information_schema
是 ANSI 标准的一部分。它已在 MySQL、PostgreSQL 和 MSSQL 中实现。除非 OP 使用 Oracle 或 SQLite,否则对他来说应该可以正常工作(假设这个答案是他想要的)。
@PawełStawarz 有一个 TABLE_SCHEMA 列指示表和列所属的模式。但是,使用 information_schema 的缺点是可能并非所有用户/帐户都可以访问此系统表。这也比 getColumnMeta() 慢。【参考方案2】:
无需进行二次查询。只需使用内置的 oci_field_name() 函数:
这是一个例子:
oci_execute($stid); //This executes
echo "<table border='1'>\n";
$ncols = oci_num_fields($stid);
echo "<tr>";
for ($i = 1; $i <= $ncols; $i++)
$column_name = oci_field_name($stid, $i);
echo "<td>$column_name</td>";
echo "</tr>";
while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS))
echo "<tr>\n";
foreach ($row as $item)
echo " <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : " ") . "</td>\n";
echo "</tr>\n";
echo "</table>\n";
【讨论】:
他使用的是 PDO,而不是 OCI。另外,我会投票反对你称别人的解决方案“愚蠢”......但我不想不受欢迎。感谢您的尝试!【参考方案3】:这种方法适用于 SQLite 和 MySQL。它可能适用于其他人,请告诉我您的经验。
存在行时有效 在没有行的情况下工作(使用DELETE FROM table
测试)
代码:
$calendarDatabase = new \PDO('sqlite:calendar-of-tasks.db');
$statement = $calendarDatabase->query('SELECT *, COUNT(*) FROM data LIMIT 1');
$columns = array_keys($statement->fetch(PDO::FETCH_ASSOC));
array_pop($columns);
var_dump($columns);
我不保证这是符合 ANSI 或其他标准的有效 SQL,但它适用于我。
【讨论】:
如果数据库中有 284,000 行,性能会如何? @miken32 感谢您的说明。更新代码以适用于任意大小的数据库【参考方案4】:$q = $dbh->prepare("DESCRIBE tablename");
$q->execute();
$table_fields = $q->fetchAll(PDO::FETCH_COLUMN);
必须
$q = $dbh->prepare("DESCRIBE database.table");
$q->execute();
$table_fields = $q->fetchAll(PDO::FETCH_COLUMN);
【讨论】:
【参考方案5】:只需输入您的数据库名称、用户名、密码(我在哪里标记?)和表名。& Yuuppiii!....您从主数据库中获取所有数据(带有列名)
<?php
function qry($q)
global $qry;
try
$host = "?";
$dbname = "?";
$username = "?";
$password = "?";
$dbcon = new PDO("mysql:host=$host;
dbname=$dbname","$username","$password");
catch (Exception $e)
echo "ERROR ".$e->getMEssage();
$qry = $dbcon->query($q);
$qry->setFetchMode(PDO:: FETCH_OBJ);
return $qry;
echo "<table>";
/*Get Colums Names in table row */
$columns = array();
$qry1= qry("SHOW COLUMNS FROM Your_table_name");
while (@$column = $qry1->fetch()->Field)
echo "<td>".$column."</td>";
$columns[] = $column;
echo "<tr>";
/* 获取所有数据到 html 表中 * /
$qry2 = qry("SELECT * FROM Your_table_name");
while ( $details = $qry2->fetch())
echo "<tr>";
foreach ($columns as $c_name)
echo "<td>".$details->$c_name."</td>";
echo "</table>";
?>
【讨论】:
【参考方案6】:我对 SQLite 的贡献仅:
/**
* Returns an array of column names for a given table.
* Arg. $dsn should be replaced by $this->dsn in a class definition.
*
* @param string $dsn Database connection string,
* e.g.'sqlite:/home/user3/db/mydb.sq3'
* @param string $table The name of the table
*
* @return string[] An array of table names
*/
public function getTableColumns($dsn, $table)
$dbh = new \PDO($dsn);
return $dbh->query('PRAGMA table_info(`'.$table.'`)')->fetchAll(\PDO::FETCH_COLUMN, 1);
【讨论】:
【参考方案7】:这适用于 MySQL、Postgres 以及可能使用 LIMIT
子句的任何其他 PDO 驱动程序。
添加通知LIMIT 0
是为了提高性能:
$rs = $db->query('SELECT * FROM my_table LIMIT 0');
for ($i = 0; $i < $rs->columnCount(); $i++)
$col = $rs->getColumnMeta($i);
$columns[] = $col['name'];
print_r($columns);
【讨论】:
谢谢威尔!读者您好,这是通用 PDO 解决方案! Lauer 解决方案仅由 MySQL 支持 -- 并且 PDOStatement::getColumnMeta() 很复杂,并非所有 PDO 驱动程序都支持,并且被列为实验性的。 PS:查询也使用空表运行。 也许可以用$columns = array_keys($rs->fetchAll(PDO::FETCH_ASSOC));
之类的东西来简化...我不会尝试。
@PeterKrauss,是的,它至少需要一个结果。
@DaviddCeFreitas,对不起,getColumnMeta 的方法有一个 6 岁以上的“实验性”警报……唯一的方法是使用非空表。您可以使用 SELECT * FROM my_table WHERE id=0
之类的东西并使用无数据行填充所有表。
LIMIT 0 是 MySQL / PGSQL 特定的语法。 如何 这是通用的?如何做到这一点?【参考方案8】:
这是一个老问题,但这是我的意见
function getColumns($dbhandle, $tableName)
$columnsquery = $dbhandle->query("PRAGMA table_info($tableName)");
$columns = array();
foreach ($columnsquery as $k)
$columns[] = $k['name'];
return $columns;
只需为您的 pdo 对象和表名输入您的变量。为我工作
【讨论】:
【参考方案9】:我通过以下方式解决问题(仅限 MySQL)
$q = $dbh->prepare("DESCRIBE tablename");
$q->execute();
$table_fields = $q->fetchAll(PDO::FETCH_COLUMN);
【讨论】:
只有 MySQL 支持。 为什么不$q = $dbh->query("DESCRIBE tablename"); $table_fields = $q->fetchAll(PDO::FETCH_COLUMN);
?
读者,有关通用解决方案,请参阅@Will 回答。
恕我直言,虽然这个答案可能对许多人有用,但它不符合问题中表达的需要,即“有没有办法在我在迭代数据?”用户希望在迭代值时查看数组中的键。 key($array) 函数可能会有所帮助。【参考方案10】:
这里是一个非常有用的 SQLite3 解决方案。因为 OP 没有特别指出 MySQL 并且尝试在 SQLite 上使用某些解决方案失败。
$table_name = 'content_containers';
$container_result = $connect->query("PRAGMA table_info(" . $table_name . ")");
$container_result->setFetchMode(PDO::FETCH_ASSOC);
foreach ($container_result as $conkey => $convalue)
$elements[$convalue['name']] = $convalue['name'];
这将返回一个数组。由于这是一个直接的信息转储,您需要遍历并过滤结果以获得如下结果:
Array
(
[ccid] => ccid
[administration_title] => administration_title
[content_type_id] => content_type_id
[author_id] => author_id
[date_created] => date_created
[language_id] => language_id
[publish_date] => publish_date
[status] => status
[relationship_ccid] => relationship_ccid
[url_alias] => url_alias
)
当桌子是空的时,这特别好。
【讨论】:
【参考方案11】:这是我使用的功能。根据上面的@Lauer 回答和其他一些资源创建:
//Get Columns
function getColumns($tablenames)
global $hostname , $dbnames, $username, $password;
try
$condb = new PDO("mysql:host=$hostname;dbname=$dbnames", $username, $password);
//debug connection
$condb->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$condb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// get column names
$query = $condb->prepare("DESCRIBE $tablenames");
$query->execute();
$table_names = $query->fetchAll(PDO::FETCH_COLUMN);
return $table_names;
//Close connection
$condb = null;
catch(PDOExcepetion $e)
echo $e->getMessage();
用法示例:
$columns = getColumns('name_of_table'); // OR getColumns($name_of_table); if you are using variable.
foreach($columns as $col)
echo $col . '<br/>';
【讨论】:
【参考方案12】:我的 2 美分:
$result = $db->query('select * from table limit 1');
$fields = array_keys($result->fetch(PDO::FETCH_ASSOC));
您将在 var $fields 中以数组形式获取列名。
【讨论】:
如果表为空,则会产生警告! ===> "警告:array_keys() 期望参数 1 是数组,布尔值在...中给出"【参考方案13】:PDOStatement::getColumnMeta()
正如 Charle 所提到的,这是一个语句方法,这意味着它从准备好的语句(查询)中获取列数据。
【讨论】:
而且,正如@Darragh 所说,它是实验性的,将来可能无法使用。以上是关于php pdo:获取表的列名的主要内容,如果未能解决你的问题,请参考以下文章