2011-03-25 79 views
40

如何从使用PDO的表格获取所有列名称?php 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 
    ... 

) 
+6

你想列*表中的名称*,或查询中记录集中的列名* *?以两种不同的方式完成这两件事情。 Phil的回答是前者,JapanPro的回答是后者! – Charles 2011-03-25 03:37:58

+0

@charles:我想我只想获取表中的列名。我不太清楚查询__中记录集中的__列名是什么意思。但在我上面的编辑中看到我的答案。谢谢。 – laukok 2011-03-25 04:09:09

+0

@lauthiamkok:你正在更新后的文章中做这件事 - 你正在做一个查询,它返回一组记录,然后你抓取该特定集*的列名*。恰好结果集中的列名与表中的列名相同。请记住,SQL列可以是别名。 – Charles 2011-03-25 04:13:17

回答

10

$ 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 
     }   
    } 
+0

为'information_schema'添加'schema_name'到'where' – zerkms 2011-03-25 03:38:44

+4

+1,而不是DB特定的。 – Charles 2011-03-25 03:40:30

+0

@Charles不是'information_schema'是否与MySQL有关?这个问题没有标记为'MySQL',所以它可以是任何东西。请注意,我的答案中的方法可能不适用于每个数据库;) – Phil 2011-03-25 03:43:17

2

PDOStatement::getColumnMeta()

由于查理的提到的,这是一个语句的方法,这意味着它将从一个准备语句(查询)列数据。

+1

而且,正如@ Darragh所说,它是实验性的,未来可能无法使用。 – Mawg 2015-02-09 08:04:20

84

我解决问题的方式如下(仅限于MySQL的)

$q = $dbh->prepare("DESCRIBE tablename"); 
$q->execute(); 
$table_fields = $q->fetchAll(PDO::FETCH_COLUMN); 
+14

这只有MySQL支持。 – 2012-03-23 16:44:49

+8

为什么不是'$ q = $ dbh-> query(“DESCRIBE tablename”); $ table_fields = $ q-> fetchAll(PDO :: FETCH_COLUMN);'? – 2013-01-10 17:34:12

+2

阅读器,有关通用解决方案,请参阅@ Will答案。 – 2013-07-03 11:22:33

-5

有没有必要做辅助查询,这是愚蠢的。只需使用内置的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"; 
+7

他正在使用PDO,而不是OCI。另外,我会因为打电话给其他人的解决方案“愚蠢”而投票给你,但是我不想不受欢迎。感谢您的尝试! – 2013-05-14 20:34:43

+4

谢谢珍妮,我的小姐。 – Ben 2013-06-27 22:12:15

25

这将为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); 
+1

谢谢!你好,读者,这是通用的PDO解决方案! Lauer解决方案只支持MySQL - 和PDOStatement :: getColumnMeta()是复杂的,并不支持所有PDO驱动程序,并且被列为实验。 PS:查询也运行空表。 – 2013-07-03 11:14:46

+1

也许简化为像'$ columns = array_keys($ rs-> fetchAll(PDO :: FETCH_ASSOC));'...我不试试。 – 2013-07-03 11:33:41

+0

@PeterKrauss,我试过了你的第二条评论,如果LIMIT是0,没有结果(甚至没有列)。 – 2014-04-16 23:34:19

17

我的2美分:

$result = $db->query('select * from table limit 1'); 
$fields = array_keys($result->fetch(PDO::FETCH_ASSOC)); 

,你会得到的列名在var $领域的数组。

+5

当表为空时,这不起作用。 – 2014-09-15 19:39:32

+2

它也不适用于选择2'id'列的连接。 – Rudie 2014-12-17 19:19:49

2

这是我使用的功能。基于@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/>'; 
} 
0

这里一个非常有用的解决方案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 
) 

这是特别好的,有当表是空的。

2

这是一个老问题,但这里是我的输入

function getColumns($dbhandle, $tableName) { 
    $columnsquery = $dbhandle->query("PRAGMA table_info($tableName)"); 
    $columns = array(); 
    foreach ($columnsquery as $k) { 
     $columns[] = $k['name']; 
    } 
    return $columns; 
} 

只是把你的变量为你的PDO对象和表名。适用于我

1

这种方法适用于SQLite和MySQL。它可能与其他人一起工作,请让我知道你的经验。

  • 工作,如果行存在
  • 工作,如果没有行存在(与DELETE FROM table测试)

代码:

$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); 

我不做任何保证,这是每个有效的SQL ANSI或其他,但它适用于我。

0

我的贡献ONLY 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); 
} 
-1

只要把你的数据库名称,用户名,密码(其中i标?)和表名。 & 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>"; 

?>