まとめ ブログ ダウンロード 掲示板 メール

れぶろぐ

< 2006-05-30 (火) 2006-06-02 (金) > 最新


2006-05-31 (水)

Ethna で PDO を使うサンプル

昨日の続き。 PDOをEthnaのデータベースオブジェクトに使う のページを参考にして、 Ethna のチュートリアルで作ったサンプルを、 PDO を使うようにしてみる。

Ethna_DB_PDO.php をインストール。

# cd /dev/shm
# wget http://dozo.rgr.jp/Ethna_DB_PDO.tar.gz
# tar xvfz Ethna_DB_PDO.tar.gz
# cp Ethna_DB_PDO/class/DB/Ethna_DB_PDO.php /usr/share/php/Ethna/class/DB/

app/Sample_Controller.php の $class の設定を以下のように変更。

var $class = array(
    ……
    'db' => 'Ethna_DB_PDO',
    ……
);

この段階でとりあえず実行してみたら、こんな風に言われた。

Fatal error: Class 'Ethna_DB_PDO' not found in /usr/share/php/Ethna/class/Ethna_Backend.php on line 367

なんで? エラーが出た辺りのコードを読んだり、 grep Ethna_DB_PEAR してみると、 /usr/share/php/Ethna/Ethna.php に以下のように書かれているのを発見。

include_once(ETHNA_BASE . '/class/DB/Ethna_DB_PEAR.php');

あー、決めうちしてるのか。 app/Sample_Controller.php の方で Ethna_DB_PDO.php を include しても良いのだろうが、 PEAR::DB でなく PDO オンリーで動くことを確認したいので、 ここはきっぱりと、 上記の箇所を Ethna_DB_PDO.php を include するように書き換えてしまう。

そうして、その後もいろいろと試行錯誤してみて、 以下のようなコードで動くことを確認できた。

<?php

class Sample_UserManager
{
    function auth($db, $mailaddress, $password)
    {
        $sql = 'SELECT password FROM user WHERE email=?';
        $db->prepare($sql);
        $db->execute(array($mailaddress));
        $row = $db->fetch();
        if ($row[0] != md5($password)) {
            return Ethna::raiseNotice('パスワードが違います', E_SAMPLE_AUTH);
        }
        return 0;
    }
}

?>

ただ、動きはするのだが、どうも期待していたのと違う。

  • execute() とか fetch() が $db のメソッド
  • bindparam() などの PDOStatement クラスのメソッドが何も使えない

ところが、query() メソッドの方の実装を見てみると、 こちらは PDOStatement オブジェクトを返している。 他の Ethna_DB_PEAR とか Ethna_DB_ADODB を見ても、 query() メソッドはそのクラス独特の結果オブジェクトを返しているので、 単純に、return 文の書き忘れ、ではないかという気もしてきた。

とりあえず、prepare() メソッドに、 return $this->stmtObj; の1文を追加して、 PDOStatement オブジェクトを返すようにしてみた。 そうすると、上記のプログラムは以下のように書き直すことができる。

<?php

class Sample_UserManager
{
    function auth($db, $mailaddress, $password)
    {
        $sql = 'SELECT password FROM user WHERE email=?';
        $stmt = $db->prepare($sql);
        $stmt->bindparam(1, $mailaddress);
        $stmt->execute();
        $row = $stmt->fetch();
        $stmt->closeCursor();
        if ($row[0] != md5($password)) {
            return Ethna::raiseNotice('パスワードが違います', E_SAMPLE_AUTH);
        }
        return 0;
    }
}

?>

PDO にべったりという感じになるが、 逆にこれくらいのことが書けないと PDO を使う意味が無い。 どうせ現状では、Ethna_DB はたいして抽象化されていないので、 これでいいんじゃないかと思う。

このエントリの続き: 2006-06-17 (土)
Tags: Ethna | このエントリを含む del.icio.us | このエントリを含むはてなブックマーク | このエントリを含む livedoor クリップ | Permalink
本日のリンク元

編集