存储在 .txt 文件中的计数器不递增

Counter stored in .txt file not incrementing

所以我刚刚编辑了我发布的代码,使其更易于阅读...
第一个代码块是我的计数器代码,用于点击成功提交按钮。但由于某种原因,即使提交成功,$Total 的值也不会增加 1。

<?php 
  $f = fopen('count.txt', 'r+'); // use 'r+' instead
  $total = fgets ($f);
  flock($f, LOCK_EX); // avoid race conditions with concurrent requests
  $total = (int) fread($f, max(1, filesize('count.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);
?>

这是我用来提交表单的提交按钮。

<input type="reset" value="Formular löschen" style="width:49%" />  
<input type="submit" name="submit" value="Formular absenden" style="width:49%" />

我正在尝试将此男女同校用于我的俱乐部,以便当人们提交表格时,他们会获得作为参考号的号码,该号码也会在发送的电子邮件中发送给他们。

我真的希望有一种无需数据库的简单方法。

马克

如果您想了解我的意思,问题是什么,here 是代码实现的页面。

发生这种情况是因为您在将其写入文件之前从未设置 $total。 您需要通过从文件中读取其值来设置 $total,如下所示: $total = fgets ($f)fopen 函数调用之后。

但是,如果没有独占文件锁,您可能会遇到并发问题,因此您可能会丢失一些提交计数。

首先,当您操作文件时,您可能会发现一些有用的提示:

  • 您必须始终检查文件和文件夹的权限,以确保安全。
  • 小心多线程代码,当多个线程同时更改文件时,您可能会得到非常意外的结果,因此请尝试像您一样使用锁来控制它。

我想你错过了 <form> 标签,所以我不得不自己发明一个。 使用此代码作为指南来制作您自己的代码:

<form method="post" action="test.php">
  <input type="submit" name="submit" value="Submit" />
</form>  

<?php 
  // Thread-safe <-- Use me
  function incrementFile ($file){
    $f = fopen($file, "r+") or die("Unable to open file!");
    // We get the exclusive lock
    if (flock($f, LOCK_EX)) { 
      $counter = (int) fgets ($f); // Gets the value of the counter
      rewind($f); // Moves pointer to the beginning
      fwrite($f, ++$counter); // Increments the variable and overwrites it
      fclose($f); // Closes the file
      flock($fp, LOCK_UN); // Unlocks the file for other uses
    }
  }

  // NO Thread-safe
  function incrementFileSimplified ($file){
    $counter=file_get_contents('count.txt');
    $counter++;
    file_put_contents('count.txt', $counter);
  }

  // Catches the submit
  if (isset($_POST['submit'])) {
     incrementFile("count.txt");
  }
?>  

希望对您有所帮助! :)