こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

セッションに関して

お世話になっております。
先日も「セッションに関して」と質問させて頂きましたが、引き続き進めている中で、どうも解釈に困ってしまい改めて質問させて頂きます。

と、もうしますのも、下記サイトにある説明で、
http://www.stackasterisk.jp/tech/php/php03_06.jsp;jsessionid=aCXqtz5vDdDg

セッション管理用DB(PostgreSQL)を以下の様に設定とありますが、MySQLでは、どのようなフィールドになるのでしょうか?
CREATE TABLE session (
sid varchar(32) primary key,
uid varchar(16) not null,
password varchar(16),
rawdata varchar(512),
rdate timestamp default 'now'
);

また、サイトで紹介させているスクリプトには、随時session_handler.php とい うプログラムを requireしているのですが、require しない場合の通常のファイルとは、どのような記述になるのか概要だけでも教えてはいただけないでしょうか?

サイトの説明では、「一人のユーザが 10 のページを表示したら、PostgreSQL の構造上 10 行のデータが追加されます。」ということで、セッション管理にはMySQLを勧めておられるのですが(当方もMySQLです)、先のフィールドに関する質問も含めて、少し具体的にお教え願えればと思っております。

この手の質問はPHPではなく、MySQLかな?などと思いつつ、まとまりのない質問になってしまいましたが、スクリプトの構造が分からず、こちらにて投函させて頂きました。

回りくどい質問になってしまいましたが、このサンプルにおいてのMySQLでのフィールドおよび設定。
session_handler.phpファイルの概要。およびrequireしない場合のスクリプトの記述方法(流れだけで構いません)をご指導頂ければ幸いに思っております。
お忙しいところ恐縮ですが宜しくお願い申し上げます。

投稿日時 - 2006-06-30 00:48:29

QNo.2246375

暇なときに回答ください

質問者が選んだベストアンサー

苦労されているようですね。
苦労が今後の糧になります。

一つ訂正があります。#3のdbconn.inc.phpの例では接続IDは$dbで返していますが、#2のauth.inc.phpでは$connとなっています。コピペはいかんですね(笑。

> そのサイトでは、sesshion_tbと、myuser_tbの2つを用意してありますが
というのは分かりませんが、セッションはセッション関数でやるという方針でしょうから、ユーザーテーブルはmyuser_tbという事になります。
私の場合はテーブルはその都度自作しています。

例えば、内部メンバーID、ユーザー名、パスワード、ニックネーム、有効・無効のフラグを作ったとすると、

CREATE TABLE `usr_tb` (
membid int NOT NULL auto_increment,
username varchar(63) default NULL,
passwd varchar(63) default NULL,
nick varchar(127) default NULL,
flg tinyint default 0,
PRIMARY KEY (membid)
)

というようなテーブルになります。出来れば自作したほうが良いですよ。どうせこれからテーブルを作っていくわけですし。
ところで、DBの管理はどうしてますか?
MySQLとPHPではphpMyAdminが一番おすすめです。というより、ほとんどの人が使っているんじゃないかな?

> マニュアルの1番目のコードと2番目のコードは、記述方が違うだけのものなのでしょうか?それとも意味あってのものなのでしょうか?

はっきりとした事は分かりませんが(PEARソースを解読すれば分かるでしょうが)、とりあえずある程度環境依存的になっているような気がします。前にPostgreSQLのバージョンを上げたら配列形式でないと接続出来ない、という事があったので。

マニュアルには何やら詳しく書かれていますね。
http://www.go-pear.org/manual/ja/package.database.db.intro-dsn.php

> 最後に$db->disconnect();があり、No2にはありませんが、この2つの違いは何処から来ているのでしょうか?

disconnect()ですから、接続解除です。No1は題名に接続と解除、とあります。
PHPではプログラムが終了すると接続解除されますので、私は使った事はありません。

> $dsn = 'mysql://root:******@localhost/test';
何はともあれ接続出来るというのは良い事です。
ですが、rootと言うユーザ名で接続するのは出来るだけ止めたほうが良いです。他人に推測出来やすいので。
root以外の管理ユーザを作成し、rootユーザは削除したほうが無難です。
この辺の管理はphpMyAdminの特権管理で出来ます。

では。

参考URL:http://www.phpmyadmin.net/

投稿日時 - 2006-07-05 08:31:52

補足

taketan_mydns_jp様

こんばんは。お世話になっております。補足欄から失礼いたします。

日中、理解を深めるために、お教えいただいたauth.inc.php、dbconn.inc.phpのスクリプト内容を印刷して持ち歩いていたのですが、「なるほど、こうすれば良いのか。あぁすれば良いのか」などと思ったものの、実際に必要な箇所を変更し、実行させたところ、DBに接続してはいるものの、DBに登録されたIDを検索する事が出来ず?に、認証出来ずにおります。(認証失敗ではなく、セッションに登録の状態が続いてます。)

思考錯誤ながら、色々と変更したりでコメント部が多くなっていますが、現在は以下の様になってます。

<?php
require_once("dbconn.inc.php");
session_start();//セッション開く

//セッションに値が無い場合はパスワード認証画面を表示
function authform(){
//action="$PHP_SELF"を変更してみた
echo <<<EOC
<form action="$PHP_SELF" method="post">
ユーザ名 <input type="text" name="username" /><br />
パスワード <input type="password" name="passwd" /><br />
<input type="submit" name="send" value="送る" />
</form>
EOC;
exit;
}

if($_SESSION[auth][username] == ""){
echo "認証が必要です。ユーザー名とパスワードを入力して下さい。";
authform();
}

//ユーザ名とパスワードが送られてきた場合は認証
if($_POST[username] != "" && $_POST[passwd] != ""){
//if($_POST[username] <> "" && $_POST[passwd] <> ""){
//addslashesはSQLインジェクション防止のため
$username = addslashes(trim($_POST[username]));
$passwd = addslashes(trim($_POST[passwd]));
//$sql = "SELECT * FROM usr_tb WHERE like username='$username' AND like password = '$passwd'";
$sql = "SELECT * FROM usr_tb WHERE username = '{$username}' AND password = '{$passwd}'";
//$sql = "SELECT * FROM usr_tb WHERE username='{$username}' AND passwd = '{$passwd}'";//左記コードのように変数以外に該当するイコールを、==としてみたが、これも駄目。
$data = $conn->getRow($sql,2);//PEAR で接続、使わない場合は mysql_query等ですかね
//$data = mysql_query($sql);
if($data[uid] != ""){
//if($data[username] <> ""){
//データベースにあった場合はセッションに登録
$_SESSION[auth][username] = $data[username];
//ついでに諸々の情報をセッションに登録
$_SESSION[auth][nick] = $data[nick];//例えばニックネーム
echo "$data[nick]";//試にと設置してみたが反映されず。テーブルを参照出来ていないのでしょうか?
}else{
//認証失敗、もう一度フォームを表示
echo "ユーザー名又はパスワードが違います";
authform();
exit;
}
}
// Copyright taketan_mydns_jp
?>

尚、DB名はtestとし、テーブルはテスト的に、taketan_mydns_jp様からアドバイス頂いた物を設置してみました。
taketan_mydns_jp様にとって歯がゆいところかとは思いますが、出来そうで出来ない・・を繰り返してます。引き続きご指導頂けたら幸いです。

投稿日時 - 2006-07-05 23:01:54

お礼

taketan_mydns_jp様

おはよう御座います。
掘り下げてのご説明で、また一段と理解に近づいた気がします。
今、仕事の関係でスクリプトを触る事は出来ませんが、追って改めてご報告も兼ねたお礼をさせて頂きます。有難う御座いました。

追伸:ユーザ名の件やphpMyAdminの件など、一連に関することまでご指導いただき、どんな些細な事でも初心者の私にとって、有難く感謝の気持ちでいっぱいです。

投稿日時 - 2006-07-05 09:11:05

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

下記URLにPEARマニュアルのDB接続例が載っています。

例)

dbconn.inc.php
<?php
require_once 'DB.php';

$dsn = array(
'phptype' => 'mysql,
'username' => 'someuser',
'password' => 'passwd',
'hostspec' => 'localhost',
'database' => 'thedb',
);

$options = array(
'debug' => 2,
'portability' => DB_PORTABILITY_ALL,
);

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

参考URL:http://www.go-pear.org/manual/ja/package.database.db.intro-connect.php

投稿日時 - 2006-07-04 14:03:51

補足

taketan_mydns_jp様

こんばんは。お世話になっております。
補足欄から失礼いたします。

あれから試行錯誤の末、ようやくDBに接続出来るまでなりました。4時間近くも掛かってしまいました(汗)。
今回、下記サイトのサンプルコードを用いて質問させて頂いた訳ですが、そのサイトでは、sesshion_tbと、myuser_tbの2つを用意してありますが、前回taketan_mydns_jp様よりお教えいただいたauth.inc.php内にて接続するテーブルは、どちらにすべきなのでしょうか?2つのテーブルを用意しなくても「その2つを融合したテーブルへ接続」といったケースでも問題はないのでしょうか?
それともIDおよびpass参照用のテーブル(sessionn用?)にテーブルは設定すべきでしょうか?

また、dbconn.inc.phpのコードとして、PEARのマニュアルにあるコードをお教え下さりましたが、何度設定しなおしてもエラーとなり、マニュアルの1番目のコードを使ったら接続する事が出来ました。
マニュアルの1番目のコードと2番目のコードは、記述方が違うだけのものなのでしょうか?それとも意味あってのものなのでしょうか?(こんな質問まで、すみません。ちゃんと理解したいもので・・)

No1のコード
$dsn = 'mysql://root:******@localhost/test';
$options = array(
'debug' => 2,
'portability' => DB_PORTABILITY_ALL,


No2のコード(hostspecのところでエラーとなる)
$dsn = array(
'phptype' => 'mysql,
'username' => 'root',
'password' => '******',
'hostspec' => 'localhost',
'database' => 'test',

また、No1のコードでは、最後に$db->disconnect();があり、No2にはありませんが、この2つの違いは何処から来ているのでしょうか?
何から何まで申し訳ありませんが引き続きご指導いただけたら幸いです。

投稿日時 - 2006-07-05 00:09:03

お礼

taketan_mydns_jp様

こんばんは。お世話になっております。
サンプルコード、参考サイトを有難う御座います。
これを元に色々と試したうえで、改めてご報告させていただきます。
改めてご質問することもあるかと思いますが、まずはお礼を。。有難う御座いました。

投稿日時 - 2006-07-04 21:20:30

かなり苦労されているようですね。
誰でも通る道です。頑張って下さい。
通れなければ、、、PHPマスターは出来ないと思います。
他人のソースの流用まででしょうね。

認証の仕方にはいろいろな方法が考えられますが、私自身は独自の方法でやってます。そこいら中のソースを参考にしてはいますが。
私の場合、認証をスクリプトにまとめて、インクルードしています。例えば下のような感じです。DB接続はPEARライブラリを使っています。

dbconn.inc.php //DB接続、$connで接続IDを返す

auth.inc.php
<?php
require_once("dbconn.inc.php");
session_start();//セッション開く

//セッションに値が無い場合はパスワード認証画面を表示
function authform(){
echo <<<EOC
<form action="" method="post">
ユーザ名 <input type="text" name="username" /><br />
パスワード <input type="password" name="passwd" /><br />
<input type="submit" name="send" value="送る" />
</form>
EOC
exit;//それ以降表示を止める
}

if($_SESSION[auth][username] == ""){
echo "認証が必要です。ユーザー名とパスワードを入力して下さい。";
authform();
}

//ユーザ名とパスワードが送られてきた場合は認証
if($_POST[username] != "" && $_POST[passwd] != ""){
//addslashesはSQLインジェクション防止のため
$username = addslashes(trim($_POST[username]));
$passwd = addslashes(trim($_POST[passwd]));
$sql = "SELECT * FROM usertb WHERE username='{$username}' AND passwd = '{$passwd}'";
$data = $conn->getRow($sql,2);//PEAR で接続、使わない場合は mysql_query等ですかね
if($data[username] != ""){
//データベースにあった場合はセッションに登録
$_SESSION[auth][username] = $data[username];
//ついでに諸々の情報をセッションに登録
$_SESSION[auth][nick] = $data[nick];//例えばニックネーム
$_SESSION[auth][birth] = $data[birth];//誕生日
}else{
//認証失敗、もう一度フォームを表示
echo "ユーザー名又はパスワードが違います";
authform();
exit;
}
}
// Copyright taketan_mydns_jp
?>

アクセス制限をするページにはauth.inc.phpを頭にインクルードすれば、セッション登録が無かった場合はログインフォーム表示、あった場合は無視、という事になります。

a.php
<?php
//認証
require_once("auth.inc.php");

//以下スクリプト
?>

検証してませんが、こんな流れでやってます。
少なくとも、PHPLibよりは簡単で分かりやすいかと思いますが。

投稿日時 - 2006-07-03 10:27:44

補足

taketan_mydns_jp様

こんばんは。補足欄から失礼いたします。
只今、taketan_mydns_jp様よりご指導いただいたコードを基に試行錯誤を繰り返しております。

>dbconn.inc.php //DB接続、$connで接続IDを返す

そこで、おんぶに抱っこのようで恐縮なのですが、接続IDを返すとは、セッションIDのことを仰っているのですか?セッション管理用テーブルを作成し、ログインID、パスワード、セッションIDを登録出来るテーブルを参照・・・。といった考えで宜しいのでしょうか?

セッションに関して、いまいち理解に乏しいところが御座いますが、taketan_mydns_jp様のアドバイスにより、方向性が見えてきたので、今一度、ご指導頂ければ有難いです。お忙しい中恐縮ですが、宜しくお願い致します。

投稿日時 - 2006-07-04 00:01:59

お礼

taketan_mydns_jp様

こんにちは。お世話になっております。
コードまでお教えいただき有難う御座います!

先日、PEARをインストールし、使えるよう設定はしましたが、現在のところ、PEARの手順?が分からず、お教えくださったスクリプトでいうと、「dbconn.inc.php」とは、どういうコードになる?といった状況です。

折角お教えくださったにも、すぐに解決できるほどのスキルを持ち合わせていませんが、ご教授いただいた内容の流れでいこうと思います。

お忙しい中ご指導いただき有難う御座いました。追ってご報告いたしますので、引き続きご指導いただけたら幸いです。有難う御座いました。

投稿日時 - 2006-07-03 17:02:43

こんにちは。またまた。

上記サイトは、セッション関数が導入される前のPHP3の時代(数年前)の話です。
どうしてもDB&PHPlibを使ってセッション管理をする、と言うならば話は別ですが、この情報は無視したほうが良かろうかと。

PHP4以降では、セッション処理関数が導入されています。

a.phpで
session_start();
$_SESSION[sess] = "なんたら";

とすれば、
b.phpで
session_start();
echo $_SESSION[sess] ;
//なんたら と表示

というように、とても簡単になっています。

下記URL参照してください。

参考URL:http://jp.php.net/session

投稿日時 - 2006-06-30 14:32:58

補足

taketan_mydns_jp様

こんばんは。補足欄にて失礼いたします。
>どうしてもDB&PHPlibを使ってセッション管理を
>する、と言うならば話は別ですが、

私が参考にしていたサイトにある内容はPHPlibを用いているのですか?
このPHPlibを用いている事は、正直気付きませんでしたが、以前とあるサイトでユーザ認証の設定にはこのPHPlibが有効といった話を見たことがあります。とは言っても(私の知る限りでは)PHPlibに関する情報が乏しく、どのように設定(および手順)したらいいのかが分からず、そのままになっては居るのですが…。

話が少しそれましたが、私自身、このPHPlibに拘りはありませんが、今回私がやりたい事は、DBに保存したユーザ(IDおよびパスワード)を認証して、ぞくに言う「マイページ」のような、ユーザのみが入室できるサイトを構築出来ることを想定して作成しております。(知識が乏しく、大それた事を!と思われるかもしれませんが…汗)

そこで、taketan_mydns_jp様は、「DBを利用したいというならば…」と言っておられますが、上記のようにDBへ登録のあるユーザのみを認証して、といったサイトを構築させる場合、今回のセッションを用いたユーザ認証において、DBを用いなくても構築は問題ないものなのでしょうか?
正直なところ、PHPのマニュアルを読んでは居るものの、知識が乏しいため具体的な流れが描ききれない状態なのです。

taketan_mydns_jp様のアドバイスにある、a.phpからb.phpへのデータの引継ぎ?見て、「なるほど...」とは思ってはいるものの、今回のユーザ認証において、マニュアルでは範囲が広くて的を得られない状況に居るのが本音です。少し具体的にご教授いただけると有難いのですが…お手数お掛けいたしますが、宜しくお願い致します。

投稿日時 - 2006-07-01 02:02:18

お礼

taketan_mydns_jp様

こんにちは。お世話になっております。
>上記サイトは、セッション関数が導入される前の....

そうだったのですか。お恥ずかしいながらPHPを触り始めて間も無く、こういった事さえも分からずにいる状態です。貴重なご意見に感謝いたします。

お教え頂いたマニュアルですが、今一度熟読し、改めてご報告も兼ねてお返事させて頂きます。・・・分からない点が多そうなので(汗)

お忙しい身とは思いますが、引き続きご指導頂けたら幸いです。
取り急ぎご挨拶までに。。有難う御座いました。

投稿日時 - 2006-06-30 15:06:18