解決済み

PHPのファイル書き込み、呼び出しにおいて

  • すぐに回答を!
  • 質問No.4171250
  • 閲覧数90
  • ありがとう数5
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 80% (4/5)

PHP初心者です。
最初にscore.txtから配列score[]に値を代入し、その後FORMで送られてきた値をPOSTで引き取り、その値をscore[]に代入し、それをscore.txtに書き込む…。 ということをしたいのですが、以下のソースでは、書き込む際にscore.txtの値にすべて0が入ってしまいます。
$score[$k] = $_POST["sel_$k"];
で値が送られているのは確認済みですが、if文でscore配列がすべて0にされてしまうようです。 その理由と対策がわかりません。
わかる方がいらっしゃいましたら是非教えてください。



<?php


$fname = "score.txt";

$file = fopen($fname,"r");

for($l=0; $l<20; $l++){

$sc[$l]= fgets($file);

$score[$l] = $sc[$l];
)

}

fclose($file);
print_r($score);



$pointer=fopen("score.txt", "w");

flock($pointer, LOCK_EX);


for($k=0; $k<20; $k++){

$score[$k] = $_POST["sel_$k"];

if($score[$k] == null){
$score[$k] =0;
}

fputs($pointer, "$score[$k]\n");
}
flock($pointer, LOCK_UN);

fclose($pointer);

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

  • 回答No.5

ベストアンサー率 83% (10/12)

ANo.4で回答した者です。消し忘れた中括弧がありますので、そちらを消してください。そうすればうまくいくと思います。
for($k=0; $k<20; $k++){

/* 更新 */

if(isset($_POST["sel_$k"])){
$score[$k] = $_POST["sel_$k"];
}else{
$score[$k] ='0';
}

/* 更新 */

} ←消し忘れでエラーが発生するので{を消してください。

fputs($pointer, "$score[$k]\n");
}
お礼コメント
hikky22423

お礼率 80% (4/5)

なるほど! と思い試したのですがやはり結果は同じでした。
if分の後の$scoreの表示をしてみた結果はすべて0に…。
テキストにもすべて0が書き込まれました。
投稿日時 - 2008-07-14 09:46:14
感謝経済

その他の回答 (全4件)

  • 回答No.4

ベストアンサー率 83% (10/12)

<?php

$fname = "score.txt";

$file = fopen($fname,"r");

for($l=0; $l<20; $l++){

$sc[$l]= fgets($file);

$score[$l] = $sc[$l];

}

fclose($file);
print_r($score);

$pointer=fopen("score.txt", "w");

flock($pointer, LOCK_EX);


for($k=0; $k<20; $k++){

/* 更新 */

if(isset($_POST["sel_$k"])){
$score[$k] = $_POST["sel_$k"];
}else{
$score[$k] ='0';
}

/* 更新 */

}

fputs($pointer, "$score[$k]\n");
}
flock($pointer, LOCK_UN);

fclose($pointer);

?>
こちらではどうでしょうか?
お礼コメント
hikky22423

お礼率 80% (4/5)

No5へのお礼に書こうと思ったのですが書いてしまったあとなのでこちらに書きます。すいません。 勘違いしてました!!
結果が全部0にはなりません。

ただ、if(isset($_POST["sel_$k"]))をつかうと、$_POSTで送られた値すべてがまとまってtrueとして帰ってくるみたいです。(確認はしてませんが)
すべての配列にnullの値も含めて入ります。

なのでif文の条件を変えたところうまく行きました。
ご迷惑おかけしました。 ありがとうございます。
投稿日時 - 2008-07-14 12:56:05
  • 回答No.3

ベストアンサー率 68% (26/38)

ANo.2です。
>しかしif文を使った直後には$score[$k]の値はすべて0となっています。(これもprint_r[$score[$k]で確認済)

確認していたのですね。ごめんなさい。
  • 回答No.2

ベストアンサー率 68% (26/38)

if文の後に、print_r($score)は試されましたか?
もし書き込まれたscore.txtを読み込んでから確認しているのであれば、書き込みが正常に行われていない可能性もあるのでは?
もし、print_r($score)も試されているのであれば、
$score[$k] == nullではなく、is_null($score[$k])ではどうでしょう。それか、falseとしての評価ではどうですか?
if(!$score[$k])
いずれにしても、==はたまに挙動不審な評価をするので、私はあまり信用していないので、なるべく空文字の評価は上記のやり方か、===で型評価も加えて行ってます。
お礼コメント
hikky22423

お礼率 80% (4/5)

試したのですがやはりだめでした。
書き込み後ですべて0が代入されていました・・・。

やっぱり=って不審な評価をするんですか。
でもissetでもダメってどういうことでしょう・・・。
投稿日時 - 2008-07-14 09:43:58
  • 回答No.1

ベストアンサー率 31% (1576/4988)

> $score[$k] = $_POST["sel_$k"];
> で値が送られているのは確認済みですが、
> if文でscore配列がすべて0にされてしまうようです。

デバッグのとっかかりとして、
当該if文の直前で$score[$k]の値を
printなりechoなりしてみてはいかがでしょうか。
お礼コメント
hikky22423

お礼率 80% (4/5)

回答ありがとうございます。
直前でprint_r($score[$k])をすると、$score[$k]にはPOSTで送られた値が代入されています。
(例えば2番目と20番目に値を入れると Array[0]⇒[1]⇒2[2]⇒… [19]⇒4
という風に実行されます。)

つまりif文を使う前に$score[$k]の配列には数値が入っているという事ですよね?

しかしif文を使った直後には$score[$k]の値はすべて0となっています。(これもprint_r[$score[$k]で確認済)

ということは、$score[$k]には値が入っているのに$score[$k]はnullとみなされるという事になるます。 そんなことあるんでしょうか? 
投稿日時 - 2008-07-12 22:40:52
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


感謝指数によるOK-チップ配布スタート!

ピックアップ

ページ先頭へ