重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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暦三日目です、ここまでなんだかんだがんばったと思う。

A 回答 (5件)

flockについてだけど、個人的な主観として必要を感じていません


なぜなら、それだけアクセスが集中されるほど注目を浴びている
ページは少ないと思うので・・・(悪意はありませんよ!)
人間が連打したところ秒速何回?
PHP側で1秒あれば何回処理を終えるか?
なので、ファイルのオープン時間をできるだけ短くするだけ
良いと考えてます。

プロにつっこまれるかな?

他人が書いたプログラムを理解するのは難儀でしょうが
勉強になると思います。(俺のは微妙?)
がんばってください!
逆ポイントプレゼントしておきました!^^;
    • good
    • 0
この回答へのお礼

わ、昨日の間に解決していたのにわざわざ書き込んでいただきありがとうございます!あちらに書いたのですが、削除しちゃったのかな?。

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

お礼日時:2008/10/10 14:30

<?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
空のファイル

補足日時:2008/10/10 14:32
    • good
    • 0

あぁ~またミスった!


if(!n||n[1]>2) return;
    • good
    • 0

>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];
}
    • good
    • 0

質問の1つ前を見ておくれ!^^;


http://oshiete1.goo.ne.jp/qa4389708.html

この回答への補足

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

補足日時:2008/10/09 21:59
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/10/09 21:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!