データベースに格納された他のカラムの取得

広告

認証用データベースにはユーザー名とパスワードだけを登録していましたが、同じテーブルに別のカラムを用意しておくことでPEAR::Authの仕組みを使って取り出すことが可能です。

データベースの準備

まずデータベース側の準備をします。今回は氏名と部署を表すカラムを追加してみましょう。

PEAR::AUTHで他の情報の取得

これでカラムが追加されました。次に既に登録されている行について、追加したカラムに値をセットしておきます。

PEAR::AUTHで他の情報の取得

Authクラスのコンストラクタの変更

データベース側の準備が出来ましたので実際に取り出してみます。データベースからユーザー名とパスワード以外のカラムの値を取得する時には、Authクラスのコンストラクタの2番目の引数であるオプションを指定する時に、取り出したいカラム名を「db_fields」をキーにして配列に追加します。

例えば今までは下記のように記述していました。

$params = array(
    "dsn" => "mysqli://authuser:authpass@localhost/authdb",
    "table" => "authtable",
    "usernamecol" => "username",
    "passwordcol" => "password"
);

他のカラムも取得する場合は下記のように記述します。

$params = array(
    "dsn" => "mysqli://authuser:authpass@localhost/authdb",
    "table" => "authtable",
    "usernamecol" => "username",
    "passwordcol" => "password",
    "db_fields" => "*"
);

上記のように「*」を指定した場合には、テーブルに含まれる全てのカラムを後で利用する事が出来るようになります。

認証済みユーザーの指定したカラムの値を取り出す

先ほどの形式でAuthクラスのオブジェクトを作成しましたら、Authクラスで用意されている「getAuthData」メソッドを使って他のカラムの値を取り出すことができます。具体的な利用方法は下記の通りです。

$params = array(
    "dsn" => "mysqli://authuser:authpass@localhost/authdb",
    "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");
}

「getAuthData」メソッド引数に取り出したいカラム名を指定することで、現在認証されたユーザーが登録されている行にある指定のカラムの値を取り出すことが出来ます。

サンプルプログラム

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

sample9-1.php

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

require_once "Auth/Auth.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>");
}

$params = array(
    "dsn" => "mysqli://authuser:authpass@localhost/authdb",
    "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::AUTHで他の情報の取得

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

PEAR::AUTHで他の情報の取得

認証後に該当のカラムの値を取り出せているようなのですけど、文字化けしてしまっています。

これは私のMySQLの環境が「SJIS」で設定してあるためです。文字化けを回避するには「SET NAMES sjis」を実行しておかなければならないのですがPEAR::Authを使う場合にはデータベースに固有のクエリを送信する機能がありません。PEAR::AuthではPEAR::DBを利用してデータベースへ接続しているのですけど、PEAR::AuthのオブジェクトからPEAR::DBのデータベースオブジェクトを取り出すこともできません。

その為、文字化けを開始するにはまずPEAR::DBクラスのオブジェクトを作成しておき、それを元にPEAR::Authを利用するようにする必要があります。これは次のページで確認します。

( Written by Tatsuo Ikura )