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

解決済みの質問

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

投稿日時 - 2007-04-05 20:56:53

QNo.2897165

困ってます

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

ループ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回目は失敗になります。

投稿日時 - 2007-04-05 21:53:22

お礼

>フォームから、A1=AAA,B1=BBBを与えたとき、
>「成功」が出ると思っていたのですが、「失敗」と出てしまいます。
これは投稿時の記入ミスでした。失礼しました。

>while($line = fgets($fp)){
>→ while($line = rtrim(fgets($fp))){
>に変更すれば、ループの1回目は成功、2回目/3回目は失敗になります。
ズバリ解決しました。
rtrimの存在は初めて知りました。大変いい勉強になりました。
ありがとうございました。

投稿日時 - 2007-04-05 22:05:08

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

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

回答(2)

ANo.1

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

2行目を読んだときは、$A2にも$B2にも"BBB"が入ります。
やはりif文の条件を満たしませんので、「ログイン失敗」と
表示します。3行目も同じです。

投稿日時 - 2007-04-05 21:42:09

補足

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

投稿日時 - 2007-04-05 21:54:05

お礼

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

投稿日時 - 2007-04-05 22:00:30

あなたにオススメの質問