2011-03-25 78 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>"; 

?>