質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

2890閲覧

再 条件ごとにリダイレクトをしたい

fgfnabwym

総合スコア78

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2015/09/02 14:07

編集2015/09/02 14:33

ユーザーのユーザー名とパスワードが合っていた時、$fstatusの値がusrのユーザーは利用者ページに。$fstatusの値がusrのユーザーは管理者ページに送りたいです。

ですが、$fstatusの中身が認識されません。$_SESSION['fstatus'] をif文に使った時もです。
echoで変数の中身を出力すると、どちらとも、usrまたはadmのどちらかの値が入っています。値が入っているのにif文で認識してもらえないのはどうしてでしょうか。

下の書き方だと、条件を判断せず、正しいユーザー名とパスワードを入力してもエラーとなってしまいます。

どうすれば$fstatusの値を認識し、if文を使えるようになるでしょうか。

php

1<?php 2session_start(); 3$id = @$_POST['ID']; // ユーザーID 4$pwd = @$_POST['PWD']; //パスワード 5 6// ログインボタンが押された場合 7if (isset($_POST["login"])) { 8 9 // IDとパスワードを結合する 10 $namedata = $id."%".$pwd; 11 12 // ファイルを開く 13 $fp = fopen("usrlist.txt", "r"); 14 while(!feof($fp)) { 15 $buffer = fgets($fp); // 1行ずつ読み込み 16 if (strstr($buffer, $namedata)) { // 結合した文字列があった時 17 $line=$buffer; 18 $word = explode("%",$line); 19 $fid = $word[0]; // ID 20 $fpwd = $word[1]; // PWD 21 $fname = $word[2]; // 名前 22 $fstatus = $word[3]; // 状態 値が admは管理者ページ。usrは利用者ページへ 23 24 $_SESSION['fname'] = $fname; 25 $_SESSION['fstatus'] = $fstatus; 26 27 28 // 認証成功 29 // ユーザー名、パスワードが合っていた 30 if ($_POST['ID'] == $fid && $_POST['PWD'] == $fpwd) { 31 // セッションIDを新規に発行する 32 session_regenerate_id(TRUE); 33 $_SESSION["USERID"] = $_POST['ID']; 34 if ($fstatus == 'adm'){ 35 header("Location: admtop.php"); // 管理者トップ画面へ移動する 36 exit; 37 } else { 38 header("Location:usrtop.php"); // 利用者トップ画面へ移動する 39 exit; 40 } 41 } 42 } 43 } 44 45?>

エラーが出るというのは自分が書いたechoの「ログインできませんでした。」という文字です。勘違いをさせてしまいすみません。

ユーザー名、パスワードがあっていて、ログインするときに、$fstatusがadmでもすべてfalseになり、usrtop.phpにとばされます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuba

2015/09/02 14:21

「エラー」とは一体どんなエラーメッセージが吐き出される状態でしょう?
yuba

2015/09/02 14:38

「ログインできませんでした。」とはどこにも書いていませんが、なぜ出てくるのでしょう? また、「ログインできませんでした。」と表示されるのですか、それともusrtop.phpに飛ばされるのですか、それともusrtop.phpに飛ばされた結果として「ログインできませんでした。」と表示されるのですか?
fgfnabwym

2015/10/20 15:41

yubaさん、情報の追加・修正を依頼していただいたのに、返事をせずに、すみませんでした。 解決することが出来ました。ありがとうございました。
guest

回答3

0

ベストアンサー

notableさんの指摘の通りですが、改行を削除していないので、$fstatus は、"adm\n" または "usr\n" になっているはずです。改行を削除するか、"adm\n"と比べるか。

あと、回答ではないですが、プログラムの悪い点の指摘。
・あなた一人しか使わないシステムなら良いですが、他人も使うシステムの場合、パスワードを平文で保存してはいけません。これは絶対。
・簡単に回避できるエラーや警告の抑止のために@を使ってはいけません。
・fopen後に$fpの値のチェックが必要。fopenに失敗するとfeof($fp)が常にFALSEとなりwhileが無限ループになります。
・while条件は、while(($buffer=fgets($fp))!==FALSE) がいい。feofで調べると最終行を読んでからもう一回ループが回りfgetsしてしまう。

悪い点ではないが、改善した方が良い点。
・後半で、IDとパスワードをチェックしているのと、最初にstrstrでIDとパスワードを結合した文字列が含まれているのかのチェックに重複感あり。最初のstrstrのくだりは不要のはず。ただここで、while条件がfeofのままだと、上記のwhileが余計にもう一回回ってしまう問題で、最後に$bufferにFALSEが入り、それへの考慮が必要。やはりwhile条件ではfeofを使うべきでない。

投稿2015/09/02 15:25

otn

総合スコア84538

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fgfnabwym

2015/10/20 15:44

otnさん、回答ありがとうございました。 プログラムの悪い点、改善した方が良い点も教えていただいたので、ベストアンサーにしました。 一人では何も気が付かないので、助かりましたし、勉強になしました。
guest

0

おそらく usrlist.txt は次のように書かれているのではないでしょうか?

id1%password1%user1%adm id2%password2%user2%usr

この場合fgetsで読み込むと、改行コードも含んでしまうため $line には「id1%password1%user1%adm\n」が代入され、$fstatusには「adm\n」が代入されることになります。

"adm" == "adm\n"

は成立しないのでログイン処理ができないのだと思われます。
notable さんが紹介している「trim関数」では改行コードは除去できないので「rtrim関数」を使ってみてください。

また、本質問と直接的には関係ないのですが

// 認証成功 // ユーザー名、パスワードが合っていた if ($_POST['ID'] == $fid && $_POST['PWD'] == $fpwd) {

ここの if は必要なのでしょうか?

if (strstr($buffer, $namedata)) { // 結合した文字列があった時

ここの if と被っているように思われます。

投稿2015/09/02 15:17

編集2015/09/02 15:22
jimyo

総合スコア243

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2015/09/02 15:28

strstrだけだと、例えばパスワードがabcのときaだけ入れれば、条件が真になりますので、後半のチェックは必要。strstrの方が不要です。
jimyo

2015/09/02 15:31

なるほど。 ご指摘ありがとうございました。
notable

2015/09/03 00:08

念のためコメントするのですが、 trim関数は第2引数を指定しなければ先頭や末尾の改行(\nや\n)も含めて削除します。 マニュアルに記載されていますし、実動作もそうです。
guest

0

if ($fstatus == 'adm'){
の直前で

echo $fstatus; exit; if ($fstatus == 'adm'){

のようにすると adm や usr が表示されるということですよね?
それでもheader("Location: admtop.php");に行かないということであれば
$fstatusの中にいらない空白などが入っていないか確認したほうが良いかもしれません。

echo '|'. $fstatus. '|'; exit; if ($fstatus == 'adm'){

のような感じで出力してみたらわかると思います。
もし空白が入っていればtrim関数などで除去すると良いと思います。

投稿2015/09/02 14:43

notable

総合スコア415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問