Php 当查询未返回任何记录时,如何通过PDO/Sqlite获取列名?
下面的代码允许我将一条SQL语句传递给一个类,并调用它的方法来显示一个漂亮的结果表,包括列名 但是,如果没有结果,我仍然希望显示列名 不幸的是,getColumnMeta没有像我发现的其他示例那样返回任何数据 在这个例子中,有人知道如何让getColumnMeta工作吗?或者,当查询返回零行时,我可以通过另一种方式从SQL语句中获取字段的名称吗 首先,我会尝试: 运行查询 检查是否返回了结果 如果是,请运行initialize和displayHtmlTable 如果否,请运行initializeEmptyResult,该结果将运行下一个查询并只填充$this->columnNames[]: 从信息_schema.columns中选择列_name,其中table_name='my_table_name' 该查询依赖于MySQL,但是其他数据库应该有更多的替代方案,或者您仍然可以运行descripe table并从结果中解析列名称,结果应该是SQL DBMS undependent 其次,我认为这更容易实现:如果查询没有返回结果,则根本不显示coulmn名称或表,只显示一条消息:“找不到结果”。这可以通过displayHtmlTable方法实现: 元表sqlite_master包含所有信息。以下代码将sqlite_master解析为列名称$colnames:Php 当查询未返回任何记录时,如何通过PDO/Sqlite获取列名?,php,sqlite,pdo,Php,Sqlite,Pdo,下面的代码允许我将一条SQL语句传递给一个类,并调用它的方法来显示一个漂亮的结果表,包括列名 但是,如果没有结果,我仍然希望显示列名 不幸的是,getColumnMeta没有像我发现的其他示例那样返回任何数据 在这个例子中,有人知道如何让getColumnMeta工作吗?或者,当查询返回零行时,我可以通过另一种方式从SQL语句中获取字段的名称吗 首先,我会尝试: 运行查询 检查是否返回了结果 如果是,请运行initialize和displayHtmlTable 如果否,请运行initialize
只需扩展@shadyyx注释: PRAGMA table_infotable-name 我手头没有PDO_SQLITE沙箱,但使用本机SQLite3驱动程序,此代码段将为您获取$arrColumns中表名的列名:
但是您的查询有列名,PDO返回列名很重要吗?对,但是如果我发送SELECT*,那么我需要依靠PDO从数据库中获取列名。很公平,我只是想知道您是否考虑过度了
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
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;
}
</style>
</head>
<body>
<?php
$sql = 'SELECT LastName,FirstName,Title FROM employee WHERE 1=2 ORDER BY LastName';
echo '<h2>sqlite</h2>';
$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 < $total_column; $x++) {
$meta = $result -> getColumnMeta($x);
//var_dump($meta);
//bool(false)
//$column[] = $meta['name'];
}
}
}
public function displayHtmlTable() {
$r = '';
$r .= '<div class="sqlCommand">' . $this -> sql . '</div>';
$r .= '<table>';
$r .= '<thead>';
$r .= '<tr>';
foreach ($this->columnNames as $columnName) {
$r .= '<td>' . $columnName . '</td>';
}
$r .= '</tr>';
$r .= '</thead>';
$r .= '<tbody>';
foreach ($this->records as $record) {
$r .= '<tr>';
foreach ($record as $data) {
$r .= '<td>' . $data . '</td>';
}
$r .= '</tr>';
}
$r .= '</tbody>';
$r .= '<table>';
return $r;
}
}
?>
</body>
</html>
public function displayHtmlTable() {
$r = '';
$r .= '<div class="sqlCommand">' . $this -> sql . '</div>';
if(count($this->records) > 0) {
$r .= '<table>';
$r .= '<thead>';
$r .= '<tr>';
foreach ($this->columnNames as $columnName) {
$r .= '<td>' . $columnName . '</td>';
}
$r .= '</tr>';
$r .= '</thead>';
$r .= '<tbody>';
foreach ($this->records as $record) {
$r .= '<tr>';
foreach ($record as $data) {
$r .= '<td>' . $data . '</td>';
}
$r .= '</tr>';
}
$r .= '</tbody>';
$r .= '<table>';
} else {
$r .= '<div class="no-results">No results found for query.</div>';
}
return $r;
}
PRAGMA table_info(table-name);
$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]) ) ;
}
$db = new SQLite3('db.sqlite');
$db->query('PRAGMA table_info(table-name)');
while ($col = $res->fetchArray(SQLITE3_ASSOC)) {
$arrColnames[]=$col['name'];
}
print_r($arrColnames);