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
...
)
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);
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);
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.
$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
}
}
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).
, 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/>';
}
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
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.
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.
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);
}
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>";
?>
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) : " ") . "</td>\n";
}
echo "</tr>\n";
}
echo "</table>\n";