同じような処理を一つにまとめたい

このQ&Aのポイント
  • PHP初心者が同じような処理を一つにまとめたいと考えています。具体的には、カウントの処理を簡略化したいと思っています。現在、count.txtとcounter.phpの2つのファイルでカウント処理を行っていますが、これが増えてくると手間が多くなります。代入などの方法を使って処理を簡略化する方法を教えていただけないでしょうか?
  • count.txtとcounter.phpの2つのファイルでカウント処理を行っています。カウント処理はcounter.php?vote=dis123のようなGETリクエストを受け取り、対応する変数に1を加算しています。しかし、この処理を簡略化したいと思っています。同じような処理を一つにまとめる方法があれば教えていただけないでしょうか?
  • PHP初心者です。count.txtとcounter.phpの2つのファイルでカウント処理を行っていますが、これが増えてくると手間が多くなります。同じような処理を一つにまとめる方法を教えていただけないでしょうか?具体的には、GETリクエストを受け取り、対応する変数に1を加算する処理を簡略化したいと思っています。
回答を見る
  • ベストアンサー

同じような処理を一つにまとめたい

count.txt <?php $dis123=0; $dis001=0; $hoge01=0; ?> ___________ counter.php <?php $vote = $_GET[vote]; $fp = fopen("count.txt", "r+"); include("count.txt"); @flock($fp,LOCK_EX); //今現在(カウント前)の値を書き込む fputs($fp,"<?php \$dis123=$dis123; ?>\n"); fputs($fp,"<?php \$dis001=$dis001; ?>\n"); fputs($fp,"<?php \$hoge01=$hoge01; ?>\n"); //GETで得た情報からカウントした物に+1して書き込む if ($vote===dis123){ ++$dis123; fputs($fp,"<?php $$vote=$dis123; ?>\n"); } if ($vote===dis001){ ++$dis001; fputs($fp,"<?php $$vote=$dis001; ?>\n"); } if ($vote===hoge01){ ++$hoge01; fputs($fp,"<?php $$vote=$hoge01; ?>\n"); } flock($fp,LOCK_UN); fclose($fp); echo "dis123は".$dis123."点<br>"; echo "dis001は".$dis001."点<br>"; echo "hoge01は".$hoge01."点<br>"; ?> _________________________________ 処理: counter.php?vote=dis123ときたらif処理して$dis123に+1する ________________________ 今は三つだからまだ大丈夫ですが、これが増えてくると手間が多いです そこで上記の今現在の値の書き込みとIF処理の部分を代入など、なんらかの形で簡略化できませんでしょうか?大改編になっても結構です。 よろしくお願いします。 備考:PHP暦三日目です、ここまでなんだかんだがんばったと思う。

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

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

  • ベストアンサー
noname#84373
noname#84373
回答No.5

flockについてだけど、個人的な主観として必要を感じていません なぜなら、それだけアクセスが集中されるほど注目を浴びている ページは少ないと思うので・・・(悪意はありませんよ!) 人間が連打したところ秒速何回? PHP側で1秒あれば何回処理を終えるか? なので、ファイルのオープン時間をできるだけ短くするだけ 良いと考えてます。 プロにつっこまれるかな? 他人が書いたプログラムを理解するのは難儀でしょうが 勉強になると思います。(俺のは微妙?) がんばってください! 逆ポイントプレゼントしておきました!^^;

idhokanohi
質問者

お礼

わ、昨日の間に解決していたのにわざわざ書き込んでいただきありがとうございます!あちらに書いたのですが、削除しちゃったのかな?。 ここのシステムですと、投稿後に解決した場合などに修正が効かないうえに、回答がないと新しく経過報告もできないのが不便ですよね・・・ このせいで過去に何度かすれ違いがありました。 ちなみにもともとPHP覚えるつもりなかったんですけどね!(ぇ 使ってみて結構便利だなって思ったのですが、PHPを使える無料サーバーってまだまだ少ないです・・・。 いやぁ、ほんと、ありがとうございました~!

その他の回答 (4)

noname#84373
noname#84373
回答No.4

<?php $f=fopen('num.dat','r');if(!$f) exit; $data=split(',',fgets($f));fclose($f); echo 'Click counter List.<br>'; for($i=0;$i<100;$i++) echo 'No.'.$i.'='.$data[$i].'<br>'; ということで、そろそろ上達したかな? PHP側で行うと「画面の更新」をしなと変化がおきない Ajaxを利用するとリアルタイムでカウントしていくのがわかる! たとえばJavascript側で5秒おきにチェックさせるとか!? まぁPHPでJavascriptを含むコードをかけばPHPは強大だけどね。

idhokanohi
質問者

補足

せっかくなのでできたものを記念に投稿。 counter.php by pipi様 <?php $f=fopen('num.dat','r');if(!$f) exit; $data=split(',',fgets($f));fclose($f);//カンマで区切って配列にいれる。 $no=$_GET['no']; switch( $_GET['m']){ case '0': if(strlen($no)==0) exit; echo ($data[$no]!=null)?$data[$no]:0; break; case '1': $data[$no]+=1; $wd = ''; for($i=0;$i<100;$i++) $wd.=(($data[$i]!=null)?$data[$i]:0).','; $f=fopen('num.dat','w');fputs($f, $wd);fclose($f); echo ($data[$no]!=null)?$data[$no]:0; } ?> test.php <html> <head> <meta http-equiv="content-type" content="text/html;charset=shift_jis"> <title>クリックカウント</title> <script type="text/javascript" src="xmlhttp.js"></script> <script type="text/javascript"><!-- var flag={}; function activate(i,num){ if (flag[i]==false||flag[i]==undefined){ flag[i]=1; dataSave(i,num); } else { dataSave(i,num); } function dataSave(i,num) { if(flag[i]<=5){++flag[i]; httpObj = createXMLHttpRequest(displayData); if (httpObj) { httpObj.open("POST","counter.php?m=1&no="+num,true);//ここのつっこみはなしでお願いしますw httpObj.send(null); } }} function displayData() { if ((httpObj.readyState == 4) && (httpObj.status == 200)) { $(i).innerHTML = httpObj.responseText; }else{ $(i).innerHTML = "<b>Wait...</b>"; } }} // --></script> <?php $f=fopen('num.dat','r');if(!$f) exit; $data=split(',',fgets($f));fclose($f); ?> </head> <body> <span onclick="activate('cut0','0')" style="cursor: pointer;text-decoration:underline;">ボタン0</span>を <span id="cut0"><?php echo ($data[0]!=null)?$data[0]:0;; ?></span>回おしました。<br> <span onclick="activate('cut1','1')" style="cursor: pointer;text-decoration:underline;">ボタン1</span>を <span id="cut1"><?php echo ($data[1]!=null)?$data[1]:0; ?></span>回おしました。<br> <span onclick="activate('cut2','2')" style="cursor: pointer;text-decoration:underline;">ボタン2</span>を <span id="cut2"><?php echo ($data[2]!=null)?$data[2]:0; ?></span>回おしました。<br> </body> </html> xmlhttp.js // HTTP通信用、共通関数 function createXMLHttpRequest(cbFunc) { var XMLhttpObject = null; try{ XMLhttpObject = new XMLHttpRequest(); }catch(e){ try{ XMLhttpObject = new ActiveXObject("Msxml2.XMLHTTP"); }catch(e){ try{ XMLhttpObject = new ActiveXObject("Microsoft.XMLHTTP"); }catch(e){ return null; } } } if (XMLhttpObject) XMLhttpObject.onreadystatechange = cbFunc; return XMLhttpObject; } // document.getElementById function $(tagId) { return document.getElementById(tagId); } num.dat 空のファイル

noname#84373
noname#84373
回答No.3

あぁ~またミスった! if(!n||n[1]>2) return;

noname#84373
noname#84373
回答No.2

>Ajax使ってるいから気にしなくてもよい! だったので、あれで良いと思ってた^^; それから、PHP側をちょこっと変更しました 書き込んだ後、その数値を返すようにしました。 Ajax側でそれを受け取って表示します というかこれはAjax板の話題では? <html> <head> <script type="text/javascript" src="prototype.js"></script> </head> <body> <form> <p> NSX <input type="button" value="投票する" id="c0"> / <span id="t0">?</span> 票<br> S2000<input type="button" value="投票する" id="c1"> / <span id="t1">?</span> 票<br> CIVIC<input type="button" value="投票する" id="c2"> / <span id="t2">?</span> 票<br> </p> </form> <script> window.onload=function(){ document.body.onclick = chk; } function chk(e){ var o=e?e.target:event.srcElement,n; var n=o.id.match(/c(\d+)$/); if(!n||n>2) return; var dmy = (new Date).getTime(); new Ajax.Request('test.php', { onSuccess: function(o){document.getElementById('t'+n[1]).innerHTML=+o.responseText;}, method:'get', parameters:'m=1&no='+n[1]+'&dmy='+dmy }); } </script> ---------------- test.php <?php $f=fopen('num.dat','r');if(!$f) exit; $data=split(',',fgets($f));fclose($f); $no=$_GET['no']; switch( $_GET['m']){ case '0': if(strlen($no)==0) exit; echo ($data[$no]!=null)?$data[$no]:0; break; case '1': $data[$no]+=1; $wd = ''; for($i=0;$i<100;$i++) $wd.=(($data[$i]!=null)?$data[$i]:0).','; $f=fopen('num.dat','w');fputs($f, $wd);fclose($f); echo $data[$no]; }

noname#84373
noname#84373
回答No.1

質問の1つ前を見ておくれ!^^; http://oshiete1.goo.ne.jp/qa4389708.html

idhokanohi
質問者

お礼

ありがとうございます。 noの数字がそのまま参照する場所になるのか・・・ふむふむ とりあえずカウンタ100個分ということですね。 すごく申し訳ないのですが、カウンタ数を表示させるスクリプトはどのように書けばいいのでしょうか? index.php カウンタ数を表示する場所 counter.php 書いていただいたカウンター

idhokanohi
質問者

補足

×カウンタ数 ○カウント数

関連するQ&A

  • 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
  • includeで読み込んだ内容を変数にいれたい

    includeで読み込んだファイル内容を変数に格納する方法はありますか? 動的ページをHTMLファイルで出力したいと思っています。 例: if(!file_exists("$file")){ mkdir("$file",0755); } $fp = fopen("$file/index.html","w") flock($fp, LOCK_EX); $hoge = include("./hoge.php"); fputs($fp,'<html>'."\n"); fputs($fp,'$hoge'."\n"); fputs($fp,'</html>'."\n"); この様に、$hogeの中に読み込んだファイルを書き込みたいのですが、 うまくできません。 この様な方法で変数にいれるのは可能でしょうか? 宜しくお願いします。

    • ベストアンサー
    • 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を勉強しているものですが アクセスカウンターをネットで調べ自分なりに書いたのですが 日にちが変わるとトータル、今日、昨日が全く動かなくなります。 どこをどうすればいいのか教えていただけないでしょうか? お願いします。 $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は勉強を始めたばかりです。 <? echo "Hello world!!";?> <br> あなたのIPは <? echo $_SERVER["REMOTE_ADDR"]?> ですね? <br> ただいま<? print (date ("Y年m月d日(D) H時i分s秒"));?>です <br><br> <?php $fp = fopen ("count.txt","r+"); $count = fgets ($fp, 32); $count--; fseek($fp, 0); fputs($fp, $count); flock($fp,2); $count = sprintf("%05d", $count); fclose($fp); echo $count ?> ログファイルは初期値として、10としました。 が9までは正常に減っていくのですが、次に8にならずに 89になってしまいます。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPのリロード時の処理

    PHPのリロード時の処理 PHPプログラム初心者です。 掲示板のプログラムを作成しております。 以下のコードで、リロード時、自動で投稿ボタンが押されてsubmitしてしまいます。 自分で考えた解決策としては、下記のwriteDate()内で、条件を入れることです。 $_GET['personal_name'];のデータを変数に保持し、次にリロードされた時同じものが返ってきら、writeDate()内の処理をしないという方法です。 このときの変数の保存の仕方が解りません。 ご存じの方がおられましたら教えてください。 <?php if($_SERVER["REQUEST_METHOD"]=="GET"){ writeData(); } readData(); function readData(){ $keijban_file='keijiban.txt'; $fp=fopen($keijban_file,'rb'); if($fp){ if(flock($fp,LOCK_SH)){ while(!feof($fp)){ $buffer=fgets($fp); print($buffer); } flock($fp,LOCK_UN); }else{ print('ファイルロックに失敗しました'); } } fclose($fp); } function writeData(){ //--------ここで同じ書き込みデータがあればreturnしたい。------- $t=$_GET['personal_name']; $personal_name=$_GET['personal_name']; $contents=$_GET['contents']; $contents=nl2br($contents); $data="<hr>\r\n"; $data=$data."<p>[投稿者:".$personal_name."]</p>"; $data=$data."[内容]"; $data=$data."<p>".$contents."</p>"; $keijban_file='keijiban.txt'; $fp=fopen($keijban_file,'ab'); if($fp){ if(flock($fp,LOCK_EX)){ if(fwrite($fp,$data)===FALSE){ print('ファイル書き込みに失敗しました'); } flock($fp,LOCK_UN); }else{ print('ファイルロックに失敗しました'); } } $data=null; fclose($fp); } ?>

    • ベストアンサー
    • PHP
  • 日本語が文字化けしないよう読み込み

    特定ファイルにある複数行の日本語文章を 「fgets」や「file_get_contents」などで画面に読み込む時は、 単純に「mb_convert_encoding」を使えば 良いと思ったのですが 下記のようには文法的にも使えませんでした。 -------------------------------------- <?php $fp = fopen("sample.txt", "r"); $fp = mb_convert_encoding($fp, "UTF-8"); ←※間違い if($fp){ flock($fp, LOCK_SH); while(!feof($fp)){ $data = fgets($fp); echo "$data<br>"; } flock($fp, LOCK_UN); } fclose($fp); ?> -------------------------------------- すでに書き込んである 日本語が複数行書かれたファイルから 文字化けしないようにデータを読み込んで表示するには どのような処理をしたら良いのでしょうか? 複雑な処理はまだ理解できないので 簡単な処理方法があれば お教えください。 よろしくお願いいたいます。

    • ベストアンサー
    • PHP
  • 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
  • LOCK_EXはifの条件になり得るのか?

    $fp = fopen("/tmp/lock.txt", "r+"); if (flock($fp, LOCK_EX)) { // 排他ロックを確保します ftruncate($fp, 0); // ファイルを切り詰めます fwrite($fp, "ここで何かを書きます\n"); fflush($fp); // 出力をフラッシュしてからロックを解放します flock($fp, LOCK_UN); // ロックを解放します } else { echo "ファイルを取得できません!"; } fclose($fp); PHPのマニュアルサイトに書いてあった例文なのですが、たぶんロックできなかった場合は「ファイルを取得できません!」に出るようにするというものだと思います。 ただ、LOCK_EXはロックできない場合は、ロックできるようになるまで待ちますよね? だとすると、このif文ってelseは機能しないと思うんですが、どうなんでしょうか? もしかしてLOCK_EXは時間制限があって、待ち状態が何分も続くとタイムアウトとしてFalseを返す? そのときにelseが動くということでしょうか? この例文の下にLOCK_NBを使ったものもあるので、LOCK_EXの動作を勘違いしてるとは思えません。 この例文はどのタイミングの時にFalseを返して、elseが動くのでしょうか? http://php.net/manual/ja/function.flock.php

    • 締切済み
    • PHP
  • flockのファイル保持について

    一つのブラウザで以下のプログラムを動かしつつ、、 ---- lock.php ---- <?php $filnam = "./log.txt"; $fp = fopen($filnam,"w"); flock($fp, LOCK_SH); ?> ここでしばらく待つ。 <?php sleep(30); flose($fp); ?> ------------------ もう一つのブラウザで ---- if.php ---- <?php $filnam = "./log.txt"; $fp = fopen($filnam,"w"); // ・・・(1) if(!flock($fp, LOCK_EX)){ print ("ロックされています。<BR>"); }else{ print ("ロックされていません。<BR>"); } ?> ------------------ を動かしました。 期待していた結果は 「ロックされています。」の表示です。 ですが、lock.phpプログラムの終了を、(1)の部分で待っているようで、lock.phpプログラムが終了後、「ロックされていません。」の表示になります。 ロックされていたらすぐに「ロックされています。」の表示を出したいのですが、どうしたらいいでしょうか?何か勘違いをしている部分があればご教授ください。

    • 締切済み
    • PHP

専門家に質問してみよう