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 ]

89 голосов
/ 17 августа 2011

Я решаю проблему следующим образом (только MySQL)

$q = $dbh->prepare("DESCRIBE tablename");
$q->execute();
$table_fields = $q->fetchAll(PDO::FETCH_COLUMN);
31 голосов
/ 28 марта 2013

Это будет работать для 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);
21 голосов
/ 30 октября 2013

Мои 2 цента:

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

И вы получите имена столбцов в виде массива в полях var $.

10 голосов
/ 25 марта 2011

$ 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 
        }         
    }  
3 голосов
/ 04 марта 2014

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

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

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

просто поместите вашу переменную для вашего объекта pdo и имя таблицы.У меня работает

1 голос
/ 31 мая 2017

Этот подход работает для меня в SQLite и MySQL. Это может работать с другими, пожалуйста, дайте мне знать ваш опыт.

  • Работает при наличии строк
  • Работает, если строк нет (тест с DELETE FROM table)

Код:

$calendarDatabase = new \PDO('sqlite:calendar-of-tasks.db');    
$statement = $calendarDatabase->query('SELECT *, COUNT(*) FROM data LIMIT 1');
$columns = array_keys($statement->fetch(PDO::FETCH_ASSOC));
array_pop($columns);
var_dump($columns);

Я не даю никаких гарантий, что это допустимый SQL для ANSI или другого, но он работает для меня.

1 голос
/ 25 марта 2011

PDOStatement :: getColumnMeta ()

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

0 голосов
/ 03 декабря 2018
$q = $dbh->prepare("DESCRIBE tablename");
$q->execute();
$table_fields = $q->fetchAll(PDO::FETCH_COLUMN);

должно быть

$q = $dbh->prepare("DESCRIBE database.table");
$q->execute();
$table_fields = $q->fetchAll(PDO::FETCH_COLUMN);
0 голосов
/ 06 ноября 2017

Просто введите имя вашей базы данных, имя пользователя, пароль (где я пометил?) И имя таблицы. & 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>";

?>
...