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、およびおそらく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);
私の2セント:
$result = $db->query('select * from table limit 1');
$fields = array_keys($result->fetch(PDO::FETCH_ASSOC));
そして、var $ fieldsの配列として列名を取得します。
$ 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
}
}
これが私が使用する関数です。上記の@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/>';
}
_
このアプローチは、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であることを保証しませんが、私には有効です。
これは古い質問ですが、ここに私の入力があります
function getColumns($dbhandle, $tableName) {
$columnsquery = $dbhandle->query("PRAGMA table_info($tableName)");
$columns = array();
foreach ($columnsquery as $k) {
$columns[] = $k['name'];
}
return $columns;
}
pdoオブジェクトの変数とテーブル名を入力するだけです。私のために働く
PDOStatement :: getColumnMeta()
Charleが述べたように、これはステートメントメソッドです。つまり、準備されたステートメント(クエリ)から列データをフェッチします。
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
)
これは、テーブルが空の場合に特に便利です。
私の貢献[〜#〜] 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);
}