PHPからSQLiteを使用する

以下の環境でPHPからSQLiteを使用する設定を紹介します。

PHP側の設定

PHPSQLite拡張機能を有効化します。php.iniファイル(例:"C:\php\php.ini")を開きます。まず拡張ライブラリのディレクトリが正しく設定されているか確認します(";"でコメントアウトされている場合はコメントアウトを解除します。)。

extension_dir = "[PHPインストールディレクトリ内の"ext"へのパス]"

例:
f:id:chorusde:20120523025619p:image:w500

次に、SQLite3用のライブラリへの参照を有効化します。php.iniファイルの";extension=php_sqlite3.dll"と記述されている箇所を特定してセミコロンのコメントアウトを解除します。

例:
f:id:chorusde:20120523064353p:image:w500

Webサーバを再起動し拡張機能が有効化されていることを確認します。PHPの変更ログを確認するとPHP 5.3.7からPHPにバンドルされているSQLiteのバージョンが3.7.7.1になっているようです。

f:id:chorusde:20120523064354p:image:w500

PHPからSQLiteを使用する

本題のPHPからのコーディングです。SQLite3拡張モジュールのリファレンスはこちら

まずDBの初期化です。SQLite3 クラスを継承したクラスを作成し、コンストラクタにおいてopenメソッドをよびDBに接続します(存在しなければDBファイルが作成されます)。

class NewDB extends SQLite3
{
    function __construct() {
        $this->open('test.db');
    }
}

上記のコードを実行した場合、.phpファイルが存在するディレクトリにDBファイルが作成されます。

f:id:chorusde:20120523064705p:image:w500

DBを接続(作成)し、execメソッドにてDB内にpeopleテーブルを作成して1行挿入(アッガイさん 38歳)します。execメソッドはDBに対して結果を返さないクエリを実行します。

$db = new NewDB();
$db->exec('CREATE TABLE IF NOT EXISTS people (id INTEGER PRIMARY KEY,name TEXT,age INTEGER)');
$db->exec("INSERT INTO people(name, age) VALUES('アッガイ', 38)");

DBに対して結果を返すクエリを実行するにはqueryメソッドを実行します。返される結果はSQLite3Resultクラスです。

$result = $db->query('SELECT * FROM people');

SQLite3Resultクラスにふくまれる結果の行を取得するには、fetchArrayメソッドを使用します。fetchArrayメソッドには行をフェッチする際に以下の3つのモードがあります。

  • SQLITE3_ASSOC
    • 取得した行の各列にアクセスするためのインデックスとして列名を使用する配列を返します。
  • SQLITE3_NUM
    • 取得した行の各列にアクセスするためのインデックスとして0から始まる数値を使用する配列を返します。
  • SQLITE3_BOTH
    • 取得した行の各列にアクセスするためのインデックスとして列名と0から始まる数値を使用する配列を返します(配列のサイズが倍になります)。
var_dump($result->fetchArray(SQLITE3_ASSOC));
var_dump($result->fetchArray(SQLITE3_NUM));
var_dump($result->fetchArray(SQLITE3_BOTH));

最後にcloseメソッドにて切断します。

$db->close();

コードと実行結果

コード(PHP部分のみ)

<?php
    //SQLite3 クラスを継承したクラス。
    //コンストラクタにおいてopenメソッドにてDBを作成/接続します。
    class NewDB extends SQLite3
    {
        function __construct() {
            $this->open('test.db');
        }
    }

    //DB作成・接続
    $db = new NewDB();
    
    //peopleテーブル作成
    $db->exec('CREATE TABLE IF NOT EXISTS people (id INTEGER PRIMARY KEY,name TEXT,age INTEGER)');
    
    //アッガイさん(38歳)の行を挿入
    $db->exec("INSERT INTO people(name, age) VALUES('アッガイ', 38)");
    
    //結果を取得
    $result = $db->query('SELECT * FROM people');
    
    //異なるモードにて結果セットから行をフェッチ
    echo 'フェッチモード = SQLITE3_ASSOC:';
    var_dump($result->fetchArray(SQLITE3_ASSOC));
    
    echo 'フェッチモード = SQLITE3_NUM:';
    var_dump($result->fetchArray(SQLITE3_NUM));
    
    echo 'フェッチモード = SQLITE3_BOTH:';
    var_dump($result->fetchArray(SQLITE3_BOTH));
    
    //接続終了
    $db->close();
?>

実行結果

f:id:chorusde:20120523064706p:image:w350