• 締切済み

テキストファイルの数値を加算

PHP初心者です。 検索しましたが思ったものが見つからないので教えてください。 テキストファイルの数値をPHPページの「+1」 「+5」 「+10」のボタンを押すと加算して保存するにはどうしたらいいでしょうか? ご教示よろしくお願い致します。

みんなの回答

noname#244856
noname#244856
回答No.7

では「編集」ではなく「新規作成」してコピペしてください。多分これならいけます。

y-mine
質問者

補足

長らくお付き合いいただきありがとうございました。 うまくいってうれしいです。 最後の質問です。 新規に保存もダメで、下記を消したらうまくいきました。 PHPには下記はダメなのでしょうか。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>無題ドキュメント</title> </head> <body>

noname#244856
noname#244856
回答No.6

文字コードは「UTF-8」を選択されていますよね?UTF-8には実は ・UTF-8(BOM無し) ・UTF-8(BOM有り) の2種類がありますが、PHPはBOM無しを想定して作られています。一方Windowsのメモ帳はBOM有りしか選択できません。よって、「Notepad++」「Sublime Text 3」といったエディタで編集を行う必要があります。 header関数は「また1バイトも出力していない状態」でしか使用出来ないのですが、先頭にBOMが入り込んでいるとそこで出力が始まってしまうのです。 https://www.google.co.jp/search?q=php%20header%20bom

y-mine
質問者

補足

秀丸でもDreamweaverでもやってみました。 同じエラーが出てしまいます。

noname#244856
noname#244856
回答No.5

POSTだったら1回headerでリフレッシュすればいいと思います <?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { $fp = fopen('../0001.txt', 'a+b'); flock($fp, LOCK_EX); $val = stream_get_contents($fp); ftruncate($fp, 0); $val += filter_input(INPUT_POST, 'op'); fwrite($fp, $val); flock($fp, LOCK_UN); fclose($fp); header('Location: HTTPから始まる自ファイルのURL'); exit; } $fp = fopen('../0001.txt', 'a+b'); flock($fp, LOCK_SH); $val = stream_get_contents($fp); flock($fp, LOCK_UN); fclose($fp); ?> Counter: <?php echo $val ?><br /> <form method="post" action=""> <input type="submit" name="op" value="+1" /> <input type="submit" name="op" value="+5" /> <input type="submit" name="op" value="+10" /> </form>

y-mine
質問者

補足

ありがとうございます。 エラーが出ました。 Warning: Cannot modify header information - headers already sent by で場所が <?php と header('Location: HTTPから始まる自ファイルのURL'); の部分のようです。 アドレスは入れました。

noname#244856
noname#244856
回答No.4

>> ...の方はエラーがいくつか出ました。私の知識ではよくわかりません。 おそらくPHPのバージョンが5.2.5以前の非常に古いものを使っていますね。このバージョンではファイルオープンモードの「c」はサポートされていないためエラーが起こります。 PHP5.2系は機能が最新のものに比べて貧弱なだけでなく、セキュリティに問題があったときもパッチがリリースされない問題もあります。サポートが4年前に終了しているからです。もしPHPのバージョンをアップデートしない場合は、未だに Windows XP を使っているようなものだと思ってください。(アップデートを強く推奨します) ちなみに最新バージョンは5.6系です。 >> 度々すいませんが一つ気になるのが、更新ボタンを押すと >> 最後の仕事をやってしまいます。 >> いろいろ試したところ、0001.phpだとすると >> 0001.phpのリンクを作ってクリックしてみると更新ボタンを押しても >> 何も起こりません。 >> 仕事の最後に0001.phpに飛ぶって可能でしょうか? …??? 失礼ですが、本気で日本語が理解できないです…

y-mine
質問者

補足

>> 度々すいませんが一つ気になるのが、更新ボタンを押すと >> 最後の仕事をやってしまいます。 >> いろいろ試したところ、0001.phpだとすると >> 0001.phpのリンクを作ってクリックしてみると更新ボタンを押しても >> 何も起こりません。 >> 仕事の最後に0001.phpに飛ぶって可能でしょうか? すいません。かなり説明を省略しすぎました。 たとえば +5 をクリックした後、更新ボタンを押すとまた+5されます。 他のボタンももちろん同様です。 そこでカウントの下に自ファイルへのリンクを作っておいて +5などをクリックした後、 リンクをクリックしたら更新ボタンを押しても何も起こりません。 なので+5などをクリックしたら自ファイルへ飛ばせることは可能でしょうか?

noname#244856
noname#244856
回答No.3

提示されたコードだと「読む→加算した値を書く」という処理になっています。読んできて出力したデータは+1される "前" のものなので、この結果が得られるのは当然です。 そこで、以下のどちらかに従う実装にすれば期待した動作になるでしょう。 1.「読む→加算した値を書く→読む」 2.「読む→加算した値を書く(読んできたデータを格納した変数にも加算する)」 …そもそも、最初に提示したコードは「a+」で開いているので読み書き両方出来ますし、stream_get_contentsのタイミングで読み出して加算したあと書き込む際に $val に格納してます。だったら、この $val の値を表示に使えばいいだけの話です。つまり「2.」を選択するということです。 あとついでに、破壊的な(書き込みという動作が発生する)アクションに関しては、使用するメソッドはGETよりもPOSTの方が適切なので、その点も修正しておきます。 「a+b」「stream_get_contents」「ftruncate」「flock」に関して↓ http://qiita.com/mpyw/items/3adcec3c66e515895b08 「filter_input」に関して↓ http://qiita.com/mpyw/items/2f9955db1c02eeef43ea ---------------------------------- <?php // ファイルを読み書き(追記)モードでオープン。 // 存在しなければ新規作成。 $fp = fopen('../0001.txt', 'a+b'); // 排他的ロックをかける。 // これが無いと同時アクセスでファイルが破壊される。 flock($fp, LOCK_EX); // ファイルからデータを読み出して$valに格納。 // ・新規作成時は空文字列 "" // ・2回目以降は数値形式の文字列 "1" $val = stream_get_contents($fp); // ファイルを空にする。 // 「a」ではなく「c」で開いている場合にはこの直後に // rewind関数の実行も必要だが、「a」なので省略可能。 ftruncate($fp, 0); // $_POST['op'] を受け取って、$valに加算代入する。 // $val も $_POST['op'] も文字列だが、「+」演算は // 両辺を整数型に自動変換して計算する。 // "" や NULL は 0 として扱われる。 // このタイミングで $val は文字列型から数値型に変化する。 $val += filter_input(INPUT_POST, 'op'); // $val を文字列として書き込む。 fwrite($fp, $val); // ロックを解除する。 flock($fp, LOCK_UN); // ファイルを閉じる。 fclose($fp); ?> Counter: <?php echo $val ?><br /> <form method="post" action=""> <input type="submit" name="op" value="+1" /> <input type="submit" name="op" value="+5" /> <input type="submit" name="op" value="+10" /> </form> ---------------------------------- もし「a+」モードの挙動や型の自動変換が気持ち悪くて理解しにくい場合はこう書くといいかもしれません。 <?php // ファイルを読み書きモードでオープン。 // 存在しなければ新規作成。 $fp = fopen('../0001.txt', 'c+b'); // 排他的ロックをかける。 // これが無いと同時アクセスでファイルが破壊される。 flock($fp, LOCK_EX); // ファイルからデータを読み出し、整数に変換して$valに格納。 // ・新規作成時は空文字列 "" → 0 // ・2回目以降は数値形式の文字列 "1" → 1 $val = (int)stream_get_contents($fp); // ファイルを空にする。 ftruncate($fp, 0); // ファイルポインタは末尾にあるので、 // 先頭に戻して正しい位置に書き込めるようにする。 rewind($fp); // $_POST['op'] を受け取って、整数に変換して$valに加算代入する。 // "" や NULL は 0 として扱われる。 $val += (int)filter_input(INPUT_POST, 'op'); // $val を文字列として書き込む。 fwrite($fp, (string)$val); // ロックを解除する。 flock($fp, LOCK_UN); // ファイルを閉じる。 fclose($fp); ?> Counter: <?php echo $val ?><br /> <form method="post" action=""> <input type="submit" name="op" value="+1" /> <input type="submit" name="op" value="+5" /> <input type="submit" name="op" value="+10" /> </form>

y-mine
質問者

補足

ありがとうございます。 上部のプログラムばっちりです。 始めたばかりなので難しいです。 度々すいませんが一つ気になるのが、更新ボタンを押すと 最後の仕事をやってしまいます。 いろいろ試したところ、0001.phpだとすると 0001.phpのリンクを作ってクリックしてみると更新ボタンを押しても 何も起こりません。 仕事の最後に0001.phpに飛ぶって可能でしょうか? > もし「a+」モードの挙動や型の自動変換が気持ち悪くて理解しにくい場合はこう書くといいかもしれません。 の方はエラーがいくつか出ました。私の知識ではよくわかりません。

noname#244856
noname#244856
回答No.2

これの発展課題かな…( http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11138129821 $_POST['val'] の代わりにテキストファイルから参照ってことでいいですか? <?php $fp = fopen('count.dat', 'a+b'); flock($fp, LOCK_EX); $val = stream_get_contents($fp); ftruncate($fp, 0); $val += filter_input(INPUT_GET, 'op'); fwrite($fp, $val); flock($fp, LOCK_UN); fclose($fp); ?> <form> <input type="submit" name="op" value="+1" /> <input type="submit" name="op" value="+5" /> <input type="submit" name="op" value="+10" /> </form>

y-mine
質問者

補足

下記のプログラムですが動くようになったのですが、 二度押せば正常に動く状態になりました。 +1を一回押して無反応(アドレスは?op=%2B1) 二回目を押すと+1されました。 続いて+5を押すと+1されました。(アドレスは?op=%2B5) 二回目を押すと+5されました。 いろいろ試しましたがなぜか直前の計算を引きずってしまいます。 どこを修正すればいいのでしょうか? <?php $fp = fopen("../0001.txt", "r"); while ($line = fgets($fp)) { echo "$line<br />"; } fclose($fp); ?> <?php $fp = fopen('../0001.txt', 'a+b'); flock($fp, LOCK_EX); $val = stream_get_contents($fp); ftruncate($fp, 0); $val += filter_input(INPUT_GET, 'op'); fwrite($fp, $val); flock($fp, LOCK_UN); fclose($fp); ?> <form> <input type="submit" name="op" value="+1" /> <input type="submit" name="op" value="+5" /> <input type="submit" name="op" value="+10" /> </form>

  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.1

>>テキストファイルの数値をPHPページの「+1」 「+5」 「+10」のボタンを押すと加算して保存するにはどうしたらいいでしょうか? そういう処理を行うPHPのプログラムを勉強して作成すればいいのです。

関連するQ&A