Tags : PEAR

このTagsの登録数:1件 表示 : 1 - 1 / 1

PEAR::Auth の Auth_Container_DB に前もって用意していた PEAR::DB を与える

post : 2006-05-20 23:51 | , ,

PEAR::Auth (1.3.0) とPEAR::DBを使っていると、Authで使われるDBがメインで使うものと別個に生成されるのが気持ち悪い。また、MySQL4.1以降では、"SET NAMES 'utf8'"を実行しておかないと、環境によっては$auth->getAuthData()の結果が文字化けする。そういう理由からもメインで用意したDBを使いたい。

AuthやAuth_Container_DBのコンストラクタにはオブジェクトを直接与えることが可能なので、先にDBを与えたAuth_Container_DBを作ってからAuthを作れば良さそうだと思った。しかし実際試してみると、この方法ではパラメータの初期化が行われないのでテーブル名などを設定できない。んで、ソースを読んで突き止めたのが、DSN文字列の代わりにPEAR::DBのインスタンスを渡すという方法。

$params=array(
    "dsn" => "mysqli://localhost/...", //普通はここでDSN文字列だが
    "table" => "account",
    "usernamecol" => "id",
    "passwordcol" => "pass",
    "db_fields" => "*"
);
$params["dsn"] = $db; //DSN文字列ではなくDBオブジェクトをセット
$auth=new Auth("DB", $params, $app_auth_func);

これで正常に動いた。Auth_Container_DBの_connect($dsn)メソッド内で、$dsnが文字列か配列ならDB::Connect()を呼び、$dsnがdb_commonのサブクラスなら(つまりPEAR::DBのオブジェクトなら)直接インスタンス変数に代入、という振り分けをしているので上手く行く。ただし将来も動作が保証されるかどうかは分かりません。PHP4だと参照渡ししてくれないかもしれんので、PHP5専用ということで。