リスト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();
}
}
|
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句を使用しているので最大で何件のレコードが返却されるのかがわかっています。繰り返しになりますが、このメソッドでも結果セットの作成はスキップされます。
|