PHPで数を操作する方法

このQ&Aのポイント
  • PHPで数を1足していく処理と1引いていく処理を実装したいが上手くいかない。
  • 数を1足す処理ではファイルを読み込み、数を1増やして保存する。
  • 数を1引く処理ではファイルを読み込み、数が0でない場合に1減らして保存する。
回答を見る
  • ベストアンサー

phpである処理をすると数を1足して、ある処理をするとその数字から1引

phpである処理をすると数を1足して、ある処理をするとその数字から1引くような事をしたいのですが、上手くいきません。(まれに数字にずれが生じてしまいます。) 1足していくもの $fp = fopen("./data/registry/buy.dat","r+"); $registry_count = fgets($fp,1024); if($registry_count == ""){ $registry_count = 0; } $registry_count++; flock($fp,LOCK_EX); fseek($fp,0); fputs($fp,$registry_count); flock($fp,LOCK_UN); fclose($fp); 1引いていくもの $fp = fopen("./data/registry/buy.dat","r+"); $registry_count = fgets($fp,1024); if($registry_count != "0"){ $registry_count--; } flock($fp,LOCK_EX); fseek($fp,0); ftruncate($fp,0); fputs($fp,$registry_count); flock($fp,LOCK_UN); fclose($fp); どなたかご教授ください。 よろしくお願いいたします。

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

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

  • ベストアンサー
  • Hohenheim
  • ベストアンサー率18% (43/237)
回答No.1

flockの位置が間違っています。 fopen直後にロックをかけるべきです。 ------------------------------------- $fp = fopen("./data/registry/buy.dat","r+"); flock($fp,LOCK_EX); $registry_count = fgets($fp,1024); 以下略

hunter_999
質問者

お礼

ご指摘の点を修正して多分、問題なく動作いたしました。 ありがとうございます。

hunter_999
質問者

補足

早速ご回答ありがとうございます。 ご指摘の通り、flock関数の使い方が間違っていました。 原因として考えられるのはflock以外に 何かあればご指導のほどよろしくお願いいたします。

その他の回答 (2)

  • qaqa246
  • ベストアンサー率27% (45/163)
回答No.3

>やはり「===」でしょうか? 個人的にはstrcmp()関数を利用するようにしている。

hunter_999
質問者

お礼

ご指摘の点を修正して多分、問題なく動作いたしました。 ありがとうございます。

  • qaqa246
  • ベストアンサー率27% (45/163)
回答No.2

>if($registry_count == ""){ 文字列比較に「==」を使うのはやめましょう。

hunter_999
質問者

補足

ご回答ありあがとうございます。 やはり「===」でしょうか?

関連するQ&A

  • phpで引き算が上手くいかない

    データの引き算で書き出す際に予期しない数字になってしまって 困っております。 data.datに10となっていた際に、下記のコードを実行すると90になってします。本当は9にしたいのですが、どこに原因があるのかわからずにおります。 どなたかご教授ください。 宜しくお願いいたします。 $fp = fopen("data.dat","r+"); $registry_count = fgets($fp,1024); if($registry_count != "0"){ $registry_count--; } flock($fp,LOCK_EX); fseek($fp,0); fputs($fp,$registry_count); flock($fp,LOCK_UN); fclose($fp);

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

    <?php $filename = 'count.dat'; $fp = fopen($filename, "r+"); $count = fgets($fp,32); $count++; fseek($fp, 0); fputs($fp, $count); fclose($fp); echo ($count); ?> これを日付が変わったら0にリセットしてくれるシステムにしたいんですが、どうしたらいいですか??

    • ベストアンサー
    • PHP
  • 何がおかしいのでしょうか?

    $filename1 = 'ymd.dat'; $fp1 = fopen($filename1, "r+"); $day2 = fgets($fp1,9); $day = date('Ymd'); //今日のアクセス数カウント。日付が変われば0になる。 $filename2 = 'ymd2.dat'; $fp2 = fopen($filename2, "r+"); $count2 = fgets($fp2,32); if($day==$day2){ $count2++; fseek($fp1, 0); fputs($fp1, $day); fclose($fp1); }else{ $count2 = 0; fseek($fp1, 0); fputs($fp1, $day); fclose($fp1); } fseek($fp2, 0); fputs($fp2, $count2); fclose($fp2);

    • 締切済み
    • PHP
  • 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のカウンタを使っています。 <?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
  • PHPカウンタのデータファイルのパスについて

    PHPカウンタのデータファイルをひとつ上の階層に置いて3つのページで共有したいのですが、 $fp="fopen("counter.dat"," "r+"); 上記パスを $fp="fopen("../counter.dat"," "r+"); このように記述するとエラーになってしまいます。 やり方が間違ってますでしょうか? 以下ソースです。 <?php $fp="fopen("counter.dat"," "r+"); $count=fgets($fp, 6); $count++; fseek($fp, 0); fputs($fp, $count); fclose($fp); ?><BR> <?php echo sprintf('%05d',$count); ?> 初心者の質問で申し訳ありませんが、 ご回答のほどよろしくお願い致します。

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

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

    • ベストアンサー
    • PHP
  • ファイルへの書き込み

    フォームに入力されたデータをCSVファイルに書き込みたいのですが、以下のようにすると追加で書き込みはできるのですが、ずっと改行されずに1行に書き込まれてしまうので、新しいデータを入れる際に改行されるようにしたいのですが、どのようにすればいいでしょうか? $fp = fopen(TEST_FILE,"a") or die("ファイルを開けません\n"); flock($fp, LOCK_EX); fputs($fp, "aaa")."\n"; flock($fp, LOCK_UN); fclose($fp);

    • ベストアンサー
    • PHP
  • PHP、外部ファイルにテキストを書きだす。

    こんにちは、皆様。 下記のソースを実行したいと思います。期待する結果としては、外部ファイルに行列に書き出すことです。 <?php $count_file="count.dat"; if(file_exists($count_file)){ $file = fopen("count.dat", "a") or die("file can not open"); $order_no = fgets($file) + time(); print $order_no; }else{ $file = fopen($count_file, "w") or die("file can not open"); $order_no = time(); } set_file_buffer($file,0); flock($file, LOCK_EX); fputs($file , $order_no); flock($file, LOCK_UN); fclose($file); ?> このソースの結果は配列として書き込まれてました。こんな感じです。 129835261512983526501298355377129835537912983566121298356635 このソースを実行する度にcount.datファイルに順次書き出したと思います。 1298352615 1298352650 1298355377 1298355379 1298356612 1298356635 まだまだPHP勉強中なのでわかる方教えてください。 (1)この行で$order_no = fgets($file) + time(); 改行記号をどう付ければ良いでしょうか? (2) C言語のようにポインターで指定しなければならないですか?書き方を教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPでpopenでファイル出力

    下記のようにプログラムを作成しておりますが、 検索結果全体を読み込むことができません。 全て8000バイトくらいしか読み込むことができません。 何故でしょうか?? | more という文をgrep に追加してもできませんでした。 $fp_r = popen('nkf -e -Lu '.$fileName.' | grep \''ああ'\'',"r"); //ファイルの内容を全て読み込む $body=fread($fp_r,filesize($fileName)); $fp = fopen($preFile, "w"); chmod($preFile,0777); flock($fp, LOCK_EX); fputs ($fp, $body); flock($fp, LOCK_UN); fclose($fp); pclose($fp_r);

    • ベストアンサー
    • PHP

専門家に質問してみよう