TOP書籍連動> query()メソッド
SQLiteの高度な活用術
SQLiteの高度な活用術

第4回:SQLiteDatabaseの拡張のメソッドの紹介

著者:Peter Lavin   2006/4/19
1   2  次のページ
query()メソッド

   前回に引き続きSQLiteDatabaseの拡張について紹介します。

   SQLiteResultオブジェクトを作成するこのメソッドはリスト4にあります。getCount()メソッドはバッファーされたクエリの結果セットに対してのみ使用することができます。この結果セットはforeachループで使用されます。SQLiteResultはSPLに含まれているインターフェース、Iteratorを実装しているのだと思うかもしれませんが、結果セットはリフレクションを利用しておりIteratorを継承しているわけではありません。

   しかし、すべてのIteratorのメソッドであるrewind()、next()、valid()、current()メソッドは実装されています。これらのメソッドを直接使用することもできますが、本来の目的はSQLiteの結果セットをforeachのループの中で配列と同じように使用することにあります。

   また、rewind()メソッドはバッファーされていないクエリの結果セットでは使用できないので注意が必要です。なお、このメソッドとunbufferedQuery()メソッドだけが結果セットをオブジェクトとして返却します。


unbu.eredQuery()メソッド

   リスト5の例では結果セットをバッファーする必要がありません。ここではsingleQuery()メソッドの方がよいのですが、singleQuery()メソッドでは複数カラムを持つ単一レコードを取得することができないので、バッファーされないクエリでSQLiteDatabase オブジェクトを取得し、fetch()メソッドで最初の行を配列にコピーします。

リスト5
try{
 $db = new SQLiteDatabasePlus('../dbdir/resources.sqlite');
 $type="Edit";
 //データベースからの検索
 $strsql = "SELECT * FROM tblresources ".
   "WHERE id = '$id'";
 //レコードを取得
 $result = $db->unbufferedQuery($strsql);
 $row = $result->fetch();
 //最初のカラムのみが取得されるので、以下は使用できない
 //$row = $db->singleQuery($strsql, false);
 //フィールド名を変数名として展開する
 while(list($var, $val)=each($row)) {
   $$var=$val;
 }
}catch(SQLiteException $e){
 //debug msg
 echo  $e->getMessage();
    }
}


arrayQuery()メソッド

   PHPのWebサイトのドキュメントでは45以上のレコードを取得する場合はこのメソッドを使用するべきでない、という警告がされているので注意しましょう。このメソッドを使用したスクリプトをリスト6に掲載します。

リスト6
//SQLite用の関数
function set_class_id(){
    static $x = 0;
    $class = 'unshaded';
    if(($x % 2) == 0){
        $class = "shaded";
    }
    $x++;
    return $class;
}
...
$db = new SQLiteDatabasePlus('../dbdir/resources.sqlite');
    $db->createFunction('class_id','set_class_id',0);
    $sql = "SELECT id, url, email, ".
        "(precedingcopy || '' || linktext || ' ' || ".
        "followingcopy) ".
        "AS copy , linktext, reviewed, class_id() ".
        "AS classid ".
        "FROM tblresources ".
        "ORDER BY id DESC ".
        "LIMIT $recordoffset,". PERPAGE;
    //arrayQuery()メソッドの使用
    $resultarray = $db->arrayQuery($sql);
...

   見ての通りですが、このコードではLIMIT句を使用しているので最大で何件のレコードが返却されるのかがわかっています。繰り返しになりますが、このメソッドでも結果セットの作成はスキップされます。

1   2  次のページ

PHPプログラマーズマガジン 書籍紹介
PHPプログラマーズマガジン

PHPプログラマーズマガジンは、PDF形式で読者の方にお届けするPHP言語(PHP: Hypertext Processor)専門誌です。 カナダMTA出版のphp|architect誌を日本語に翻訳し、独自の記事を加えて月刊でお届けしています。

発行:アシアル株式会社  価格:1,029円

 ご購入はこちら
http://www.asial.co.jp/magazine/
Peter Lavin
著者プロフィール
Peter Lavin
カナダ、トロントでWebデザイナ/Web開発者として働いています。現在、PHPのオブジェクト指向をテーマにした本を執筆しており、No Starch Press社より出版される予定です。


INDEX
第4回:SQLiteDatabaseの拡張のメソッドの紹介
query()メソッド
  singleQuery()メソッド