使用PHP计算按钮单击

时间:2014-08-30 20:54:16

标签: php

只是尝试计算单击按钮的次数,将其记录到文件中,以便适用于所有人。它正在阅读文件,但是没有写。想法?

        <form action='' method="post">
        <input type="submit" name="submit" value="Tweet it!" onclick="genTweet()"/>
    </form>

    <br>


    <?php
        $f = fopen('counter.txt', 'r+'); // use 'r+' instead
        flock($f, LOCK_EX); // avoid race conditions with concurrent requests
        $total = (int) fread($f, max(1, filesize('counter.txt'))); // arg can't be 0
        /*if someone has clicked submit*/
        if (isset($_POST['submit'])) {
           rewind($f); // move pointer to start of file so we overwrite instead of append
           fwrite($f, ++$total);
        }
        fclose($f);
    ?>

    This button has been clicked <?php echo $total; ?> times.

1 个答案:

答案 0 :(得分:0)

如果您使用的是5.3.2以上的PHP版本,则应使用LOCK_UN标志调用flock。 fclose可能不足以释放锁,直到拥有它的处理仍然存在。

flock手册页指出:

  

在5.3.2之前的PHP版本中,锁定也由fclose()释放(在脚本完成时也会自动调用)。

同时检查counter.txt文件权限。它必须可由Web服务器用户写入。

<?php
$total = 0;
$f = @fopen('counter.txt', 'r+');
if ($f) {
  $mode = (isset($_POST["submit"]) ? LOCK_EX : LOCK_SH);
  if (flock($f, $mode)) {
    $total = (int)fgets($f);
    if ($mode == LOCK_EX) {
      ftruncate($f, 0);
      fputs($f, ++current);
      fflush($f);
    }
    flock($f, LOCK_UN);
  }
  fclose($f);
}
else {
  print "counter.txt could not be opened";
}
?>