• 締切済み

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

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

  • 1つのhtmlファイル内にPHPが入れてあるプログラムで数値を加算する

    1つのhtmlファイル内にPHPが入れてあるプログラムで数値を加算するボタンを作りたい htmlでボタンを1つ作ってそのボタンを1回押すと同じファイルの中に書かれたPHPの変数に+1 2回押すと+2といった感じのプログラムを作りたいのですが、どのように書けばよいでしょうか? 初心者なのでなるべく簡単によろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPでラジオボタンの値をテキストファイルに保存

    PHPでラジオボタンの値を別のPHPファイルに渡すのはわかりましたが、 テキストファイルに保存するのはできないのでしょうか? 出来るのでしたらどう記述するのでしょうか? ご教示お願いいたします。

    • ベストアンサー
    • PHP
  • テキストボックスに記述した数値を加算させたい

    コントロール配列にしたテキストボックスに数値を入力し、その数値に金種(10000円、5000円、1000円・・・)を乗算します。 そこで得られた結果を足して、ラベルに表示させたいと思っています。 現在、テキストボックスに数値を入れると ・小さい数値ならば、うまく加算できる ・大きい数値ならば、オーバーフローする ・何も記述しない(空白)とエラーがデータ型が違うという、エラーがでる といった状態です。何がおかしいのか頭を悩ませていますので、アドバイスをお願いします。 *********************************************** For i = 0 To 8 Maisuu(i) = Val(txtKinsyu(i).Text) Next i lngGoukei = Maisuu(0) * 10000 + Maisuu(1) * 5000 + Maisuu(2) * 1000 _ + Maisuu(3) * 500 + Maisuu(4) * 100 + Maisuu(5) * 50 _ + Maisuu(6) * 10 + Maisuu(7) * 5 + Maisuu(8) * 1 lblGoukei.Caption = lngGoukei ***********************************************

  • テキストファイルを開かずにダウンロードする方法は?

    Webページ上から色々なファイルをダウンロードさせたくてダウンロード用のボタンを作りそれぞれのファイルにリンクを貼りました。エクセルやワード等のファイルはボタンをクリックすると「ファイルを開くか保存するか」を選択するメッセージが表示されるので「保存」を選ぶ事ができるのですが、テキストファイルは、いきなり開いてしまい保存する事ができません。どうすればダウンロード用のボタンをクリックする操作でテキストファイルを保存する事ができるのでしょうか。右クリックで「対象をファイルに保存」を選ばずに私の作ったダウンロード用のボタンで保存させたいのです。また、テキストファイルを圧縮してリンクを貼るのも避けたいのですが、どうしたらいいのでしょうか。教えてください。お願いします。

  • エディットボックスの数値をテキストファイルとして保存するには?

    プログラム初心者です。 質問させてください! リソース機能を用いて、親ウインドウのメニューバーから子ウインドウのダイアログを作成するプログラムを作りました。 さらにその子ウインドウ上に、エディットボックスのコントロールを作り、それに入力した数値をこの子ウインドウ上に新に設けたボタン(IDC_BUTTON1)が押された時に、この数値をテキストファイルに上書きして名前をつけて保存という形で保存させたいと思っております。 MFCの機能は使っておりません。 このような機能を実現させるためには、 どのような関数を使えばいいのでしょうか。 コモンダイアログボックスを使ってうまくプログラムを書ければと思うのですが・・・ どなたかご教授よろしくお願いいたします。

  • エクセルで数値を簡単に加算したい

    エクセルである列に適当な数値が入っており、1ボタンでその列のすべての数値が、1加算されるような仕組みを作りたいのですが どのような方法がありますでしょうか? 例) A 1 10 2 23 3 24 4 5 5 16 結果 A 1 11 2 24 3 25 4 6 5 17 よろしくお願いします。

  • ダイナミックテキストのテキストファイルをPHPで編集

    使用しているのはflashMXです。初心者ですが、よろしくお願いいたします。 ダイナミックテキストを作成し、copy.datから変数textFieldを読み込んでいます。 このcopy.datファイルをPHPで編集し、UTF-8で保存し、ファイルを確認すると、きちんと更新されているのですが、実際にflashページを表示(更新)しても、反映されません。 キャッシュを削除し、更新したら、きちんと表示されました。 HPを見てもらう場合に、見に来てくれた人に、いちいちキャッシュを削除してもらうはずもないでしょうから、何かよい方法、もしくは、他の対応策があるのだと思い、質問させていただきました。 また、PHPも初心者です。 PHPでキャッシュを削除する方法なんかもあるのでしょうか?

  • テキストファイルの読み込みについて

    PHP4を使用しています。最近、はじめたばかりで教えていただきたいと思い、質問させていただきます。 現在、作成したいシステムの仕様を説明します。 まず、abc.txtというファイルには、 20050225,001,パソコン,102000 20050225,002,モニター,4000 20050225,003,マウス,2100 … (日付、ID、品物、単価) いうデータが保存されております。 このtxtファイルを二次元的に読み込ませ、表示するのですは、一行ずつ表示したいのです。表示するページには、"次へ"ボタンを作成し、ボタンを押すと次行への表示を行う。 以上ですが、スライドショー感覚で表示を行いたいのですが、どのようにすればよろしいのでしょうか。 私が考えるには、txtファイルのIDまたは、txtファイルの行数をgetやpostで引き渡して…と考えますが、PHP初心者もあり、どのようなロジックで次行に移るのかわかりません。よろしければ、その方法(命令)もご伝授の程、宜しくお願い致します。

    • ベストアンサー
    • PHP
  • vbsでテキストファイル検索してファイルに書き込む

    初心者です。 テキストファイルを以下の条件で検索して、検索がマッチしたらそのファイルのレコード行を各条件によって指定されたファイルに書き込みたいです。 1)5桁目が"D"且つ 10~11桁目が"A5"の場合、ファイル"TEXT1.txt"に書き込む 2)5桁目が"G"且つ10~11桁目が"B6"の場合、ファイル"TEXT2.txt"に書き込む 3)上記に該当しない場合、ファイル"TEXT3.txt"に書き込む どなたかご教示のほど宜しくお願い致します。

  • visual basic6.0でのテキストファイルからの読み込みについて。

    vb初心者です。 数値をテキストファイルに保存しています。その数値は、x方向に10個、y方向に3個、つまり10列3行の数値を保存しています。 そのデータを2次元配列 D(x,y)として読み込みたいのです。 for x=0 to 9, for y=0 to 2 と範囲を指定して、数値全部を読み込むときは、D(x,y)の値は正しく入っているのですが、 ある範囲だけを読み込みたいとき、たとえば for x=0 to 5, for y=0 to 1 としたとき、D(x,y)は別の数値が読み込まれてしまいます。 これは、テキストファイルの数値が配列になっていないということですよね?? どうすれば、テキストファイルの数値を2次元配列として読み込むことができるのでしょうか? 文章が解りにくくてごめんなさい!!よろしくお願いします! 

印刷できません。対処方法は?
このQ&Aのポイント
  • 印刷時に印刷できず、電源の入れ直しも効果がない場合の対処方法を教えてください。
  • お使いの環境や接続方法、関連ソフトについて詳細に教えていただけますか?
  • 電話回線は繋いでいない場合も印刷できない原因となるのでしょうか?
回答を見る