有没有办法区分页面刷新和按下提交按钮?

Is there a way to differentiate between a page refresh and pushing a submit button?

我有一个表单,当使用按钮提交时,它会向 SQL 数据库添加一个项目。但是,问题是如果我在提交后刷新页面,它会向该数据库添加另一个相同的项目。有什么方法可以判断用户何时按下按钮以及何时刷新页面?我知道我可以检查每个条目以查看它是否与已提交的条目相同,但是我已经在其他程序中遇到过类似的问题,如果我不必每次都创建一个新的解决方法,我将不胜感激.

参考代码:


<input type="text" name="var1" required>
<input type="text" name="var2" required>
<input type="text" name="var3" required>
<input type="submit" name="Submit" value="Submit">
</form>
<?php
if($_POST && isset($_POST['Submit'])) {
    $conn = mysqli_connect("localhost", "root",""); 
    mysqli_select_db ($conn,'database'); 
    $var1 =$_POST['var1'];
    $var2 = $_POST['var2'];
    $var3 = $_POST['var3'];
    $sql = "INSERT into database (var1,var2,var3) VALUES ('$var1','$var2','$var3')";
    if ($result = mysqli_query($conn, $sql)) { 
        echo("Item Added Sucessfully");
    }
}
?>

尝试确定页面是否正在刷新不是解决此问题的方法。您需要做的是防止浏览器重新提交相同的表单提交。

Post/Redirect/Get pattern 解决了这个问题。基本上,在处理完表单后,您希望使用 HTTP 303 重定向将用户重定向到您希望他们看到的页面。这告诉浏览器替换浏览器历史记录中的表单页面,从而无法重新提交表单。

您的代码可能如下所示:

<input type="text" name="var2" required>
<input type="text" name="var3" required>
<input type="submit" name="Submit" value="Submit">
</form>
<?php
if($_POST && isset($_POST['Submit'])) {
    $conn = mysqli_connect("localhost", "root",""); 
    mysqli_select_db ($conn,'database'); 
    $var1 =$_POST['var1'];
    $var2 = $_POST['var2'];
    $var3 = $_POST['var3'];
    $sql = "INSERT into database (var1,var2,var3) VALUES ('$var1','$var2','$var3')";
    if ($result = mysqli_query($conn, $sql)) { 
        header('Location: thankyou.php', true, 303);
        exit;
    }
}

仅供参考,请阅读有关 SQL injection. Instead of building queries with string concatenation, use prepared statements with bound parameters. See this page and this post 的一些很好的例子。