php pdo: получить имя столбца таблицы - PullRequest
44 голосов
/ 25 марта 2011

Как я могу получить все имена столбцов из таблицы, используя 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
    ...

)

Ответы [ 13 ]

0 голосов
/ 27 сентября 2017

Мой вклад ТОЛЬКО для 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);
}
0 голосов
/ 10 апреля 2015

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

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

0 голосов
/ 15 марта 2013

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