作成したデータベースオブジェクトを引数に指定

広告

PEAR::Authで認証にデータベースを利用する場合、PEAR::DBを内部的に使ってデータベースへ接続します。データベース関連は隠蔽されており全て自動で行ってくれますのであまり意識する必要は無いのですが、MySQLなどを利用する場合にクライアント文字コードを設定したいなど個別のクエリを発行したくてもそのメソッドが用意されていません。

そこでまずPEAR::DBを使ってデータベースオブジェクトを作成しておいてから、そのデータベースオブジェクトをPEAR::Auth側で使うようにしてみます。こうすることで個別のクエリの発行はデータベースオブジェクトを使って行う事ができるようになります。

※PEAR::DBの使い方については『PEAR::DBの使い方』を参照して下さい。

ではまずPEAR::DBを使ってデータベースへ接続を行います。

require_once 'DB.php';

$dsn = 'mysqli://authuser:authpass@localhost/authdb';

$db = DB::connect($dsn);
if (PEAR::isError($db)) {
    die($db->getMessage());
}

次にクライアント文字コードを設定するために「SET NAMES sjis」をMySQLへ送信します。

require_once 'DB.php';

$dsn = 'mysqli://authuser:authpass@localhost/authdb';

$db = DB::connect($dsn);
if (PEAR::isError($db)) {
    die($db->getMessage());
}

$db->query('SET NAMES sjis');
if (PEAR::isError($db)) {
    die($db->getMessage());
}

次に作成したデータベースオブジェクトを使ってAuthクラスのオブジェクトを作成します。作成するにはオプションのDSNの文字列を指定していた部分にDSN文字列の代わりに先に作成したデータベースオブジェクトを指定します。

require_once 'DB.php';

$dsn = 'mysqli://authuser:authpass@localhost/authdb';

$db = DB::connect($dsn);
if (PEAR::isError($db)) {
    die($db->getMessage());
}

$db->query('SET NAMES sjis');
if (PEAR::isError($db)) {
    die($db->getMessage());
}

$params = array(
    "dsn" => $db,
    "table" => "authtable",
    "usernamecol" => "username",
    "passwordcol" => "password",
    "db_fields" => "*"
);

$authobj = new Auth("DB", $params, "loginFunction");

これで先に作成したデータベースオブジェクトを元にAuthクラスのオブジェクトを作成出来ました。後は今までと同じですのでデータベースオブジェクトについては特に意識せずに利用します。

サンプルプログラム

では実際に試してみましょう。

sample10-1.php

<html>
<head>
<title>PHP認証テスト</title>
</head>
<body>
<?php

require_once "Auth/Auth.php";
require_once 'DB.php';

function loginFunction($username, $status){
    if ($status == AUTH_WRONG_LOGIN){
        print("ユーザー名又はパスワードが間違っています<br>");
    }

    print("<form method=¥"post¥" action=¥"".$_SERVER['PHP_SELF']."¥">");
    print("<table>");
    print("<tr>");
    print("<td>ユーザー名</td>");
    print("<td><input type=¥"text¥" name=¥"username¥"></td>");
    print("</tr>");
    print("<tr>");
    print("<td>パスワード</td>");
    print("<td><input type=¥"password¥" name=¥"password¥"></td>");
    print("</tr>");
    print("<tr>");
    print("<td colspan=¥"2¥"><input type=¥"submit¥"></td>");
    print("</tr>");
    print("</table>");
    print("</form>");
}

$dsn = 'mysqli://authuser:authpass@localhost/authdb';

$db = DB::connect($dsn);
if (PEAR::isError($db)) {
    die($db->getMessage());
}

$db->query('SET NAMES sjis');
if (PEAR::isError($db)) {
    die($db->getMessage());
}

$params = array(
    "dsn" => $db,
    "table" => "authtable",
    "usernamecol" => "username",
    "passwordcol" => "password",
    "db_fields" => "*"
);

$authobj = new Auth("DB", $params, "loginFunction");

$authobj->start();

if ($authobj->getAuth()){
    $name = $authobj->getAuthData("name");
    $post = $authobj->getAuthData("post");

    print("こんにちは<br>");
    print("名前 : ".$name."<br>");
    print("部署 : ".$post);
}

?>

</body>
</html>

上記をWWWサーバに設置しブラウザで見てみると下記のように表示されます。

PEAR::DBで作成したデータベースオブジェクトを使う

ただしいユーザー名とパスワードを入力し「クエリ送信」ボタンを押すと下記のようになります。

PEAR::DBで作成したデータベースオブジェクトを使う

今度は文字化けせずにカラムの値を取り出して表示することが出来ました。

一応うまくいきましたがこの記述の仕方が効率がいい記述方法なのかどうかは分かりません。また分かりましたら更新いたします。

( Written by Tatsuo Ikura )