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

このQ&Aのポイント
  • PHP初心者です。score.txtから値を代入し、送られてきた値を書き込みたい
  • 送られてきた値をscore配列に代入したいが、すべて0になってしまう
  • score.txtの値に0が入る原因と対策がわからない
回答を見る
  • ベストアンサー

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

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);

  • PHP
  • 回答数5
  • ありがとう数5

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

  • ベストアンサー
  • 11spec0
  • ベストアンサー率83% (10/12)
回答No.5

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
質問者

お礼

なるほど! と思い試したのですがやはり結果は同じでした。 if分の後の$scoreの表示をしてみた結果はすべて0に…。 テキストにもすべて0が書き込まれました。

その他の回答 (4)

  • 11spec0
  • ベストアンサー率83% (10/12)
回答No.4

<?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
質問者

お礼

No5へのお礼に書こうと思ったのですが書いてしまったあとなのでこちらに書きます。すいません。 勘違いしてました!! 結果が全部0にはなりません。 ただ、if(isset($_POST["sel_$k"]))をつかうと、$_POSTで送られた値すべてがまとまってtrueとして帰ってくるみたいです。(確認はしてませんが) すべての配列にnullの値も含めて入ります。 なのでif文の条件を変えたところうまく行きました。 ご迷惑おかけしました。 ありがとうございます。

回答No.3

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

回答No.2

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

hikky22423
質問者

お礼

試したのですがやはりだめでした。 書き込み後ですべて0が代入されていました・・・。 やっぱり=って不審な評価をするんですか。 でもissetでもダメってどういうことでしょう・・・。

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.1

> $score[$k] = $_POST["sel_$k"]; > で値が送られているのは確認済みですが、 > if文でscore配列がすべて0にされてしまうようです。 デバッグのとっかかりとして、 当該if文の直前で$score[$k]の値を printなりechoなりしてみてはいかがでしょうか。

hikky22423
質問者

お礼

回答ありがとうございます。 直前で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とみなされるという事になるます。 そんなことあるんでしょうか? 

関連するQ&A

  • ファイルの読み書きについて教えてください。

    フォームから投稿されてきた内容を、テキストファイルに書き込むphpを作っているのですが、 flock関数で、誰かが書き込んでいるときに他の人が書き込めないようにファイルをロックしたいと思っています。 以下のソースでLOCK_EXとLOCK_UNは正しく動作するでしょうか。 いまいち不安で困っています。 //ポストされてきた内容が$nameに入ります $name = $_POST['name']; $fh=fopen("test.txt","a+"); flock($fh, LOCK_EX); fwrite($fh,"$name \n"); flock($fh, LOCK_UN); fclose($fh); どなたか詳しい方教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • phpのlock処理について

    phpのlock処理について 頻繁に書き込みされるファイルが飛ばないようにロックをしているのですが、 (アクセスログを保存) phpのロック処理を調べていると 一方ではこれでよい、もう一方ではこれでは意味がないなど 色々な事が書かれており、いまいち理解できません。 wモードで開くと強固なロックは不可能なのでしょうか。 以下のようにしているのですが ロックの意味はないでしょうか。 //ロック専用ファイルを開く $flock=fopen("lock.txt","w"); //ロック専用ファイルをロック flock($flock,LOCK_EX); //書き込むファイルを連結して代入 $lineall = implode('', $lines); //書き込み用のファイルを開く $fp=fopen($log_file,"w"); fwrite($fp, $lineall); fclose($fp); //ロック用ファイルのロック解除 flock($flock, LOCK_UN); fclose($flock); プログラムが1から私が作成したものではなく、 ちょくちょく消えてしまうことからロック処理をしたいのと 処理の問題でwモードでの書き込みでないとどうもゴミが入ってしまうようですので (r+でやってみましたが空行などのゴミが沢山入ってしまいました) wモードでの強固なロック方法があればと思うのですが・・・。 お手数をおかけしますがご教授いただけますと幸いです。

    • ベストアンサー
    • PHP
  • ファイルの書き込みについて

    ファイルの書き込みに関する質問です。 下のコードでは、 3行目「$ptr=fopen("kekka.txt", "w"); //ファイルを開く」 に問題があるというエラーが出ます。 しかし、文法的には問題はないと思うのですが・・・。 サーバーには、"kekka.txt"というファイルが置いてあります。 何かアドバイスがありましたら、よろしくお願いいたします。 <?php $x = "こんにちは";  $ptr=fopen("kekka.txt", "w");   //ファイルを開く    flock($ptr, LOCK_EX);      //ファイルをロックする      fputs($ptr, $x);      //書込む    flock($ptr, LOCK_UN);       //ロックを解除する  fclose($ptr);            //ファイルを閉じる ?>

    • ベストアンサー
    • PHP
  • phpで作成したファイルをシェルで読み込むと最後の行を読み込めない

    phpでリストを取得し、ファイルに書き込んでいます。 リストはスペース区切りで帰ってくるので、改行コードに変換しています。 $str = "a b c"; $str =str_replace(" ","\n",$str); //リストファイルへ書き込み $pointer=fopen("aaa.txt","w"); flock($pointer, LOCK_EX); fputs($pointer, $str); flock($pointer, LOCK_UN); fclose($pointer); これをviで開いてみると a b c と予定通り書き込まれています。 このリストをシェルスクリプトでループして読み込んでいるのですが 最後の行を読み込んでくれません。 while read line do echo "$line" done < aaa.txt とやると 最後の行が読み込まれないんです!(aとbしか表示されない) ちなみに、aaa.txtをviで開いて何もせずに保存終了すると 正常に最後の行が表示されることから、aaa.txtの終了コードがうまく 書き込まれていないのでは?と予想していますが、よくわかっていません。 どうしたら最後の行を読んでくれるのでしょうか。 ※最後の行に改行コードをつけると次の空白行を読みにいってエラーになるのでそれ以外でお願いします。

    • 締切済み
    • PHP
  • PHPのファイルロックについて

    関数flock();について調べてたのですが、 結局、イマイチ使い所がわかりませんでした。 とりあえずCGIを手本として以下のロックを作ってみたのですが、 もし、flockを使うとしたらどのように使うのかアドバイスして欲しいと思っています。 ↓参考プログラム(echo部は進行を表示するためのもの) <?php define ("LOCK_FILE","./lock/lock.txt"); Lock(); Unlock(); //ロック function Lock(){ if(file_exists(LOCK_FILE)){ if(date(U) - filemtime(LOCK_FILE) > 30){ unlink(LOCK_FILE); echo("古いロック削除<br>"); } } $retry = 5; while(file_exists(LOCK_FILE)){ if($retry <= 0){ echo ("error<br>"); exit; } $retry--; sleep(1); } $lockfile = fopen(LOCK_FILE,"w"); fclose($lockfile); echo("ロック完了<br>"); } //アンロック function UnLock(){ unlink(LOCK_FILE); echo("ロック解除<br>"); } ?>

    • 締切済み
    • PHP
  • file関数とファイルポインタ

    ファイルの内容を(書き換えるために一旦)読み込む時に、 fgets関数と違ってfile関数は fopen関数を使わなくても済む、ということで 便利なので使ってみようと思っているのですが、 ちょっと躓いています。 set_file_bufferやflock、rewindが必要なのですが、 これらはどれも引数にファイルポインタを使います。 fopen関数を使っていないのでコレがないのですが、 どうすればいいのでしょうか? fopenのあとにfileを使う? fopenを使わなくても閉じる時にはfcloseが必要? でもfcloseもファイルポインタを使うし… よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHP4.1でファイル読み込みできない

    次のような方法でファイルの読み込みをしていますが、4.1の環境だと右上の地球アイコンが回りっぱなしでページが表示されなくなります。 $fo=@fopen($data_file,"r") or err("データファイルを読み込めません"); flock($fo, LOCK_EX); $i=0; while(!feof($fo)){ $text_buff=fgets($fo); if(trim($text_buff)){ $buff[$i]=$text_buff; } $i++; } flock($fo, LOCK_UN); fclose($fo); file関数で読み込んだら問題なかったので、現在はfile関数を使っていますが、どのコマンドが問題なのかわかりません。 file関数だとfilelockされないので、同時アクセスされた場合データの破壊があると聞いておりますのでできればfopenで処理したいと考えています。 php.iniなどで回避可能なのでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • ファイル作成

    $fp = fopen($filename1,"a+"); flock($fp,LOCK_EX); fputs($fp,$kisai); flock($fp,LOCK_UN); fclose($fp); としてファイルがなかったら作成するようにして$kisaiの内容を保存するようにしました。 それで問題なく実行できます。 しかし文字コードがANSIで保存されてしまいます。 UTF-8で保存させるようにするにはどうしたらよいでしょうか

    • ベストアンサー
    • PHP
  • さくらサーバーのcronでphpを動かしてファイルを作りたい。

    さくらサーバーのcronでphpを動かしてファイルを作りたい。 cron.php <?php $date = date("Y/m/d H:i:s"); $fp = fopen("./cron.txt", "w"); flock($fp, LOCK_EX); fputs($fp,$date); fclose($fp); print "cron成功"; ?> cron報告レポートには[cron成功]の文字が出ているので、cronコマンドは間違っていないのですが、cron.txtが作れていません。 直接、cron.phpにアクセスすると、[cron成功]と文字が出てcron.txtも作れています。 どうすればcron.txtが作れるのでしょうか。 よろしくお願いします。

  • php+mysql

    書き込み内容保存押した後に空のファイルに保存(作成済み)空ファイル タイトル 本文 書き込み日次 タイトル 本文 書き込み日次こんな形で保存です これをDBに保存したいのですが以下だと↓ファイル保存形式なってしまってます どう変えればいいでしょうか?よろしければ書き込んでいただけると幸いです $fp = fopen('data.txt', 'a'); flock($fp, LOCK_EX); fwrite($fp, implode('<>', array($subject, $text, date('Y-m-d h:i:s'))) . PHP_EOL); flock($fp, LOCK_UN); fclose($fp);

    • ベストアンサー
    • MySQL

専門家に質問してみよう