- ベストアンサー
同じような処理を一つにまとめたい
- 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を加算する処理を簡略化したいと思っています。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
flockについてだけど、個人的な主観として必要を感じていません なぜなら、それだけアクセスが集中されるほど注目を浴びている ページは少ないと思うので・・・(悪意はありませんよ!) 人間が連打したところ秒速何回? PHP側で1秒あれば何回処理を終えるか? なので、ファイルのオープン時間をできるだけ短くするだけ 良いと考えてます。 プロにつっこまれるかな? 他人が書いたプログラムを理解するのは難儀でしょうが 勉強になると思います。(俺のは微妙?) がんばってください! 逆ポイントプレゼントしておきました!^^;
その他の回答 (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は強大だけどね。
補足
せっかくなのでできたものを記念に投稿。 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 空のファイル
あぁ~またミスった! if(!n||n[1]>2) return;
>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]; }
質問の1つ前を見ておくれ!^^; http://oshiete1.goo.ne.jp/qa4389708.html
お礼
ありがとうございます。 noの数字がそのまま参照する場所になるのか・・・ふむふむ とりあえずカウンタ100個分ということですね。 すごく申し訳ないのですが、カウンタ数を表示させるスクリプトはどのように書けばいいのでしょうか? index.php カウンタ数を表示する場所 counter.php 書いていただいたカウンター
補足
×カウンタ数 ○カウント数
お礼
わ、昨日の間に解決していたのにわざわざ書き込んでいただきありがとうございます!あちらに書いたのですが、削除しちゃったのかな?。 ここのシステムですと、投稿後に解決した場合などに修正が効かないうえに、回答がないと新しく経過報告もできないのが不便ですよね・・・ このせいで過去に何度かすれ違いがありました。 ちなみにもともとPHP覚えるつもりなかったんですけどね!(ぇ 使ってみて結構便利だなって思ったのですが、PHPを使える無料サーバーってまだまだ少ないです・・・。 いやぁ、ほんと、ありがとうございました~!