¿Cómo puedo obtener los nombres de las columnas a través de PDO / Sqlite cuando la consulta no devuelve ningún registro?

El siguiente código me permite pasar una instrucción SQL a una clase y llamar a su método para mostrar una buena tabla de resultados, incluidos los nombres de columna.

Sin embargo, si no hay resultados, aún quiero que se muestren los nombres de las columnas .

Desafortunadamente, getColumnMeta no devuelve ningún dato como lo hace en otros ejemplos que he encontrado.

¿Alguien sabe cómo obtener getColumnMeta () trabajando en este ejemplo, o de otra manera puedo obtener los nombres de los campos de la statement SQL cuando la consulta devuelve cero filas?

      table thead tr td { background-color: #ddd; padding: 5px; font-weight: bold; } table tbody tr td { background-color: #eee; padding: 5px; color: navy; } div.sqlCommand { font-family: courier; } h2 { border-bottom: 1px solid #777; }    <?php $sql = 'SELECT LastName,FirstName,Title FROM employee WHERE 1=2 ORDER BY LastName'; echo '

sqlite

'; $dbSqlite = new DbSqlite($sql); echo $dbSqlite -> displayHtmlTable(); class DbSqlite { protected $sql; protected $records = array(); protected $columnNames = array(); public function __construct($sql) { $this -> sql = $sql; $this -> initialize(); } protected function initialize() { $db = new PDO('sqlite:chinook.sqlite'); $result = $db -> query($this -> sql); $result -> setFetchMode(PDO::FETCH_ASSOC); $columnsAreDefined = false; while ($row = $result -> fetch()) { $this -> records[] = $row; if (!$columnsAreDefined) { foreach ($row as $columnName => $dummy) { $this -> columnNames[] = $columnName; } $columnsAreDefined = true; } } if (count($this -> records) == 0) { $total_column = $result -> columnCount(); var_dump($total_column); for ($x = 0; $x getColumnMeta($x); //var_dump($meta); //bool(false) //$column[] = $meta['name']; } } } public function displayHtmlTable() { $r = ''; $r .= '
' . $this -> sql . '
'; $r .= ''; $r .= ''; $r .= ''; foreach ($this->columnNames as $columnName) { $r .= ''; } $r .= ''; $r .= ''; $r .= ''; foreach ($this->records as $record) { $r .= ''; foreach ($record as $data) { $r .= ''; } $r .= ''; } $r .= ''; $r .= '
' . $columnName . '
' . $data . '
'; return $r; } } ?>

Meta tabla sqlite_master contiene toda la información. El siguiente código analizará sqlite_master en nombres de columna como $colnames :

 $colnames = array() ; $stmt = $dbh->prepare("SELECT sql FROM sqlite_master WHERE tbl_name = 'put_table_name_here'") ; $stmt->execute() ; $row = $stmt->fetch() ; $sql = $row[0] ; $r = preg_match("/\(\s*(\S+)[^,)]*/", $sql, $m, PREG_OFFSET_CAPTURE) ; while ($r) { array_push( $colnames, $m[1][0] ) ; $r = preg_match("/,\s*(\S+)[^,)]*/", $sql, $m, PREG_OFFSET_CAPTURE, $m[0][1] + strlen($m[0][0]) ) ; } 
  1. Primer acercamiento que probaría:
    • ejecutar la consulta
    • verificar si hubo resultados devueltos
    • en caso afirmativo, ejecute Your initialize() y displayHtmlTable
    • si no , ejecute Your initializeEmptyResult() que ejecutará la siguiente consulta y solo $this->columnNames[] :
 SELECT column_name FROM information_schema.columns WHERE table_name = 'my_table_name' 

La consulta depende de MySQL bu, debería haber más alternativas para otras bases de datos, o aún Puede ejecutar la DESCRIBE table y analizar los nombres de las columnas desde el resultado (debe ser SQL DBMS undependent).

  1. En segundo lugar, creo que es más fácil de lograr: si no se obtienen resultados de la consulta, no muestre ningún nombre ni tabla, solo muestre un mensaje: “No se encontraron resultados”. Esto podría lograrse dentro de su método displayHtmlTable :

      public function displayHtmlTable() { $r = ''; $r .= '
    ' . $this -> sql . '
    '; if(count($this->records) > 0) { $r .= '
'; $r .= ''; $r .= ''; foreach ($this->columnNames as $columnName) { $r .= ''; } $r .= ''; $r .= ''; $r .= ''; foreach ($this->records as $record) { $r .= ''; foreach ($record as $data) { $r .= ''; } $r .= ''; } $r .= ''; $r .= '
' . $columnName . '
' . $data . '
'; } else { $r .= '
No results found for query.
'; } return $r; }

Y no tiene que preocuparse por los nombres de las columnas …

EDITAR: para el primer caso, se encontró una consulta para SQLite que debería hacer lo mismo que select * from information_schema.columns where table_name = 'xxx' :

 PRAGMA table_info(table-name); 

Solo para ampliar el comentario de @shadyyx:

PRAGMA table_info(table-name);

No tengo un sandbox PDO_SQLITE a mano, pero usando el controlador nativo SQLite3, este fragmento le dará los nombres de columna para table table-name en $ arrColumns :

 $db = new SQLite3('db.sqlite'); $db->query('PRAGMA table_info(table-name)'); while ($col = $res->fetchArray(SQLITE3_ASSOC)) { $arrColnames[]=$col['name']; } print_r($arrColnames);