bindParamとbindValue

2008/10/01 | PDO

pdoを使ってプリペアードステートメントから各値をバインドするための関数が2つ用意されている。bindParamとbindValueだ。bindValueはコマンドが発行される都度SQL文に値がセットされるのに対し、bindParamは参照で値が渡され、execute実行時に初めて値に変換される。とりあえずマニュアルを読んで理解していたつもりだったのだが、やっぱり「つもり」だった。

$sql=’INSERT INTO table VALUES (?,?)';

上記のSQL文をプリペアードステートメントとしてセットし値をバインドしていくわけだが、こんなことをしてしていた。

$values=array(1=>3,2=>5);
foreach($values as $name => $value){
$preparedStatementObj->bindParam($name,$value);
}
$preparedStatementObj->execute();

こうすると、tableには(3,5)というデータが格納されてほしいのに、(5,5)というデータが入ってしまう。最初はまったく意味がわからなくて30分くらい悩んでしまった。そこでマニュアル読み直し。「参照渡し」「execute実行時に初めて・・・」。あ、そうか。値を渡すときに使う変数がいつも$valueだから、execute実行時には最後の$valueの値に置き換えられてしまっていたのか。

問題を解決する方法はbindValueを使うか、値をセットする都度異なる変数名を使用するか、のいずれか。どちらで試しても大丈夫だった。まさしく生兵法は怪我の基だった。

フレームワーク3eyes

なんだかいちおうフレームワークが形になってきた。細かいところはまだ時間がかかりそうだけど、大筋で見込みがついた。形から入る、というわけではないけれど名前をつけてウェブも作った。

フレームワーク3eyes公式サイト

名前は前から考えてた。短い名前がよくて、意味付けできるようなの。3eyesは文字通り3つの視点(MVC)にわけて開発するためのツールという意味(という意味を後付した・・・)。ウェブはまだ表紙だけ。

公式サイトといえば見栄えするが、所詮は俺俺フレームワークなんだけど。

軽量フレームワーク

いわゆるライトウェイトなフレームワーク。現在はguessworkを使用している(かなりカスタマイズして)。いくつか軽量なフレームワークがあるようで、どれもなかなかよくできていると思う。

  • guesswork classic
    PHP4向け。PHP5でも動作OK。よくできています。現在PHP5向けの新版を開発していらっしゃるとのこと。非常に期待をしているのだが、いまだ新版のアナウンスがない。作者さん、がんばってください。
  • ちいたん
    cakePHPの軽量版。 よくできています。MVC。名称は作者の奥さんの愛称、というなんとも愛妻家な方。ただ、使うことはないです。なんかコンセプトとかが理解できなくて。
  • Code Ignighter
     PHP4、5両対応。よくできています。うちのアンケートサイトを講演会の募集で使っていただきました。基本的にmod_rewriteを使うようです。そもそも自分としてはmod_rewriteを前提としたフレームワーク自体が「軽量」ではないと思っているので使わないです(だったらZend Frameworkにします)。

こういう立派なフレームワークに参戦しようとするつもりはまったくないのだけれど、自分にしっくりくるフレームワークがほしくて一念発起。年末には公開予定。現在はいい感じで開発を進めている。もし誰か興味ありそうな人がいたら連絡を。

データベース操作はPDOで

2008/09/20 | PDO

最近の流行はPDOらしい。ということで今後はPDOを使うことにした。というのもZend_FrameworkでもPDO推奨らしいから。

PDOのマニュアルを見ると、プリペアードステートメントを使うことが基本のように見える。もちろんそのほうが、SQLインジェクションに悩まされることもないのだから当たり前といえば当たり前。これを機会に自分もそういう方向性で作業を進めることにする。でももうこれでPHP4には戻れない(戻るつもりもないけれど)。

とりあえず自分用に最低限のサンプルをメモしておく。

  1. $pdo=new PDO(“mysql:host=localhost; dbname=myDB”,”user”,”password”);
  2. $sql=’SELECT * FROM samples';
  3. $stmt=$pdo->prepare($sql);
  4. $stmt->execute();
  5. while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
  6. var_dump($row);
  7. }

1行目でデータベースに接続してPDOオブジェクトの作成。DSNがちょっと今までと違うので注意が必要。2行目でSQLを用意して、3行目でprepareしているのだが、こんな簡単なSQLならprepareせずに直接queryメソッドを使うのもありだろう。prepareすると、その返り値はオブジェクトになっていて、以降そのオブジェクト(PDOStatementオブジェクト)に対して処理することになる。4行目でprepareしたSQL文を実行する。本来ならSQL文に「?」などのパラメータを使って値を格納する「箱」を用意しておき、3行目と4行目の間でbindParamなどを使って、それぞれの箱に値を代入して、それからSQLを実行することになる。実行結果はfetchメソッドを使って1行ずつ処理、ということだ。

特に難しいことはない。ただ今まで使っていたものに対して、汎用性を持たせて作りこむのが面倒だ。

高機能メール受信クライアントQdmailReceiver

2008/08/29 | PHPライブラリ

1ヶ月ぶりくらいの更新。ここのところ本業で忙しかったから、新しい技術に触れる機会がなかった。

以前携帯から写メールを送信し、それをPOPして添付ファイルを取り出してアルバムを作成するような仕組みを作った。その際はPEARを試したり、Zendを試したりいろいろ試行錯誤しつつ、結局は自分でかなりのスクリプトを書かなくてはいけなかった(実際書いたのは数十行だけど、試行錯誤段階から考えれば1000行以上は書いたと思う)。

今回、とあるクライアントから同等(もしくはそれ以上)の機能を実現できないか打診を受けた。しかし上記の「なんちゃってスクリプト」では申し訳ないし、うまい方法がないかと考えていたら、大変すばらしいライブラリに出会えた。

QdmailReceiver Multibyte mail decoder & POP Client

作者の方はメール関連のライブラリをいくつか記述していらっしゃるが、どれも大変すばらしい(といっても2本試しただけなのだけれど)。上記のライブラリを使うとメールをPOPしてあっという間にメール本文と添付ファイルに分割してくれる優れものだ。そしてHTMLメールにも対応しているので、文句のつけようがない。これで0.1.1アルファ版だというのだから作者の謙虚さにも恐れ入る。

実際のスクリプトは以下のように記述した。

require_once(‘qdmail_receiver.php’);
$server = array(
‘protocol’=>’pop3′,
‘host’=>’mail.example.com’,
‘user’=>’username’,
‘pass’=>’password’,
);
$receiver = QdmailReceiver::start(‘pop’, $server);
for($i = 1 ; $i <= $receiver->count() ; $i++){
$receiver->header(‘subject’);
var_dump($receiver->bodyAutoSelect());
$attachments = $receiver->attach();
foreach($attachments as $attachment){
var_dump($attachment);
}
$receiver->next();
}

11行目で本文を取り出しているのだが、なぜか10行目にあるようにヘッダに対して何らかの処理をしないと本文を取得できなかった。仕様だろうか。しかしまぁ、ヘッダは当然のように処理しなくてはいけないのでなんら問題はない。これでまた楽ができそうだ。


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