web-dev-qa-db-fra.com

php pdo: récupère le nom des colonnes d'une table

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

)
44
laukok

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);
89

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);
31
Will

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

21
ragnar

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

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/>';
}
3
KeepMove

Cette approche fonctionne pour moi dans SQLite et MySQL. Cela peut fonctionner avec d'autres, veuillez me faire part de votre expérience.

  • Fonctionne si des lignes sont présentes
  • Fonctionne si aucune ligne n'est présente (testez avec 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.

2
William Entriken

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

2
Dave

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

1
Phil

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.

0
Carl McDade

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);
}
0
centurian