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 tabletesting)

码:

 $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) : "&nbsp;") . "</td>\n"; } echo "</tr>\n"; } echo "</table>\n";