|
||||||||||
| 1 2 3 次のページ | ||||||||||
| オブジェクトAPI | ||||||||||
|
今までは関数APIを中心にサンプルプログラムを掲載してきましたが、SQLiteはオブジェクトAPIも利用できます。オブジェクトAPIを利用すると、 PEAR::DBなどのクラスライブラリを利用すること なくオブジェクト指向プログラミングを行うことが 容易になります(リスト11)。 |
||||||||||
| 利用できるメソッドがわからない場合は「print_r( get_class_methods( get_class ( "オブジェクト" ) ) );」を実行すると、利用で きるメソッドを確認できます。ほとんどの関数API はオブジェクトAPIとして利用できるので、好みに応じて使い分けるとよいでしょう。ここでは、fetchメソッドに対して定数 SQLITE_ASSOCを渡していますが、これはフィール ド名を配列インデックスとして渡すという定義です。数値インデックスにしたい場合はSQLITE_NUM とします。何も定義しない場合には、フィールド名 を配列インデックスとしたものと数値インデックス が混合した配列が返されるので、用途に応じて使い分けるとよいでしょう。 | ||||||||||
| 図5●SQLiteとMySQLの性能評価 | ||||||||||
![]() |
||||||||||
| UDF(ユーザー定義関数) | ||||||||||
| SQLiteは、PHP関数をUDF(ユーザー定義関 数)として登録することもでき、独自に作成した関数をSQL関数として呼び出せます。これには、登 録したい関数名と実際に利用するSQL関数名、引 数の数を定義します(リスト12、リスト13)。当然 ですが、登録したい関数名に対応した関数を事 前に作成しておくことが必要です。 また、集約関数も集約UDFとして同様に登録で きます。UDFと異なり、集約UDFでは、対象レ コードすべてを処理し終えた時点で、引数の一番最後に定義した関数が一度だけ呼び出されます (リスト14、リスト15)。実際に処理を行う関数と 結果を返す関数をそれぞれ定義する必要がある ので注意してください。 すでにSQLiteで用意されている関数をUDFお よび集約UDFでオーバーライドすることもできます が、特に理由がない限りは避けるほうが無難です。 | ||||||||||
| リスト11●obAPI.php | ||||||||||
| <? $SQLite = sqlite_factory( "testdb" ) or die( "db open error!!" ); $SQLite->query( "begin" ); $Result = $SQLite->query( "select foo, bar from hoge where foo while( $Array = $Result->fetch ( SQLITE_ASSOC ) ) { print_r( $Array ); } $SQLite->query( "commit" ); ?> |
||||||||||
| リスト12●UDF.php | ||||||||||
| <? include( "UDF.inc" ); $SQLite = sqlite_factory( "testdb" ) or die( "db open error!!" ); $SQLite->createFunction( "go_replace", "mb_convert_kana", 2 ); $SQLite->createFunction( "go_change", "my_change", 1 ); $SQLite->query( "begin" ); $Result = $SQLite->query( "select go_replace( foo, 'N' ), go_change ⇒ ( bar ) from hoge where foo while( $Array = $Result->fetch ( SQLITE_NUM ) ) { print_r( $Array ); } $SQLite->query( "commit" ); ?> |
||||||||||
| リスト13●UDF.inc | ||||||||||
| <? //-----------------------------------// // UDF関数:go_change // "TEST"を"test"に変換して半角数字を全角数字に変換) //-----------------------------------// function my_change( $String ) { return mb_convert_kana ⇒ ( mb_ereg_replace( "TEST", "test", $String ), "RN" ); } ?> |
||||||||||
| リスト14●AggUDF.php | ||||||||||
| <? include( "AggUDF.inc" ); $SQLite = sqlite_factory( "testdb" ) or die( "db open error!!" ); $SQLite->createAggregate( "go_research", "my_research", "my_research_finalize" ); $SQLite->query( "begin" ); $Result = $SQLite->query( "select go_research( bar ) from hoge where foo while( $Array = $Result->fetch ( SQLITE_NUM ) ) { print_r( $Array ); } $SQLite->query( "commit" ); ?> |
||||||||||
| リスト15●AggUDF.inc | ||||||||||
| <? //-----------------------------// // 集約UDF関数:my_research // 01がデータ中に何件存在しているかを調べる //-----------------------------// function my_research( &$Context, $String ) { global $GlobalString; if( mb_ereg( "01", $String ) == true ) { ++$Context; $GlobalString .= "?n".$String; } } //-----------------------------// // 集約UDF関数:my_research_finalize // 集約UDFで最後に呼ばれる関数 //-----------------------------// function my_research_finalize ( &$Context ) { global $GlobalString; return $Context.$GlobalString; } ?> |
||||||||||
| リスト16●memory.php | ||||||||||
| <? $SQLite = sqlite_factory( ":memory:" ) or die( "db open error!!" ); $SQLite->query( "begin" ); $SQLite->query( "create table tmp1 ( tmp_a, tmp_b )" ); $SQLite->query( "create table tmp2 ( tmp_a, tmp_b )" ); for( $XX = 1; $XX { $Int = sprintf( "%07d", $XX ); $String = "TEST".$Int; $Result = $SQLite->query( "insert into tmp1 values( ".$XX.", '".$String."' )" ); } for( $XX = 1; $XX { $Int = sprintf( "%07d", $XX ); $String = "test".$Int; $Result = $SQLite->query( "insert into tmp2 values( ".$XX.", '".$String."' )" ); $Result = $SQLite->query( "insert into tmp2 values( ".$XX.", '".$String."' )" ); } $Result = $SQLite->query( "select tmp1.tmp_a, tmp1.tmp_b, tmp2.tmp_b ⇒ from tmp1, tmp2 where tmp1.tmp_a = tmp2.tmp_a order by tmp1.tmp_a" ); while( $Array = $Result->fetch ( SQLITE_NUM ) ) { print_r( $Array ); } $SQLite->query( "commit" ); ?> |
||||||||||
| 図6●phpSQLiteAdminの画面が入ります | ||||||||||
| 一時テーブル | ||||||||||
| SQLiteはメモリ上に情報を保持しておくことも できます。メモリ上に保持している情報は処理完 了時に破棄されるので、テンポラリとして一時的 に利用したい場面 に有効でしょう。メモリを使う 場合には、パラメータにデータベース名ではな く、:memory:と指定します。 ただし、接続リソースが別になっているので、 既存のテーブルと連結して処理を行いたい場合 には、別の工夫が必要になるでしょう。 | ||||||||||
| その他のツールと情報 | ||||||||||
| SQLiteに対応したツールとしては、phpSQLite Admin(http://phpsqliteadmin.sourceforge. net/)があります(図6)。phpSQLiteAdminは執 筆時点ではバージョン0.2で、機能もそう多くなく、 まだまだたくさんの改善の余地があるツールですが、今後SQLiteが一般 的に利用されていくにつれ て改善されていくでしょう。 また、S Q L i t e 関数のP H P マニュアルはhttp://www.php.net/sqliteにあるので、これも参考にするとよいでしょう。 | ||||||||||
| 1 2 3 次のページ | ||||||||||
|
|
||||||||||
|
|
||||||||||
|
||||||||||
|
|
||||||||||
|
||||||||||


