PHP的Pdo:获取表的列名称
我如何使用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 ... )
我用下面的方法解决这个问题(仅限于MySQL)
$q = $dbh->prepare("DESCRIBE tablename"); $q->execute(); $table_fields = $q->fetchAll(PDO::FETCH_COLUMN);
这将适用于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);
我的2美分:
$result = $db->query('select * from table limit 1'); $fields = array_keys($result->fetch(PDO::FETCH_ASSOC));
而且你会在var $字段中获得列名。
$ sql =“从information_schema.columns中select列名where 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 } }
PDOStatement对象:: getColumnMeta()
正如Charle所提到的,这是一个声明方法,意思是它从一个准备好的语句(查询)中提取列数据。
这是我使用的function。 基于上面的@Lauer答案和其他一些资源创build:
//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/>'; }
这是一个古老的问题,但这是我的意见
function getColumns($dbhandle, $tableName) { $columnsquery = $dbhandle->query("PRAGMA table_info($tableName)"); $columns = array(); foreach ($columnsquery as $k) { $columns[] = $k['name']; } return $columns; }
只要把你的variables为你的pdo对象和表名。 为我工作
这种方法适用于SQLite和MySQL。 它可能与其他人一起工作,请让我知道你的经验。
- 如果行存在,则工作
- 如果不存在行,则工作(使用
DELETE FROM table
testing)
码:
$calendarDatabase = new \PDO('sqlite:calendar-of-tasks.db'); $statement = $calendarDatabase->query('SELECT *, COUNT(*) FROM data'); $columns = array_keys($statement->fetch(PDO::FETCH_ASSOC)); array_pop($columns); var_dump($columns);
我不能保证这是ANSI或其他有效的SQL,但它对我有用。
这里是一个非常有用的SQLite3解决scheme。 因为OP没有专门指明MySQL,并且在SQLite上使用某些解决scheme失败了。
$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 )
这个表格是空的,这是特别好。
我的贡献仅适用于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, * eg'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); }
只要把你的数据库名称,用户名,密码(我在哪里标记?)和表名。&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>"; /* Fetch all data into a html table * $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>"; ?>
没有必要做一个辅助查询,这是愚蠢的。 只需使用内置的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";