それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

PDOのSQLiteでカラム名やテーブル定義を取ったりする

mysqlなら show create table を書けばいいんだけど。SQLiteを使うとそれができない。困ったの何とかする。

sqlite_master からSELECTする

SELECT * from sqlite_master;

masterのテーブル構造

SQLITEのテーブル管理テーブルのテーブル構造。

|type|name|tbl_name|rootpage|sql|
type テーブルならtable って書いてある。
name
tbl_name 名前 table名
rootpage
sql create table文

関数にしてみた。

<?php
function get_col_names($table_name){
        $SQL = "SELECT sql FROM
           (SELECT * FROM sqlite_master UNION ALL
            SELECT * FROM sqlite_temp_master)
        WHERE tbl_name LIKE '".$table_name."' AND type!='meta'
        ORDER BY type DESC, name
        ";
        $cols = array();
        $ret = $pdo->query($SQL);
        $a = $ret->fetchAll();
        $sql = $a[0]["sql"];
        $sql = preg_replace("/\n/", '', $sql);
        $sql = preg_replace("/\r/", '', $sql);
        preg_match_all("/\\((.*)\\)/",$sql, $matches);
        $str = $matches[1][0];
        $lines = preg_split('/,/', $str);
        foreach($lines as $idx => $line){
            $line = preg_replace("/^\s+/", "", $line);
            preg_match("/^[^\s+]+/", $line, $m);
            $cols[] = $m[0];
        }  
        return $cols;
}

使い方

<?php
$colnames = get_col_names("books");

とやると、テーブルのカラム一覧が出てくる。抽象化に便利ですね。PDO::FETCH_ASSOCで一つデータを取り出してもいいんだけど、Crete table直後だとデータ無いしね。