用于网站的多个变量的PHP计数器


PHP counter for multiple variables for website

我希望设置一个服务器,该服务器接受一个包含几个变量的URL,我将使用$_GET语句来获取这些变量。这些变量将递增存储在服务器上的计数器。我本来打算把这些文件写入一个文件,然后打开它/写入它,有点像这样http://www.developingwebs.net/phpclass/hitcounter.php然而,这只是针对一个变量显示的。我更改了代码以反映多个变量,但不完全确定如何将多个变量写入文件。我在用这个:

$counters = ("counter.txt");
$increment = file($counters);
/* Bunch of if else ladders checking the $_GET statements and
   incrementing $increments[] accordingly */
for($i; $i < 16; $i++)          //write variables to file
    fputs($fp, $increment[$i]);

其中$fp指向我正在使用的文本文件,$increment[]保存递增的变量等等。那么这行得通吗?如果多个人同时访问此URL,这是否有效?无论有多少人访问该页面,它都需要对所有变量进行准确计数。

示例:一份在线提交的调查,共有4个问题。每个响应有4个选项,因此总共存储了16个变量。人们将随机地并且可能同时向服务器提交他们的响应。即使多人同时提交,我也需要分析他们的响应并相应地更新计数器。

谢谢你的帮助,希望我提供了足够的细节,但如果不是问问题。

编辑:URL正在从安卓设备发送到服务器,我不知道这是否会改变什么,只是想澄清一下。Android设备正在提交调查回复。

基于Graham的评论,您最好让数据库服务器处理响应,并将汇总作为报告系统的一部分,而不是表单提交过程的一部分。

这里有一个例子,在某种元代码中。首先,您的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,让您检测是否使用同一浏览器多次填写表单。

假设您已经有一个具有适当换行符数量的现有文件来启动您,这可能会起作用。但是,我不相信它能很好地保持数据完整性,因为它可能会导致竞争条件。为了防止出现竞争条件,理论上您应该打开文件,将其聚集,然后写入文件。其他试图读取群集文件的脚本实例将不得不等待。更好的方法可能是使用数据库。

您可以使用http_build_query函数,使用字符串分隔符char(如"||")来存储$_GET数组。

$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.
}