- ベストアンサー
explodeと条件分岐
次のようなプログラムを描きました。 /////////////////////////////////////////////////////////////// $A1 = $_POST['A1']; $B1 = $_POST['B1']; $fp = fopen("data.dat", "a+"); flock($fp, LOCK_EX); while($line = fgets($fp)){ list($A2,$B2) = explode("^", $line); if($A1 == $A2 && $B1 == $B2) echo "成功"; else echo "ログイン失敗"; } //////////////////////////////////////////////////////////////// ここでdata.datの内容は… AAA^AAA BBB^BBB CCC^CCC とします。 フォームから、A1=AAA,B1=BBBを与えたとき、 「成功」が出ると思っていたのですが、「失敗」と出てしまいます。 いろいろ考えてみたのですが、解決に至らず質問することにしました。 ご指摘、お願いします。 尚、フォームから正確に入力されていることと、 分岐のところを「if($A1 == $A2)」とすると、 正常に動くことは確認できました。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ループ1回目 A2=AAA B2=AAA\n ループ2回目 A2=BBB B2=BBB\n ループ3回目 A2=CCC B2=CCC\n となります。 >フォームから、A1=AAA,B1=BBBを与えたとき、 >「成功」が出ると思っていたのですが、「失敗」と出てしまいます。 これでは、ループのいずれの回でも「成功」になるはずがありません。 フォームから、A1=AAA, B1=AAAを与えて、プログラムを while($line = fgets($fp)){ → while($line = rtrim(fgets($fp))){ に変更すれば、ループの1回目は成功、2回目/3回目は失敗になります。
その他の回答 (1)
- totsugiino
- ベストアンサー率37% (6/16)
> list($A2,$B2) = explode("^", $line); ファイルの1行目を読んだとき、explode()によって $A2にも$B2にも"AAA"が入ります。 フォームから$A1に"AAA"を、$B1に"BBB"を与えたのでしたら、 $B1と$B2が等しくないため、「ログイン失敗」と出力することは 正しいのではないでしょうか。 2行目を読んだときは、$A2にも$B2にも"BBB"が入ります。 やはりif文の条件を満たしませんので、「ログイン失敗」と 表示します。3行目も同じです。
お礼
(上の「補足」は間違いです。すみません) すごく、自分で勘違いしていました。 他の方の意見も参考にしつつ、改良してみたいと思います。
補足
すみません。記入に間違いがありました。 data.datの内容は… AAA^aaa
お礼
>フォームから、A1=AAA,B1=BBBを与えたとき、 >「成功」が出ると思っていたのですが、「失敗」と出てしまいます。 これは投稿時の記入ミスでした。失礼しました。 >while($line = fgets($fp)){ >→ while($line = rtrim(fgets($fp))){ >に変更すれば、ループの1回目は成功、2回目/3回目は失敗になります。 ズバリ解決しました。 rtrimの存在は初めて知りました。大変いい勉強になりました。 ありがとうございました。