| 分類 | 関数 | 説明 |
|---|---|---|
| 接続 | 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文用に、文字列をエスケープ |
exec()関数を使用することで、SQLiteコマンドを実行できます。そのためには、SQLiteのコマンドラインプログラムを、起動パラメータにコマンドを与えて実行します。
echo exec( 'sqlite.exe test.db .schema' );
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 ); }
| field1 | field2 | |
|---|---|---|
| 1 | 10 | a |
| 2 | 20 | b |
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関数の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ファイルはfile_get_contents()でテキストとして読み込めますので、それをsqlite_exec()により実行します。
// データベースを作成する $databaseHandle = sqlite_open( DATABASE_NAME ); // SQLファイルからクエリを読み込む $sqlQuery = file_get_contents( SQL_FILENAME ); // クエリを実行する sqlite_exec( $databaseHandle, $sqlQuery);
クエリの文字コードが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