有没有办法区分页面刷新和按下提交按钮?
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 的一些很好的例子。
我有一个表单,当使用按钮提交时,它会向 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 的一些很好的例子。