第1回:トライ!SQLite(1) (3/3)

まるごと PHP!
まるごと PHP!

第1回:トライ!SQLite(1)

著者:桝形誠二(MASUGATA, Seiji)   2005/月/日
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  次のページ


著者プロフィール
著者名
プロフィール


INDEX
Part2:トライ!SQLite
  SQLiteとは?
  性能評価
オブジェクトAPI

人気記事トップ10

人気記事ランキングをもっと見る