PHP AOP: récupérez les colonnes Nom d'une table

Comment puis-je obtenir tous les noms de colonne d'une table en utilisant AOP?

id         name        age
1          Alan        35      
2          Alex        52
3          Amy         15

L'info que je veux obtenir sont,

id         name        age

EDIT:

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

Puis-je,

Array
(
    [0] => id
    [1] => name
    [2] => age
    ...

)
42
demandé sur George P 2011-03-25 06:34:13

12 réponses

Je résous le problème de la façon suivante (MySQL seulement)

$q = $dbh->prepare("DESCRIBE tablename");
$q->execute();
$table_fields = $q->fetchAll(PDO::FETCH_COLUMN);
86
répondu Jesper Grann Laursen 2015-08-23 19:34:30

cela fonctionnera pour MySQL, Postgres, et probablement tout autre pilote AOP qui utilise la clause LIMIT .

Avis LIMIT 0 est ajouté pour l'amélioration de la performance:

$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);
26
répondu Will 2016-08-30 21:22:58

mes 2 cents:

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

et vous obtiendrez les noms de colonnes sous forme de tableau dans les champs $var.

18
répondu ragnar 2013-10-30 13:58:33

$sql = " select column_name from information_schema.les colonnes où table_name = 'myTable'";

fonction PHP crédits: 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
répondu Pramendra Gupta 2011-03-25 03:37:57

PDOStatement:: getColumnMeta ()

comme Charle l'a mentionné, il s'agit d'une méthode d'énoncé, ce qui signifie qu'il récupère les données de la colonne à partir d'une déclaration préparée (requête).

2
répondu Phil 2011-03-25 03:38:50

, Voici la fonction que j'utilise. Créé à partir de la réponse de @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'Usage:

$columns = getColumns('name_of_table'); // OR getColumns($name_of_table); if you are using variable.

foreach($columns as $col) {
echo $col . '<br/>';
}
2
répondu KeepMove 2014-03-04 02:31:56

C'est une vieille question, mais voici ma contribution

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 AOP et le nom de la table. Travaille pour moi

2
répondu Dave 2015-09-08 23:54:12

Cette approche fonctionne pour moi dans SQLite et MySQL. Il peut travailler avec d'autres, s'il vous plaît laissez-moi savoir votre expérience.

  • Fonctionne si les lignes sont présents
  • fonctionne en l'absence de rangées (essai avec DELETE FROM table )

Code:

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

Je ne garantis pas que ce soit du SQL valide par ANSI ou autre, mais cela fonctionne pour moi.

1
répondu William Entriken 2017-05-31 18:42:57

une solution très utile ici pour SQLite3. Parce que L'OP n'indique pas MySQL spécifiquement et il y avait une tentative ratée 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'];

    }

renvoie un tableau. Comme il s'agit d'un dump d'information directe, vous devrez itérer 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 à avoir quand la table est vide.

0
répondu Carl McDade 2015-04-10 18:13:35

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
répondu centurian 2017-09-27 18:20:22

mettez juste votre nom de base de données,nom d'utilisateur,mot de passe (où j'ai marqué ?) et le nom de la table. Et Yuuppiii!.... vous obtenez toutes les données de votre base de données principale (avec le nom de colonne)

<?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>";

/* récupération de toutes les données dans un tableau 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>";

?>
-1
répondu Dipen Parmar 2017-11-24 09:28:35

il n'y a pas besoin de faire une requête secondaire, c'est stupide. Il suffit d'utiliser la fonction intégrée oci_field_name ():

voici un exemple:

oci_execute($stid);                  //This executes

    echo "<table border='1'>\n";
    $ncols = oci_num_fields($stid);
    echo "<tr>";
    for ($i = 1; $i <= $ncols; $i++) {
            $column_name  = oci_field_name($stid, $i);
            echo "<td>$column_name</td>";
    }
    echo "</tr>";


    while ($row = oci_fetch_array($stid, OCI_ASSOC+OCI_RETURN_NULLS)) {
            echo "<tr>\n";
            foreach ($row as $item) {
                    echo "    <td>" . ($item !== null ? htmlentities($item, ENT_QUOTES) : "&nbsp;") . "</td>\n";
            }
            echo "</tr>\n";
    }
    echo "</table>\n";
-5
répondu Ben 2013-03-14 21:32:15