getcolumnmeta php pdo fetch

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) : "&nbsp;") . "</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.


PDOStatement::getColumnMeta()

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