
A 回答 (7件)
- 最新から表示
- 回答順に表示
No.7
- 回答日時:
では「編集」ではなく「新規作成」してコピペしてください。
多分これならいけます。この回答への補足
長らくお付き合いいただきありがとうございました。
うまくいってうれしいです。
最後の質問です。
新規に保存もダメで、下記を消したらうまくいきました。
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>
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%2 …
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>
この回答への補足
ありがとうございます。
エラーが出ました。
Warning: Cannot modify header information - headers already sent by
で場所が
<?php
と
header('Location: HTTPから始まる自ファイルのURL');
の部分のようです。
アドレスは入れました。
No.4
- 回答日時:
>> ...の方はエラーがいくつか出ました。
私の知識ではよくわかりません。おそらくPHPのバージョンが5.2.5以前の非常に古いものを使っていますね。このバージョンではファイルオープンモードの「c」はサポートされていないためエラーが起こります。
PHP5.2系は機能が最新のものに比べて貧弱なだけでなく、セキュリティに問題があったときもパッチがリリースされない問題もあります。サポートが4年前に終了しているからです。もしPHPのバージョンをアップデートしない場合は、未だに Windows XP を使っているようなものだと思ってください。(アップデートを強く推奨します)
ちなみに最新バージョンは5.6系です。
>> 度々すいませんが一つ気になるのが、更新ボタンを押すと
>> 最後の仕事をやってしまいます。
>> いろいろ試したところ、0001.phpだとすると
>> 0001.phpのリンクを作ってクリックしてみると更新ボタンを押しても
>> 何も起こりません。
>> 仕事の最後に0001.phpに飛ぶって可能でしょうか?
…???
失礼ですが、本気で日本語が理解できないです…
この回答への補足
>> 度々すいませんが一つ気になるのが、更新ボタンを押すと
>> 最後の仕事をやってしまいます。
>> いろいろ試したところ、0001.phpだとすると
>> 0001.phpのリンクを作ってクリックしてみると更新ボタンを押しても
>> 何も起こりません。
>> 仕事の最後に0001.phpに飛ぶって可能でしょうか?
すいません。かなり説明を省略しすぎました。
たとえば +5 をクリックした後、更新ボタンを押すとまた+5されます。
他のボタンももちろん同様です。
そこでカウントの下に自ファイルへのリンクを作っておいて
+5などをクリックした後、
リンクをクリックしたら更新ボタンを押しても何も起こりません。
なので+5などをクリックしたら自ファイルへ飛ばせることは可能でしょうか?
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>
この回答への補足
ありがとうございます。
上部のプログラムばっちりです。
始めたばかりなので難しいです。
度々すいませんが一つ気になるのが、更新ボタンを押すと
最後の仕事をやってしまいます。
いろいろ試したところ、0001.phpだとすると
0001.phpのリンクを作ってクリックしてみると更新ボタンを押しても
何も起こりません。
仕事の最後に0001.phpに飛ぶって可能でしょうか?
> もし「a+」モードの挙動や型の自動変換が気持ち悪くて理解しにくい場合はこう書くといいかもしれません。
の方はエラーがいくつか出ました。私の知識ではよくわかりません。
No.2
- 回答日時:
これの発展課題かな…(
http://detail.chiebukuro.yahoo.co.jp/qa/question …
$_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>
この回答への補足
下記のプログラムですが動くようになったのですが、
二度押せば正常に動く状態になりました。
+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>
No.1
- 回答日時:
>>テキストファイルの数値をPHPページの「+1」 「+5」 「+10」のボタンを押すと加算して保存するにはどうしたらいいでしょうか?
そういう処理を行うPHPのプログラムを勉強して作成すればいいのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フォームボタンを押すたびに数...
-
HTMLで前の画面に戻る時、入力...
-
DBの値をチェックボックスに反...
-
PHPの関数実行
-
フォームへの前回入力値をクリ...
-
アップロードの際にファイルパス
-
フォームでのリセットを使う方法
-
PHP ボタンが押されたら処理を...
-
HTMLのリンクをクリックするこ...
-
php mysql でチェックボックス...
-
PHPによるCSVファイルの指定列...
-
phpのswitch文
-
XMLデータをPOSTで送信・受信す...
-
フォーム送信後の更新ボタンで...
-
POSTデータをフォームに残す方法
-
PHPの質問:フォームから受け取...
-
PHPのエラーの解消法について教...
-
[Ethna]selectボックスに空値を...
-
VBA で、スペースを含むファイ...
-
テキストリンクをPOST送信したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
HTMLで前の画面に戻る時、入力...
-
検索時の選択内容を保持する方法
-
DBの値をチェックボックスに反...
-
$_SESSIONについて教えて下さい。
-
PHPで、ボタンを押すと同じペー...
-
PHP ボタンが押されたら処理を...
-
<input type="hidden" >で配列...
-
アンケートフォームの作り方
-
入力した部分を表示させたまま...
-
画面が更新されてもチェックボ...
-
ラジオボタンをsessionで使いたい
-
チェックボックスによる検索
-
PHPで画像の渡しが上手く行きま...
-
同じページでフォームデータを...
-
POSTをボタンではなくリンク等...
-
配列をhiddenで
-
HTMLのvalue値を取得したい。
-
パラメーターを隠す
-
選んだ数字だけ繰り返す
-
PHPで画像データーのアップロー...
おすすめ情報