• ベストアンサー

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)」とすると、 正常に動くことは確認できました。 よろしくお願いします。

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

  • ベストアンサー
  • racchoman
  • ベストアンサー率71% (20/28)
回答No.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回目は失敗になります。

-TaKaHiRo-
質問者

お礼

>フォームから、A1=AAA,B1=BBBを与えたとき、 >「成功」が出ると思っていたのですが、「失敗」と出てしまいます。 これは投稿時の記入ミスでした。失礼しました。 >while($line = fgets($fp)){ >→ while($line = rtrim(fgets($fp))){ >に変更すれば、ループの1回目は成功、2回目/3回目は失敗になります。 ズバリ解決しました。 rtrimの存在は初めて知りました。大変いい勉強になりました。 ありがとうございました。

その他の回答 (1)

回答No.1

> list($A2,$B2) = explode("^", $line); ファイルの1行目を読んだとき、explode()によって $A2にも$B2にも"AAA"が入ります。 フォームから$A1に"AAA"を、$B1に"BBB"を与えたのでしたら、 $B1と$B2が等しくないため、「ログイン失敗」と出力することは 正しいのではないでしょうか。 2行目を読んだときは、$A2にも$B2にも"BBB"が入ります。 やはりif文の条件を満たしませんので、「ログイン失敗」と 表示します。3行目も同じです。

-TaKaHiRo-
質問者

お礼

(上の「補足」は間違いです。すみません) すごく、自分で勘違いしていました。 他の方の意見も参考にしつつ、改良してみたいと思います。

-TaKaHiRo-
質問者

補足

すみません。記入に間違いがありました。 data.datの内容は…  AAA^aaa

関連するQ&A