PHPからSQLiteデータベースへの接続

PHPのSQLiteに関する関数
分類 関数 説明
接続 sqlite_open データベースへ接続
 (データベースファイルを開く)
sqlite_close データベースへの接続を解除
 (データベースファイルを閉じる)
取得 sqlite_current 結果セットから、カレントレコードを取得
 (処理後に次のレコードへ移動しない)
sqlite_fetch_array 結果セットから、カレントレコードを取得
 (処理後に次のレコードへ移動する)
sqlite_fetch_single
sqlite_fetch_string
結果セットから、カレントレコードの最初のフィールドを取得
sqlite_array_query SQLコマンドを実行し、結果を配列で取得
sqlite_num_rows 結果セットから、レコード件数を取得
シーク sqlite_seek 特定のレコードへシーク
sqlite_rewind 先頭のレコードへシーク
sqlite_next 次のレコードへシーク
クエリ実行 sqlite_exec SQLコマンドの実行
sqlite_query SQLコマンドを実行し結果を受け取る
sqlite_unbuffered_query SQLコマンドを実行し結果を受け取る
 (結果セットへの高速アクセス。ランダムアクセス不可)
エスケープ sqlite_escape_string SQLiteのSQL文用に、文字列をエスケープ
PHP: SQLite 関数 - Manual

SQLiteコマンド

exec()関数を使用することで、SQLiteコマンドを実行できます。そのためには、SQLiteのコマンドラインプログラムを、起動パラメータにコマンドを与えて実行します。

echo exec( 'sqlite.exe test.db .schema' );

SQLite関数

SQLite関数sqlite_query()で実行し、sqlite_fetch_single()で結果を取得できます。
※ このSQLite関数はSQLiteの関数であって、PHPのSQLiteに関する関数とは異なるものです。

$result = sqlite_query( $databaseHandle, 'SELECT count( * ) FROM table1' );
$count = intval( sqlite_fetch_single( $result ) );

データベースへの接続

接続 (ファイルを開く)

resource sqlite_open(
    string $filename           // データベースのファイル名
    [, int $mode = 0666        // モード
    [, string &$error_message  // エラー発生時のエラーメッセージ格納用
    ] ] )

接続解除 (ファイルを閉じる)

void sqlite_close(
    resource $dbhandle    // データベースハンドル
    )

データの追加

// データベースを開く (存在しないならば作成する)
$databaseHandle = sqlite_open( DATABASE_NAME );

if( $databaseHandle )
{
    $sqlCommand =
        "INSERT INTO $tableName( field1, field2 ) VALUES( 256, 'abc' )";

    // データベースにSQLステートメントを実行する
    sqlite_query( $databaseHandle, $sqlCommand );

    // データベースを閉じる
    sqlite_close( $databaseHandle );
}

文字列のエスケープ

フィールド値に文字列を追加する場合には、SQL文が正しく解釈されるためにそれをエスケープする必要がある場合があります。

sqlite_escape_string()関数はシングルクォート ( ' ) を、2つ並べた形式 ( '' ) に置換します。

string sqlite_escape_string( string $item )

トランザクション

SQLiteでは更新コマンドごとに自動的にトランザクションが開始されるため、通常は明示的に実行する必要はありません。しかしそのために、多量のデータを追加する際には処理が遅くなる問題があります。よってそのような場合には、明示的にトランザクションを宣言する必要があります。

// データベースを開く (存在しないならば作成する)
$databaseHandle = sqlite_open( DATABASE_NAME, 0666, $databaseOpenError );

if( $databaseHandle )
{
    // トランザクションを開始する
    if( sqlite_query( $databaseHandle, 'BEGIN' ) )
    {
        $sqlCommand = "INSERT INTO $tableName( field1 ) VALUES( 'abc' )";

        // データベースにSQLステートメントを実行する
        if( sqlite_query( $databaseHandle, $sqlCommand, SQLITE_BOTH, $databaseWriteError ) )
        {
            // トランザクションをコミットする
            sqlite_query( $databaseHandle, 'COMMIT');
        }
        else
        {
            // トランザクションをロールバックする
            sqlite_query( $databaseHandle, 'ROLLBACK' );
        }
    }

    // データベースを閉じる
    sqlite_close( $databaseHandle );
}

データの取得

table1
  field1 field2
1 10 a
2 20 b

1つだけ取得

sqlite_fetch_single()関数で、結果レコードの最初の値を取得できます。

$databaseHandle = sqlite_open( DATABASE_NAME );

$sqlCommand = 'SELECT * FROM table1'
$resultHandle = sqlite_query( $databaseHandle, $sqlCommand );

echo sqlite_fetch_single( $resultHandle );
これは上記のテーブル(table1)に対して、以下のような出力をします。
10

すべて取得

SELECTコマンドで取得したデータは、sqlite_fetch_array()関数でレコードごとに配列として取得することができます。なおその引数にSQLITE_ASSOCと指定すると連想配列のキーが、SQLITE_NUMとするとインデックスが結果として返されます。

結果配列の添の定義
定数 意味
SQLITE_ASSOC 連想配列 (Associative array) のキーのみ
SQLITE_NUM イデックスのみ
SQLITE_BOTH キーとインデックスの両方 (デフルト)

この例のようにデータベースの前方から順にアクセスするだけならば、SELECTコマンドの実行はsqlite_query()ではなく、sqlite_unbuffered_query()の方が高速に処理できます。

$databaseHandle = sqlite_open( DATABASE_NAME );

$sqlCommand = 'SELECT * FROM table1';
$resultHandle = sqlite_query( $databaseHandle, $sqlCommand );

// 結果ハンドルから、レコードを配列として取得する
while( $record = sqlite_fetch_array( $resultHandle, SQLITE_ASSOC ) )
{
    print_r( $record );
}

出力例

Array
(
    [field1] => 10
    [field2] => a
)
Array
(
    [field1] => 20
    [field2] => b
)

すべて配列として取得

sqlite_array_query()関数を使用すると、SELECTコマンドの結果のすべてを配列として取得できます。(この関数は、結果レコードが45件以下のクエリーに対してのみ使用すべきです)

$databaseHandle = sqlite_open( DATABASE_NAME );

$sqlCommand = 'SELECT * FROM table1';

// 定データーにクリを実行し、結を配列として取する
$result = sqlite_array_query( $databaseHandle, $sqlCommand, SQLITE_ASSOC );

print_r( $result );

出力例

Array
(
    [0] => Array
        (
            [field1] => 10
            [field2] => a
        )

    [1] => Array
        (
            [field1] => 20
            [field2] => b
        )
)

データ件数の取得

sqlite_num_rows()で、指定条件に一致するデータの件数を取得できます。

次の例では、table1テーブルのfield1の値が10以上のデータの件数を取得しています。

$sqlCommand = 'SELECT * FROM table1 WHERE field1 >= 10';
$resultHandle = sqlite_query( $databaseHandle, $sqlCommand );

$count = sqlite_num_rows( $resultHandle );

※ クエリを実行するのにsqlite_unbuffered_query()を使用するとsqlite_num_rows()は実行できないため、sqlite_query()を使用する必要がある。

SQLite関数を使用する方法

SQLite関数countを使用する方法でも、データの件数を調べられます。

コマンドはsqlite_query()で実行し、結果の値は1つ受け取るだけでよいのでsqlite_fetch_single()で取得します。

$sqlCommand = 'SELECT count( * ) FROM table1 WHERE field1 >= 10';
$resultHandle = sqlite_query( $databaseHandle, $sqlCommand );

$count = sqlite_fetch_single( $resultHandle );

SQLファイルの実行

複雑なSQLは外部のファイルに記述した方が管理が容易になります。テキストエディタでSQLを記述し、拡張子を.sqlとして保存します。(ここの内容では拡張子は無関係ですが…)

SQLファイルはfile_get_contents()でテキストとして読み込めますので、それをsqlite_exec()により実行します。

// データベースを作成する
$databaseHandle = sqlite_open( DATABASE_NAME );

// SQLファイルからクエリを読み込む
$sqlQuery = file_get_contents( SQL_FILENAME );

// クエリを実行する
sqlite_exec( $databaseHandle, $sqlQuery);

SQLiteの文字コード

クエリの文字コードがSQLiteのそれと一致していない場合、クエリの実行に失敗します。その際のエラーは以下のようなものです。

Warning: sqlite_exec() [function.sqlite-exec]:
  near "CREATE": syntax error in C:\index.php on line 256

SQLiteの文字コードは、既定ではiso8859となっています。これはphp.iniのSQLite Encodingの項目で確認できます。またはsqlite_libencoding()関数で確認することができます。
PHP: sqlite_libencoding - Manual