为什么双击不两次提交表单?

时间:2018-07-22 11:10:46

标签: php html http-post

我有这个表格:

<form action="/test.php" method="POST">
  <input type="submit" value="Add">
</form>
提交给test.php

<?php

echo "Hi";

$file = 'file.txt';
$fp = fopen($file, 'r');

if (flock($fp, LOCK_EX)) { 
  $current = file_get_contents($file);
  $current .= "+\n";
  file_put_contents($file, $current);
  flock($fp, LOCK_UN); 
}

sleep(2);

我正在使用羊群防止内容被错误覆盖。

由于sleep部分,我可以连续单击Add按钮。但是,无论我在加载时多久单击一次Add按钮,在file.txt中我只会发现一行:

  

+

我希望,如果在加载时按5次按钮,我应该得到

  

+++++

为什么不会这样?


备注

  1. 我知道这里有一些主题,如何防止使用CSRF进行双重提交或禁用使用JS提交的按钮(请参阅How to prevent multiple form submission on multiple clicks in PHP)。为什么在我的场景中没有重复提交?

  2. 除了可以写入test.php中的文件之外,还可以在数据库中插入一行

    $conn = new mysqli($servername, $username, $password, $dbname);
    $sql = "INSERT INTO user (name) VALUES ('John')";
    $conn->query($sql)
    

    其中table用户具有一个主要的自动增量列id。多次单击该按钮仍只会导致插入一个新行。

1 个答案:

答案 0 :(得分:0)

根据您的代码:

file_put_contents($file, $current, LOCK_EX);

请注意LOCK_EX

您正在锁定文件。

第一个进程正在休眠时,它正在锁定文件。

当第二个请求触发再次尝试写入文件的尝试时,它失败了(这是因为您没有测试成功而导致的失败),因此不会发生下一个+的写操作。