2014-08-30 389 views
-1

只是试图计算按钮被点击的次数,将其记录到文件中,以便适用于所有人。它正在读取文件,但没有写入。想法?用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

我会避免使用此文件。我会切换到数据库解决方案。如果两个人同时点击该按钮,可能会出现差异。 – QuinnFTW 2014-08-30 20:57:25

+0

检查以确保文件具有正确的写入权限。通常644会做,但作为最后的手段,尝试777.虽然不推荐777,但你可以尝试两种。 – 2014-08-30 21:09:25

+0

@QuinnFTW虽然我同意使用DB,但OP使用文件锁定“LOCK_EX”。 – 2014-08-30 21:12:50

回答

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"; 
} 
?> 
+0

这给了我一个错误请求URL:\t的http://本地主机:8888/science_stands/ 请求方法:\t GET 状态代码:\t HTTP/1.0 500内部服务器错误 – prismspecs 2014-08-31 18:05:58