Как получить все имена столбцов из таблицы с помощью 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) : " ") . "</td>\n"; } echo "</tr>\n"; } echo "</table>\n";