Comment puis-je obtenir tous les noms de colonne d'une table à l'aide de PDO?
id name age
1 Alan 35
2 Alex 52
3 Amy 15
Les informations que je veux obtenir sont,
id name age
MODIFIER:
Voici ma tentative,
$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);
Ensuite, je reçois,
Array
(
[0] => id
[1] => name
[2] => age
...
)
Je résous le problème de la manière suivante (MySQL uniquement)
$q = $dbh->prepare("DESCRIBE tablename");
$q->execute();
$table_fields = $q->fetchAll(PDO::FETCH_COLUMN);
Cela fonctionnera pour MySQL, Postgres et probablement tout autre pilote PDO qui utilise la clause LIMIT
.
Remarquer LIMIT 0
est ajouté pour de meilleures performances:
$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);
Mes 2 cents:
$result = $db->query('select * from table limit 1');
$fields = array_keys($result->fetch(PDO::FETCH_ASSOC));
Et vous obtiendrez les noms des colonnes sous forme de tableau dans les champs var $.
$ sql = "select column_name from information_schema.columns where table_name = 'myTable'";
Crédits de fonction 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
}
}
Voici la fonction que j'utilise. Créé sur la base de la réponse @Lauer ci-dessus et d'autres ressources:
//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();
}
}
Exemple d'utilisation:
$columns = getColumns('name_of_table'); // OR getColumns($name_of_table); if you are using variable.
foreach($columns as $col) {
echo $col . '<br/>';
}
Cette approche fonctionne pour moi dans SQLite et MySQL. Cela peut fonctionner avec d'autres, veuillez me faire part de votre expérience.
DELETE FROM table
)Code:
$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);
Je ne garantis pas qu'il s'agit d'un SQL valide par ANSI ou autre, mais cela fonctionne pour moi.
Ceci est une vieille question, mais voici mon entrée
function getColumns($dbhandle, $tableName) {
$columnsquery = $dbhandle->query("PRAGMA table_info($tableName)");
$columns = array();
foreach ($columnsquery as $k) {
$columns[] = $k['name'];
}
return $columns;
}
il suffit de mettre votre variable pour votre objet pdo et le nom de la table. Travaille pour moi
PDOStatement :: getColumnMeta ()
Comme l'a mentionné Charle, il s'agit d'une méthode de déclaration, ce qui signifie qu'elle récupère les données de colonne d'une déclaration préparée (requête).
Une solution très utile ici pour SQLite3. Parce que l'OP n'indique pas spécifiquement MySQL et il y a eu une tentative infructueuse d'utiliser certaines solutions sur 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'];
}
Cela renvoie un tableau. Comme il s'agit d'un vidage d'informations direct, vous devrez parcourir et filtrer les résultats pour obtenir quelque chose comme ceci:
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
)
C'est particulièrement agréable d'avoir lorsque la table est vide.
Ma contribution [~ # ~] seulement [~ # ~] pour 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);
}