2014-08-30 187 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