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

次のようなプログラムを描きました。
///////////////////////////////////////////////////////////////
$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)」とすると、
正常に動くことは確認できました。
よろしくお願いします。

A 回答 (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回目は失敗になります。
    • good
    • 0
この回答へのお礼

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

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

お礼日時:2007/04/05 22:05

> 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

補足日時:2007/04/05 21:54
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/04/05 22:00

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