電子書籍の厳選無料作品が豊富!

お世話になっております。
PHP初心者です。
どなたかおわかりの方がいらっしゃいましたら、ご教授お願いいたします。

http://oshiete1.goo.ne.jp/qa5743557.html
を拝見させていただいたのですが、上記のURLの記述にてログインIDによるページを変更するのはどうしたらよろしいのでしょうか?

例↓
NO1 ID:abc PW:1234 name:山田
NO2 ID:def PW:5678 name:佐藤
とDBに登録していたとします。

両方のIDとPWでログインしたときはmember.phpが表示される。
ここでIDによってmember.phpに表示されるリンクがかわる。
NO1でログインした場合member.phpにはcontents.phpあてのリンクが表示されている。
NO2でログインした場合はmemebr.phpにはcontents.phpとcontents2.phpあてのリンクが表示されるようにするにはどうしたらよろしいでしょうか?

上記のURLを参考にしたいので宜しくお願いいたします。

A 回答 (4件)

たとえば、以下のような感じ?



データベース内に以下のようにL1 L2の欄を増やす。

NO1 ID:abc PW:1234 name:山田 L1:TRUE L2:FALSE
NO2 ID:def PW:5678 name:佐藤 L1:TRUE L2:TRUE

ユーザー情報を取得する際に、L1、L2も同時に取得する。

取得した、L1、L2、Trueであればリンクを表示する、Falseであれば何もしない(表示しない)。
if ($row["L1"]){
echo "<a href=\"./contents.php\">contents</a><br />";
}
if ($row["L2"]){
echo "<a href=\"./contents2.php\">contents2</a><br />";
}

-----
実際には、質問に書かれた事を満足させるだけで良いなら、以下のような形でもいいけど。

//contentsへのリンク 1の場合、2の場合両方表示なので、そのまま単純に表示させる。
echo "<a href=\"./contents.php\">contents</a><br />";

//contents2へのリンク 2の場合のみ表示させる。
//IDがdefかどうかで、表示させるかどうか判定する
if ($row["id"]=="def "){
echo "<a href=\"./contents2.php\">contents2</a><br />";
}

この回答への補足

ご教授有難う御座います。

早速試させていただきました。
if ($row["L1"]){
echo "<a href=\"./contents.php\">contents</a><br />";
}
if ($row["L2"]){
echo "<a href=\"./contents2.php\">contents2</a><br />";
}
の記述にてためさせていただいたのですが、できませんでした。

if ($row["id"]=="def"){
echo "<a href=\"./contents2.php\">contents2</a><br />";
}

もできませんでした。

補足日時:2010/03/17 00:35
    • good
    • 0

データベースエラー...


に関しては基本的に表示されることはありません。
サーバートラブルが発生した場合には、発生する可能性がありますが。
どちらかと言えば、開発時にバグを埋め込んでしまった場合、SQLが間違っていたなどの場合に、どこが間違っていたかを調査するための情報とも考えてもいいぐらいです。

ID、パスワードが間違っていた場合のメッセージですが、可能性として二つ。

ID、パスワードが共に空白の場合は、チェックをそもそも通さずにフォームを表示しているため、メッセージは表示されません。

もう一点は、メッセージの表示部分を改変していないかということです。
メッセージ表示部分は、元の質問者様の記述をそのまま使用しています。

以下の内容で、$msg部分です。
------
echo <<< EOL
$msg
<form method="post" action="login.php">
ユーザーID: <input name="id" type="text" />
パスワード: <input name="password" type="password" />
<input type="submit" value="ログイン" />
</form>
EOL;
-------
質問に載っていたコードは<html>~<body>~</body></html>等はなかったため、それらはご自身で追加されたと思います。
<form>等の部分も、改変されてはいないでしょうか?
もし、$msg部分を削除されていれば当然出力されません。
HTML内にPHPの変数情報等を出力するには、
<?PHP echo $msg;?>と記述するか、元質問者様のようにecho <<< EOL~EOL;などとします(EOLの部分は前後が一致するならなんでも良い)。



本当に追記する前は表示されていて、追記したら表示されなくなったということでしたら、ちょっと謎です。
$_SESSION['uid'] = $_POST['id'];※1
の『※1』部分は削除されてますよね?

以下のように//を先頭につけた場合にエラーが表示され、//を消したらエラーが表示されなくなったら、たしかにその行に問題があるのは間違いないのですが。
//$_SESSION['uid'] = $_POST['id'];

//をつける事を、コメントアウトと呼びます。
//を書いたそれ以降の文字は、プログラムとは関係のないただの注釈(コメント)として扱われるため、プログラムの動作確認などで一時的にその部分の機能を殺したい際に、//を付けて、確認を終えた後で簡単に戻す(//を削除する)などのデバッグ方法です。
    • good
    • 0
この回答へのお礼

ご返事有り難うございます。

確認したところ<?php print $msg;?>が抜けておりました。

お手数をおかけして申し訳ありませんでした。

また色々と有り難うございました。

お礼日時:2010/03/18 19:53

以下の判定が誤判定されてるって事ですね。


if ($row["L2"]){

L1、L2はBOOL型にしてますよね?
MySQLAdminだと、『種別』って名前の欄です。

文字列型でも、おそらく誤判定にならないと思いますが、BOOL型の方が絶対確実なので。
『FALSE』など、全角だとTrueと判定されてしまいますし。
※大文字小文字なども関係があるかも知れないが、通常やらない方法なのでその当たりは不明。

この回答への補足

ご返信有難う御座います。

BOOL型を使用したことがなかったものですから、調べたらできるようになりました。
有難う御座います。

もうひとつご質問なのですが、http://oshiete1.goo.ne.jp/qa5743557.html​の最後のご回答にある$_SESSION['uid'] = $_POST['id'];※1
を追記すると
} else {
$msg = '<span style="color:#ff0000;">ユーザーIDまたはパスワードが違います。</span>';
}
} else {
$msg = '<span style="color:#ff0000;">データベースエラー、行が取得できません。</span>';
}

} else {
$msg = '<span style="color:#ff0000;">データベースエラー、SQLが失敗しました。</span>';
}
がID&PWが違うのに表示されません。
普段は表示されないから大丈夫なのですが、ID&PWを間違えるとフォームページが再度表示されるだけになってしまいます。

なぜなのかお分かりでしょうか?

補足日時:2010/03/17 23:29
    • good
    • 0

>できませんでした。


ちゃんとクエリーも書き換えました?
↓のように取得するデータを追加しないと取得できませんよ
$query = sprintf("SELECT user_name,L1,L2 FROM member WHERE id='%s' ",$uid);

もしくはこっち
$query = sprintf("SELECT user_name,id FROM member WHERE id='%s' ",$uid);

上の方の例で言えば、
SELECT : データベースから取得せよ
user_name,L1,L2 : user_name,L1,L2の欄を
FROM member : member というテーブルから
WHERE : 以下の条件によって絞り込め
id='%s' : id欄が '%s'のものを(※PHPのsprintf命令によって、'%s'はその時のログインユーザーのIDに置き換えられる。

この回答への補足

ご教授有難うございます。

環境は下記のように設定しています。

$query = sprintf("SELECT * member WHERE id='%s' ",$uid);

ですが、NO1の方でも表示がされてしまいます。

また、$query = sprintf("SELECT user_name,L1,L2 FROM member WHERE id='%s' ",$uid);でも試させていただきました。

データベースも下記のようにちゃんと登録しています。
L1:TRUE L2:FALSE
L1:TRUE L2:TRUE

補足日時:2010/03/17 18:05
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!