php - getcolumnmeta
php pdo: obtener el nombre de las columnas de una tabla (12)
¿Cómo puedo obtener todos los nombres de columna de una tabla usando PDO?
id name age
1 Alan 35
2 Alex 52
3 Amy 15
La información que quiero obtener es,
id name age
EDITAR:
Aquí está mi intento,
$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);
Entonces entiendo,
Array
(
[0] => id
[1] => name
[2] => age
...
)
$ sql = "select column_name from information_schema.columns donde table_name = ''myTable''";
Créditos de la función 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
}
}
Aquí está la función que uso. Creado en base a la respuesta @Lauer anterior y algunos otros recursos:
//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();
}
}
Ejemplo de uso:
$columns = getColumns(''name_of_table''); // OR getColumns($name_of_table); if you are using variable.
foreach($columns as $col) {
echo $col . ''<br/>'';
}
Esta es una vieja pregunta, pero esta es mi opinión
function getColumns($dbhandle, $tableName) {
$columnsquery = $dbhandle->query("PRAGMA table_info($tableName)");
$columns = array();
foreach ($columnsquery as $k) {
$columns[] = $k[''name''];
}
return $columns;
}
simplemente ponga su variable para su objeto pdo y el nombre de la tabla. Funciona para mi
Este enfoque funciona para mí en SQLite y MySQL. Puede funcionar con otros, por favor avíseme su experiencia.
- Funciona si las filas están presentes
- Funciona si no hay filas presentes (prueba con la
DELETE FROM table
)
Código:
$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);
No garantizo que este sea un SQL válido por ANSI u otro, pero funciona para mí.
Esto funcionará para MySQL, Postgres y probablemente cualquier otro controlador PDO que use la cláusula LIMIT
.
Se agrega LIMIT 0
para un mejor rendimiento:
$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);
Mi contribución ÚNICAMENTE para 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);
}
Mis 2 centavos:
$result = $db->query(''select * from table limit 1'');
$fields = array_keys($result->fetch(PDO::FETCH_ASSOC));
Y obtendrá los nombres de las columnas como una matriz en los campos var $.
No hay necesidad de hacer una consulta secundaria, eso es tonto. Simplemente use la función built in oci_field_name ():
Aquí hay un ejemplo:
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";
Resuelvo el problema de la siguiente manera (solo MySQL)
$q = $dbh->prepare("DESCRIBE tablename");
$q->execute();
$table_fields = $q->fetchAll(PDO::FETCH_COLUMN);
Simplemente ponga el nombre de su base de datos, nombre de usuario, contraseña (¿Dónde he marcado?) Y el nombre de la tabla. & Yuuppiii! .... obtiene todos los datos de su base de datos principal (con el nombre de la columna)
<?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>";
/ * Obtener todos los datos en una tabla 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>";
?>
Una solución muy útil aquí para SQLite3. Porque el OP no indica específicamente MySQL y hubo un intento fallido de utilizar algunas soluciones en 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''];
}
Esto devuelve una matriz. Como se trata de un volcado directo de información, deberá iterar y filtrar los resultados para obtener algo como esto:
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
)
Esto es particularmente agradable de tener cuando la tabla está vacía.
Como se menciona en Charle, este es un método de enunciado, lo que significa que obtiene los datos de la columna de una declaración preparada (consulta).