PEARで依存関係の少ないライブラリ

2007/08/24 | その他PEAR全般

最近Xoopsでのモジュール開発やcakePHPでの開発が多いのだが、いずれもPEARライブラリとの相性という点ではそれほどいいわけではない。Xoopsはモジュール単位で開発することが多いので、別途PEARのライブラリを用意しておく、というのはいただけない。モジュールに同梱できる程度にとどめておくべきだ。かといって大量のPEARファイル群をモジュールに同梱するというのは考え物だ。ファイルが多いとそれだけコードが読みにくくなるので、PEARのように複雑に依存関係で絡み合っているようなものはいれたくない、というのが心情だ。
cakePHPはいちおう基本コンセプトとして「PEARなどの外部ライブラリを使用することなく・・・」と謳っているので、なんとなく気分的に使いたくないのだ。
とは言ってもPEARは有用なツールであるので捨てがたい。ということで依存関係がほとんどないようなものに限定して、それらの開発で使用することにしている。
一番手放せないのはPager。ページング処理ではもう手放せない。Pagerは本体(Pager.php)とその配下のディレクトリ一つ(ファイル数個)を丸ごとコピーすれば事足りる。
Cache_Liteもシンプルですばらしい。基本的に本体(Lite.php)だけあれば動作する。ただしエラー処理ルーチンとして、エラーが発生した場合にPEARのエラーオブジェクトを返すよう実装されているので、extendsしたクラスを作成し、その部分だけfalseを返すよう書き換えてしまえばいい。
この二つはシンプルで、非常にすばらしいライブラリだ。

本当はHTML_QuickFormを使いたいのだが、こちらは少し状況が変わってくる。ファイル数も多くなるし、PEAR内での依存関係も少しある。それにXoopsで使用する場合は、Xoopsで用意されたフォーム生成クラスとバッティングしてしまっているということで、どうもためらってしまうのだ。便利だからいいじゃん、って思えるのだが・・・、どこかで一線を越えてチャレンジしてみようと思う。

PagerでPager_Wrapperを使わない処理

2007/06/23 | その他PEAR全般

Pagerでデータベースを絡ませず、データ数からリンクだけ作成する場合の記述例をメモ。

$pagerParam=array();
$pagerParam[‘totalItems’]=’全データ数';
$pagerParam[‘perPage’]=’1ページあたりの表示行数';
$pagerParam[‘delta’]=5;
$pagerParam[‘mode’]=’sliding';
$pagerParam[‘currentPage’]=’現在のページ番号';
$pagerParam[‘extraVars’]=array(‘クエリの引数’=>’クエリの値’);
$pager=Pager::factory($pagerParam);
$link=$pager->getLinks();

最近データベースを絡ませたくないパターンも増えてきたので、いちおうメモ。しかしこのPager、すばらしいよ。確実に工数が減った。

メッセージがこなれていないmdb2

2007/04/24 | その他PEAR全般

あいかわらずmdb2のエラーメッセージはこなれていないと思った出来事。
mdb2でプリペアードステートメントを使ってデータをINSERTするプログラムを書いていて、ちょうどINSERTを実行するときにエラーが出る。

$myDB->extended->executeMultiple($prepared,$data);
のコマンド実行時に以下のエラー。

Fatal error: Call to undefined function: execute() in /(ペアへのパス)/pear/PEAR/MDB2/Extended.php on line 644

え?、え?。意味がわからない。
どうしてPEARスクリプト内で関数が定義されていないなんてエラーが出るわけ?。だったらバグじゃん。

ちょっと驚いていろいろあたってみる。ウェブで検索しても該当するようなページが見つからない。もう一度プログラムをじーっくり見てわかったこと。最初に用意したSQL内にスペルミスがあった(カラム名のスペルミス)。

単なるスペルミスなのだから、プリペアードステートメントを使用しないときと同じように「存在しないカラムを指定しているよ」というようなメッセージを出してくれればいいようなものなのに・・・。きっとこれにははまってしまう人も多いと思う。
ほんとエラーメッセージにはなかされることが多い・・・mdb2。

MDB2のプリペアードステートメント記述メモ

2007/04/22 | その他PEAR全般

MDB2でのプリペアードステートメントの記述方法。いつも忘れてしまうのでメモ。事前に接続を確立したオブジェクト(ここでは「$myDB」)を生成しておく。

[1] $data=array(array(‘a’,’b’,’c’),array(‘d’,’e’,’f’));
[2] $myDB->loadModule(‘Extended’, null, false);
[3] $sql=’INSERT INTO tbl_test VALUES (?,?,?);’
[4] $prepared=$myDB->prepare($sql);
[5] $result=$myDB->extended->executeMultiple($prepared,$data);

[1]でデータの準備。データ自体は連想配列ではなくて普通の配列にする。
[2]で拡張モジュールを使用する旨宣言。
[3]でプリペアードステートメント用のSQLを用意。
[4]で、[3]で用意したSQLからプリペアードステートメントのオブジェクト(?)を用意。
[5]で処理を実行。

登録する値を自動でエスケープしてくれるので楽チン。

Cache_Liteのオプションのことで

2007/02/03 | その他PEAR全般

Cache_Liteが簡単で便利なので、最近は多用するようになった(多用したい衝動に駆られるようになったというほうがあってる・・・つまりまだ多用はしていない)。
今までは「PHPで一つのスクリプトを走らせるのに、こんなにSQLをいくつも発行するのって気に食わないなぁ」と思っていた部分がたくさんあるので、これで少し不満が解消されそうだ。ともあれ、キャッシュを全てのプログラムに埋め込む時間もないので、とりあえず今の受注案件に組み込んでみた。
やっていてわかったことだけど、Cache_Liteは特に何も設定しないと、文字列しかキャッシュできない。つまり文字列でない場合は、その都度serializeするなどして文字列に変換しなくてはいけないのだ。しかしこれは面倒。
Cache_Liteを初期化する際に、コンストラクタへの引数として便利なオプションがあるようだ。「automaticSerialization」。
このオプションをtrueに設定しておくと、毎回自動でserializeしてくれるようだ(デフォルトはfalse)。マニュアルには「動作が遅くなる」と書いてあるが、毎回SQLを呼ぶよりはずいぶんましだと思うので、迷わずtrueに設定した。これまた便利になった。


守谷市(まちの情報ポータル) 無料アンケートレンタルjpForm.net