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 и, возможно, для любого другого драйвера PDO, который использует предложение LIMIT .

Примечание. Для повышения производительности добавляется 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 = "select column_name from 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 } } 

PDOStatement :: getColumnMeta ()

Как упоминалось в Charle, это метод выражения, то есть он извлекает данные столбца из подготовленного оператора (запроса).

Вот функция, которую я использую. Созданный на основе ответа @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/>'; } 

Это старый вопрос, но вот мой вклад

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

просто поместите свою переменную для объекта pdo и tablename. Работает на меня

Этот подход работает для меня в 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 или другой, но он работает для меня.

Очень полезное решение для 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 ) 

Это особенно приятно иметь, когда таблица пуста.

Мой вклад ТОЛЬКО для 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>"; 

/ * Извлечь все данные в таблицу 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>"; ?> 

Нет необходимости делать вторичный запрос, который является немым. Просто используйте встроенную функцию 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";