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 はたいして抽象化されていないので、 これでいいんじゃないかと思う。
- 62 http://dozo.matrix.jp/pear/index.php?Framework/Eth...
- 58 http://dozo.matrix.jp/pear/index.php/Framework/Eth...
- 9 google検索(Ethna_DB_PDO)
- 8 google検索(Class 'PDO' not found)
- 7 google検索(Class 'PDO' not found)
- 6 google検索(Ethna_DB_PDO)
- 5 google検索(ethna db prepare)
- 4 google検索(Ethna_DB_PDO.php)
- 4 google検索(Ethna_DB_PDO)
- 4 http://pukiwiki.sourceforge.jp/?自作プラグイン/cou...
- 3 google検索(class/DB/Ethna_DB_PEAR )
- 3 google検索( Class not found ZEND)
- 3 google検索(Ethna_DB_PDO.php)
- 3 http://www.google.co.jp/url?sa=t&rct=j&q=ethna_db_...
- 3 http://www.google.co.jp/url?sa=t&rct=j&q=ethna pdo...
- 3 google検索(ethna pdo)
- 3 google検索(ethna サンプル)
- 3 google検索(ethna サンプル)
- 3 google検索(Fatal error: Class 'PDO' not found)
- 3 google検索(Class 'PDO' not found)
- 3 google検索(ethna mail)
- 3 google検索(PHP Fatal error: Class Ethna_DB_PEAR not found)
- 3 google検索(PHP PDO サンプル)
- 3 google検索(ethna_db_adodb)
- 3 google検索(ethna fetch)
- 3 google検索(ethna Fatal error: Class not found in /usr/share/php/Ethna/class)
- 3 google検索(Fatal error: Class 'PDO' not found ethna)
- 3 http://www.google.co.jp/hws/search?hl=ja&q=Fatal e...
- 2 https://www.google.co.jp/
- 2 http://www.revulo.com/notify-NotifyUser_NONE_07121...
- 2 google検索(PDO mysql サンプル)
- 2 google検索(php ethna サンプル)
- 2 google検索(t)
- 2 google検索(PDO PEAR Auth)
- 2 google検索(Class 'PDO' not found in )
- 2 google検索(Ethna_DB_PDO.tar.gz)
- 2 google検索(Class 'PDO' not found)
- 2 google検索(Fatal error: Class 'PDO' not found)
- 2 google検索(Class 'PDO' not found)
- 2 google検索(php pdo サンプル)
- 2 google検索(Ethna_DB_PDO)
- 2 http://www.google.co.jp/url?sa=t&source=web&cd=14&...
- 2 http://www.google.co.jp/url?sa=t&source=web&cd=1&v...
- 2 http://www.google.co.jp/url?sa=t&source=web&cd=1&v...
- 2 http://www.google.co.jp/url?sa=t&source=web&cd=1&v...
- 2 http://www.google.co.jp/url?sa=t&source=web&cd=1&v...
- 2 google検索(ethna pdo)
- 2 google検索(Ethna_DB_PDO)
- 2 google検索(t)
- 2 google検索(t)
- 2 google検索(ethna PDO)
- 2 google検索(Ethna_DB_PDO)
- 2 google検索(Ethna_DB_PEAR' not found)
- 2 google検索(ruby wget サンプル)
- 2 google検索(php ethna サンプル)
- 2 google検索(pdo db fetch)
- 2 google検索(pdo サンプル)
- 2 google検索(ethna sql)
- 2 google検索(ethna pdo)
- 2 google検索(ethna db fetch)
- 2 google検索(ethna DB 書き換え)
- 2 google検索(ethna Appオブジェクト)
- 2 google検索(class not found PDO)
- 2 google検索(PHP Fatal error: Class 'Ethna_DB_PEAR')
- 2 google検索(PDO not found)
- 2 google検索(PDO サンプル)
- 2 google検索(PDO サンプル execute)
- 2 google検索(Fatal error: Class 'PDO' not found in)
- 2 google検索(Ethna_DB_PEAR)
- 2 google検索(Ethna_DB_PDO prepare)
- 2 google検索(Ethna_DB_PDO)
- 2 google検索(Class 'PDO' not found)
- 2 google検索(Class 'Sample_Controller' not found)
- 2 google検索(Class 'PDO' not found )
- 2 google検索(Class 'PDO' not found )
- 2 google検索(掲示板 PDO サンプル)
- 2 google検索(Ethna_DB_ADOdb)
- 2 google検索(Ethna_DB_PDO)
- 2 google検索(ethna_db_pdo)
- 2 google検索(Fatal error: Class 'PDO' not found)
- 2 google検索(Ethna_DB_PDO)
- 2 google検索(Ethna Class 'PDO' not found)
- 2 google検索(pdo Class 'PDO' not found)
- 2 google検索(pdo ethna)
- 2 google検索(ethna サンプル)
- 2 google検索(PDO サンプル)
- 2 google検索(Fatal error: Class 'PDO' not found in )
- 2 google検索(Fatal error: Class 'PDO' not found in)
- 2 google検索(Fatal error: Class 'PDO' not found )
- 2 google検索(Fatal error: Class 'PDO' not found)
- 2 google検索(Fatal error: Class 'PDO' not found)
- 2 google検索(Fatal error: Class 'PDO' not found)
- 2 google検索(Fatal error: Class 'PDO')
- 2 google検索(Ethna_DB_PDO )
- 2 google検索(Ethna_DB_PDO)
- 2 google検索(Ethna::raiseNotice)
- 2 google検索(Class 'PDO' not found in)
- 2 google検索(Class 'PDO' not found )
- 2 google検索(Class 'PDO' not found)
- 2 google検索(Class 'PDO' not found)
