2

次のコードを使用すると、SQL ステートメントをクラスに渡し、そのメソッドを呼び出して、列名を含む結果の適切なテーブルを表示できます。

ただし、結果がない場合でも、列名を表示したいと考えています。

残念ながら、getColumnMeta私が見つけた他の例のようにデータを返しません。

この例で getColumnMeta() を機能させる方法、またはクエリがゼロ行を返すときに SQL ステートメントからフィールドの名前を取得する別の方法を知っている人はいますか?

<!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>
4

3 に答える 3

3

メタ テーブルsqlite_masterにはすべての情報が含まれます。sqlite_master次のコードは、次のように列名に解析され$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]) ) ;
}
于 2012-10-04T05:26:35.800 に答える
2
  1. 私が試す最初のアプローチ:
    • クエリを実行する
    • 結果が返されたかどうかを確認する
    • はいの場合は、あなたinitialize()とを実行しますdisplayHtmlTable
    • no の場合はinitializeEmptyResult()、次のクエリを実行して次の項目を入力するYourを実行し$this->columnNames[]ます。
SELECT column_name FROM information_schema.columns WHERE table_name = 'my_table_name'

クエリは MySQL に依存していますが、他のデータベースにはより多くの代替手段があるはずですDESCRIBE table。結果から列名を実行して解析できます (SQL DBMS に依存しない必要があります)。

  1. 2 つ目は、より簡単に達成できると思います。クエリから結果が返されない場合は、列名もテーブルも表示せず、「結果が見つかりません」というメッセージを表示するだけです。displayHtmlTableこれはあなたのメソッド内で達成できます:

        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;
        }
    

そして、列名を気にする必要はありません...

編集:最初のケースでは、次と同じことを行う必要があるSQLiteのクエリが見つかりましたselect * from information_schema.columns where table_name = 'xxx':

PRAGMA table_info(table-name);
于 2012-06-13T14:40:10.463 に答える
0

@shadyyxコメントを拡張するだけです:

PRAGMA table_info(table-name);

便利な PDO_SQLITE サンドボックスはありませんが、ネイティブ SQLite3 ドライバーを使用すると、このスニペットは $arrColumns のテーブル table-name の列名を取得ます

$db = new SQLite3('db.sqlite');
$db->query('PRAGMA table_info(table-name)');
while ($col = $res->fetchArray(SQLITE3_ASSOC)) {
    $arrColnames[]=$col['name'];
}
print_r($arrColnames);
于 2015-05-01T18:44:28.377 に答える