2012-03-26 9 views
1

私は$ _GET文を使って取得するいくつかの変数を持つURLを受け付けるサーバを設定したいと考えています。これらの変数は、サーバーに格納されているカウンターをインクリメントします。私はこれらのファイルをファイルに書き込んだ後、それを開いたり書いたりしようとしていましたが、これはhttp://www.developingwebs.net/phpclass/hitcounter.phpのようなものですが、これは1つの変数に対してのみ表示されます。私は、複数の変数を反映するようにコードを変更しましたが、ファイルに複数の変数を書き込む方法が完全にはわかりません。私はこれを使用していました:ウェブサイト用の複数の変数のPHPカウンタ

ここで、$ fpは私が使っていたテキストファイルを指し、$ increment []は増分されている変数を保持しています。だからこれはうまくいく?そして、これは複数の人々が同時にこのURLにアクセスすることで動作しますか?ページにアクセスする人の数に関係なく、すべての変数の正確な数を維持する必要があります。

例:オンラインで4つの質問が提出されました。各応答には4つのオプションがあり、合計16の変数が格納されます。人々は、無作為に、そしておそらく同時に、彼らの応答をサーバに提出するでしょう。複数の人が同時に投稿している場合でも、回答を解析してカウンターを更新する必要があります。

ご協力いただきありがとうございます。十分な詳細を提供していただきたいと思いますが、質問するだけではない場合もあります。

EDIT:AndroidデバイスからサーバーにURLが送信されています。変更が何か変更されたかどうかわかりませんが、わかりやすくしたいだけです。 Androidデバイスがアンケート回答を送信しています。

+1

データベースのようなアトミックではなく、ファイルを使用してもよろしいですか?両方のインスタンスがカウンタを同じ値に更新しようとしているため、カウントが失われたりエラーが発生したりすると同時に、2つの送信が同時に発生することはありませんか? SQLデータベースを入手できませんか? [MySQL](http://php.net/manual/en/book.mysql.php)または[PostgreSQL](http://php.net/manual/en/book.pgsql.php)はどちらもPHPでうまく動作しますあなたの質問に記述した方法よりも、あなたが望むことをやり遂げる可能性が高いでしょう。 – Graham

+0

ええ、私はそれが競争条件などを避けるためにやってしまうかもしれないと思います。 – eric

答えて

2

ビルを行うことができ、あなたは、データベース・サーバー・ハンドルの応答をさせる、と報告の一環として、あなたの合計を構築するオフはるかに良いだろうシステムではなく、フォーム提出プロセスの一部です。

ここに、ソート・オブ・メタ・コードの例があります。まず、あなたのHTMLフォーム:

<form method="GET"> <!-- though I recommend POST instead --> 
<input type="checkbox" name="ch[1]"> Checkbox 1 
<input type="checkbox" name="ch[2]"> Checkbox 2 
<input type="checkbox" name="ch[3]"> Checkbox 3 
</form> 

次に、フォームを受け取り、PHP:

<?php 

    $qfmt = "INSERT INTO answers (question, answer) VALUES ('%s, '%s')"; 

    foreach ($ch as $key => $value) { 
    if ($value == 'Yes') { 
     $query = sprintf($qfmt, $key, $value); 
     mysql_query($query); 
    } 
    } 

    print "<p>Thanks!</p>\n"; 

?> 

最後に、あなたの合計を収集するために:

SELECT COUNT(*) FROM answers WHERE question = '1'; 
SELECT COUNT(*) FROM answers WHERE question = '2'; 
SELECT COUNT(*) FROM answers WHERE question = '3'; 

あなたが他を処理するために、これを適応することができます同じブラウザがあなたのフォームに複数回記入するのに使用されているかどうかを検出できるように、長寿命のセッションCookieを格納することもできます。

+0

ええ、私は少しこれを微調整する必要がありますが、これは私が行う必要があると思うものについてです。それはhtmlドキュメントのようにはならないだろうが、結果を提出するAndroidアプリケーションになるだろう。だから私はURLにメッセージを送ることを計画していたと思うし、それはPHPスクリプトをトリガーします。 – eric

+1

これは物事をより簡単にすることができます。あなたはあなたが望むようにあなたのデータを解釈することができます。これは、PHPのサンプルで実際のフォーム処理を含めなかった理由のようなものです。 HTML、JSON、またはkey = valueのペアから '$ ch'配列を読み込むかどうかはあなた次第です。要点は、*記録*ではなく、*報告*を行うコードに合計を加える数学を扱うことです。 – ghoti

1

これは、あなたに既に正しい改行文字数のファイルがあると仮定すると、動作します。しかし、競合状態を引き起こす可能性があるため、データの整合性が非常に良好に維持されるとは考えていません。競合状態を避けるためには、理論的にはファイルを開き、それを集めてからファイルに書き込みます。フロックファイルを読み取ろうとする他のスクリプトインスタンスは、待機する必要があります。より良いアプローチは、データベースを使用することです。

+0

それは私がデータベースを実装する方が良いかどうか、またはファイルが十分であるかどうかを調べようとしてきたことです。私は多分すべてが入ってきて、スクリプトが連続して実行できると考えました。それゆえ疑問だが、肯定的ではなかった。 – eric

1

"||"のような文字列区切り文字を使用して$ _GET配列を格納するには、http_build_query関数を使用できます。保存された情報を読み取るために

$data = http_build_query($_GET)."||"; 
$fp = fopen("counter.txt", "w"); 
fputs ($fp, $data); 
fclose ($fp); 

はグラハムさんのコメントでこの

$fp = fopen("counter.txt", "r"); 
$contents = fread($fp, filesize("counter.txt")); 
fclose($fp); 

$array=explode("||",$contents); 

foreach($array as $var){ 
    parse_str($var, $data); 

    //-$data contains youre stored values. 
} 
+0

これはまだ2人のインスタンスが同じファイルに同時にアクセスしようとする競合状態になると思います。しかし、提案をありがとう。 – eric

関連する問題