PHPの演算からファイルに書き込みまで

このQ&Aのポイント
  • PHP初心者が、単純なプログラムでボタンを押すごとに数字を減らすことができません。
  • 数字が2桁になるときに変な動作をするため、助けが必要です。
  • PHPのコードは提供されており、count.txtというデータファイルを使用しています。
回答を見る
  • ベストアンサー

PHPの演算からファイルに書き込みまで

PHP初心者のものです。すみません、自分でもしらべたのですが、どうしても解決できなかったので質問させてください。単純にボタンを押すごとにテクストにある数字を減数させていく簡単なプログラムを作りたいんですけど、 どうもうまくいきません。 最初に、180とデータに入力して、最初のうちはボタンを押すごとに5づつ減数されているのですが、桁が2桁になるとき(89とか90にまで減数とか)にかならず、980とかの数字に増数してしまいます。桁数が変わる直後でどうも変な感じになってしまいます。どちらさまかわかるかたいらしゃったら、時間の空いているときにでもお教えください。 OS:XP PHP:5.0 サーバ:apache PHPのコードは下のようになっていて、count.txtを、データファイルとして使ってます。 <html> <head> <title>減数</title> <body> <h2>うにゅ</h2> <!-- 【フォームよりデータ送信】 --> <form name="form" action="./A.php" method="POST"> <input type="submit" value="縮小"> </form> <p>現在の数は </p> <b> <?php $CountFilePath = "./count.txt"; $fp = fopen($CountFilePath , "r+"); $count = fgets($fp,5); rewind($fp); fputs($fp,$count-5); fclose($fp); print $count; ?> </b>です。 <p><hr></p> </body> </html>

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

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

  • ベストアンサー
  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.1

> $fp = fopen($CountFilePath , "r+"); > $count = fgets($fp,5); > rewind($fp); > fputs($fp,$count-5); > fclose($fp); これは3桁から2桁になったとき、ファイルの先頭の2桁だけ書くので 後ろの3桁目がゴミで残っていますね。 トランケテートしてファイルを短くします。 $fp = fopen($CountFilePath , "r+"); $count = fgets($fp,5); rewind($fp); ftruncate ($fp, 0); fputs($fp,$count-5); fclose($fp);

hikarara
質問者

お礼

なるほど、ゴミがたまってだめなんですね〆(∇ ̄〃) 。 トランケートというのをやってみましたらちゃんとできました。 ほんとうにありがとうございます!助かりました。

関連するQ&A

  • ファイルについて・・・。

    お願いいたします。 以下のソースは"samplefile.txt" が前提としてあることになって いますが、もしなかった場合このテキストファイルを作り出す仕組みをソースに加えたいんですが・・・。 2,3行目の間に「もしファイルがみあたらない時は・・」みたいな条件をつける??くらいしか自分の頭では思い浮かばず・・・ 何かアドバイスいただけないでしょうか??お願いいたします。 1 <?php 2 $fp = fopen("samplefile.txt", "a+"); 3 $count = fgets($fp, 15); 4 $count = $count++; 5 rewind($fp); 6 fputs($fp, $count); 7 fclose($fp); 8?> 9<p>あなたは <?php echo $count; ?> 人目のお客様です。

    • ベストアンサー
    • PHP
  • phpでfopen()やfputs()が使えない

    CGIを使ってやりたいことがあり、PHPを独学で学び、レンタルサーバーで実験をしているのですが、fopen()やfputs()をつかうとエラーのようになります。 これがそれです。 http://pgc.sub.jp/form.php サーバーはlolipopというところを使っているのですが、こちらのほうが許可していないということでしょうか。 ソースは以下のようになります。 <html> <head> <title>実験掲示板</title> </head> <body> <h1>実験掲示板</h1> 書き込む内容を入力してください。<hr> <form name="form" action="./sample01.php" method="POST"> <input name="body" type="text" size="40"> <input type="submit" value="書込"><hr> </form> <?php $data = file("./data.txt"); for($i=0; $i<sizeof($data); $i++){ print "記事NO.${i}:${data[$i]}<br>\n<hr>"; } ?> </body> </html> <?php $body = $_REQUEST["body"]; $body = $body."\n"; ?><html> <head> <title>Sample01</title> </head> <body> <?php $fp = fopen("./data.txt","a"); fputs($fp,$body); fclose($fp); echo "書き込み完了<br>", "<a href=\"./form.php\">戻る</a>"; ?> </body> </html> プラス空のdata.txtファイル また、大学のPCを使用しているのですが、 http://localhost/ をすると 「Connection Failed」となってしまい、localhostでの実験ができません。これは大学側が禁止しているためでしょうか?研究室のものですので、IPアドレスはそれぞれに割り当てられているのですが。

    • ベストアンサー
    • PHP
  • アクセスカウンターが更新されない(PHP)

    サーバーに count.txt というファイルを置いて 下記のようなPHPで更新するものを作りました。 <? $fp = @fopen("count.txt","r+") or die("ファイルが開けません");//読み書きモードでオープン flock($fp, LOCK_EX); $count = fgets($fp, 64); //64バイトorEOFまで取得、カウントアップ $count++; rewind($fp); //ポインタを先頭に、ロックして書き込み fputs($fp, $count); fclose($fp); //ファイルを閉じる echo $count; //カウンタ表示 ?> しかしながらカウンターは更新されません count.txt、の属性は666としてあります。 FTPを実行して 左右の窓の右側がサーバ側なので その中の、count.txt、を実行すると メモ帳で実行(ダブルクイック)し なかに書かれている数字を(たとえば100とあったものを101と書き換える)変更し 終了すると count.txtは更新されています、保存しますか と聞いてくるので、はい(Yes)で答えて、閉じ また開くと、100のままなのですが なにが原因か推定できないでしょうか? そのディレクトリー自体(ublic_htmlですが)の属性も書き込み可としても ダメでした。

    • 締切済み
    • PHP
  • 同時にファイル読み込み 書き込み

    現在、ヒストグラムのプログラムを作成しています。 まず0~255の1000個の乱数ファイルdata.txtを読み込み、 ヒストグラムは出来たのですが、 エクセルでグラフを作りたいので、 data1.txtに書き込みたいので、下のソースでやってみましたが、 0~255のカウントが全部0になってしまします。 fp = fopen("data1.txt","w");が無ければ正常に処理されます。 どうか教えてください。よろしくお願いします。 #include <stdio.h> #define BUF 10 #define MAX 256 void count(FILE *fp , int* counter); int main(void) { FILE *fp; fp = fopen("data.txt","r"); fp = fopen("data1.txt","w"); int counter[MAX]; int i; for(i=0 ; i<MAX ; i++) { counter[i] = 0; } count(fp , counter); for(i=0 ; i<MAX ; i++) { printf("%d %d\n" , i, counter[i]); } fclose(fp); return 0; } void count(FILE* p_file , int* counter) { char buf[BUF]; while (fgets(buf , BUF , p_file) != NULL) { int n; sscanf(buf , "%d" , &n); counter[n]++; } }

  • PHPのアクセスカウンターのバグについてです!

    PHPを勉強しているものですが アクセスカウンターをネットで調べ自分なりに書いたのですが 日にちが変わるとトータル、今日、昨日が全く動かなくなります。 どこをどうすればいいのか教えていただけないでしょうか? お願いします。 $txt='counter.txt'; $fp=fopen($txt,'r+'); if($fp!==false){ if(flock($fp,LOCK_EX)){ $counter=fgets($fp);//トータル 今日 昨日 日付 $count=explode(' ',$counter); if(date('j') != $count[3]){ $count[3]=date('j'); $count[2]=$count[1]; $count[1]=0; } $count[0]++; $count[1]++; $counter=implode(' ',$count); rewind($fp); fputs($fp,$counter); flock($fp,LOCK_UN);} } fclose($fp); ちなみにバグはトータル→今日→昨日→日付の順です。 500 1 1 262625 のようになっていました。 よろしくです。

    • ベストアンサー
    • PHP
  • PHPの実行結果を、htmlファイルで表示

    拡張子.htmlのファイルに、PHPで書き込んだカウンタの数字が表示できない ので、質問します。以下がプログラムです。 counter1.php <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML4.01 Translational//EN//" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head><title>PHP TEST</title></head> <body> <base font size="5"> htmlファイルにPHPの結果を表示できない。 </br> PHPファイルにhtmlを書き加える。 <?php $counter_file = 'counter.txt'; $counter_lenght = 8; $fp = fopen($counter_file, 'r+'); if ($fp){ if (flock($fp, LOCK_EX)){ $counter = fgets($fp, $counter_lenght); $counter++; rewind($fp); if (fwrite($fp, $counter) === FALSE){ print('ファイル書き込みに失敗しました'); } flock($fp, LOCK_UN); } } fclose($fp); print('count:'.$counter); ?> </body> </html> ------------------------------------------------------------------------ counter1.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html lang="ja"> <head> <meta http-equiv="content-type" content="text/html;charset=shift_jis"> <title>質問内容</title> <base href="file:///C:\Users\Public\Documents/" target="_blank"> <script language="JavaScript" src="hoge3.php"> </script> </head> <body bgcolor="#66ccff"> <h1>更新ボタンを押す度増加</h1> <?php require "counter1.php"?>回 <a href ="counter1.php"> </a> <img src ="counter1.php"> </img> </body> </html> -------------------------------------------------------------------------- Apacheのhttpd.confに追加した行 AddType application/x-httpd-php .html 以上のコードと設定で、自分のパソコンで.htmlのファイルにアクセスすると、 一応カウンタの数字は表示されました。(X)の画像も表示されました。 しかし、これからプロバイダー(ぷらら)が提供するホームページのサービスを利用するとき、 最初に表示するページは、index.htmlにしてください。とありそのページにPHPで作ったカウンタの数字を表示させたいのです。 どなたか、index.htmlにPHPの処理結果を表示する方法を教えてください。お願いします。

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

    テキストボックスの値をPOSTで送信し、日時とユーザが入力した値を1行ずつファイル(review.txt)に保存し、ページ下部にファイル内容を1行ずつ表示するプログラムを作成しましたが、ブラウザに発言履歴が残りません。どの部分を修正すればいいですか? <?php //ブラウザに履歴がのこらないです $filename = './review.txt'; $comment = ''; $date = date('m/d H:i:s'); if ($_SERVER['REQUEST_METHOD'] === 'POST') { if (isset($_POST['comment']) === TRUE) { $comment = $_POST['comment']; } if (($fp = fopen($filename, 'a')) !== FALSE) { $result = fwrite($fp, $comment . '-' . $date . "\n"); if ($result === FALSE) { print 'ファイル書き込み失敗: ' . $filename; } fclose($fp); } } $work = []; if (is_readable($filename) === TRUE) { print "\n"; if(($fp=fopen($filename,'a')) !== FALSE) { print "\n";} while(($tmp = fgets($fp)) !==FALSE) { print "\n"; $work[] = htmlspecialchars($tmp,ENT_QUOTES,'UTF-8'); } fclose($fp); } else { print "\n"; $work[] = 'ファイルがありません'; } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body> <h1>ファイル操作</h1> <form method="post" > <label><p>発言:<input type="text" name="comment"><input type="submit" value="送信"></p></label> </form> <p>発言一覧</p> <?php foreach ($work as $value){?> <p><?php print $date; $value?></p> <?php } ?> </body> </html>

    • ベストアンサー
    • PHP
  • 【PHP】アクセスカウンターが空回りしてしまいます。

    はじめて投稿します。 今まで無料アクセスカウンターをつけていたページを、 PHPにして、自作のアクセスカウンターを乗っける作業を しています。 来訪者にCookieをつけて、期限が切れるまでカウンターを 反応させないようにするつもりです。(ブラウザを閉じるまで) ローカルではうまく動くのですが、サーバに乗せてみると カウンターが空回りしてしまいます。 正直、どう手直ししていいか見当がつきません。 アドバイスをお願いします。 【おそらく問題のロジックの部分】 //$fp=fopen("count.txt","r+"); //$count=fgets($fp,8); //来場者数のファイルを読み取って必要な桁だけ入手。 //if(empty($_COOKIE["aaa"])){ // setcookie("aaa","on"); // $count++; // } //cookieが空の場合のみ、新たにcookieを作り来場者数に1足す。 //rewind($fp); //fputs($fp,$count); //fclose($fp); //ファイルに値を書き込んで閉じる

    • ベストアンサー
    • PHP
  • PHPでアクセスカウンタ

    表題どおりのシンプルな質問なんですけど、加算されません。 テキストにあるコードは: ### 011_counter.php ### <?php $fp=fopen("012_count.txt","r+");// 読み書きモードでオープン $n=fgets($fp); // 文字列の読み取り $n++; // カウントアップ echo $n,"人目"; // 表示 rewind($fp); // 読み書き位置を先頭に戻す fputs($fp,$n); // 書き込み fclose($fp); // ファイルを閉じる ?> ### 012_count.txt ### 0 ※このファイルは0のみで、この0の後には改行コードはありません これでhttp://localhost/php/011_counter.phpにアクセスすると 0 人目 が表示されます。 ただ、F5を押しても、他のサイトを見てまたアクセスしても変わりません。 012_count.txtの内容を3にすると、3 人目になりますが加算はされません。 テキストには「0の後に改行を入れると加算されない」とあるので、特に注意して改行を入れないようにしています。 OSはLinux Knoppix/Math2010です (Windows VistaにVMWare Playerを載せて、その上で走らせています)。 PCはTOSHIBAのSatelliteでメモリ4GB、ハードディスク250GBです。 PHP 5.2.11-1 with Suhosin-Patch 0.9.7 (cli)です。 ブラウザはIceweasel3.5.5です。 最初に書き換えの権限でエラーが出たので chmod -R 777 php chmod 777 012_count.txt も確実に行っています。 正しく加算されるようにするにはどうしたらよいのですか?

    • ベストアンサー
    • PHP
  • カウンターを一定数でリセットしたい

    はじめまして。 レッツPHPのカウンタを使っています。 <?php $fp = fopen("count.txt","r+") or die("Error!"); $count = fgets($fp, 64); $count++; rewind($fp); //set_file_buffer($fp, 0); flock($fp, LOCK_EX); fputs($fp, $count); fclose($fp); echo $count; ?> count_file.txt にはA00と記入しているのでA99になったら次はB00~Z99までカウントされるのを、F99まできたらリセットしA00から始めたいのですが式が分りません。$count++;を書き換えればいいのだとは思いますが・・・ よろしくお願いいたします。 PHP4.3.3

    • ベストアンサー
    • PHP

専門家に質問してみよう