web-dev-qa-db-ja.com

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
    ...

)
44
laukok

次の方法で問題を解決します(MySQLのみ)

$q = $dbh->prepare("DESCRIBE tablename");
$q->execute();
$table_fields = $q->fetchAll(PDO::FETCH_COLUMN);
89

これは、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);
31
Will

私の2セント:

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

そして、var $ fieldsの配列として列名を取得します。

21
ragnar

$ sql = "table_name = 'myTable'のinformation_schema.columnsからcolumn_nameを選択";

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 
        }         
    }  
10
Pramendra Gupta

これが私が使用する関数です。上記の@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/>';
}
_
3
KeepMove

このアプローチは、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);

私は、これがANSIまたは他の規格ごとに有効なSQLであることを保証しませんが、私には有効です。

2

これは古い質問ですが、ここに私の入力があります

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

pdoオブジェクトの変数とテーブル名を入力するだけです。私のために働く

2
Dave

PDOStatement :: getColumnMeta()

Charleが述べたように、これはステートメントメソッドです。つまり、準備されたステートメント(クエリ)から列データをフェッチします。

1
Phil

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
Carl McDade

私の貢献[〜#〜] 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);
}
0
centurian