gpt4 book ai didi

php - 如何防止刷新时重复插入数据库?

转载 作者:行者123 更新时间:2023-11-29 10:31:20 24 4
gpt4 key购买 nike

我对 PHP 很陌生。我试图在这里找到适合我的代码的答案,但没有找到。

当我按 F5 时,表单中的最后一个插入会在数据库中复制自身。如何在不重定向到另一个页面的情况下阻止它?

我看到了一些关于$_SESSION的答案,但我不明白如何使用它。我很想得到一些关于更正代码的解释,谢谢。

PS,数据库连接在另一个文件中,如果您需要它来回答我,我会把它放在。

这是我的代码:

addToMembersList.php

<DOCTYPE html5>
<html>
<head>
<?php
include_once "db_connect.php";

$member=mysqli_query($mysqli,"select * from members");
?>
<style>
table,tr,td{
border: 1px solid black;
border-collapse: collapse;
}
</style>
</head>
<body>
<table>
<tr>
<td><b>First name</b></td>
<td><b>Last name</b></td>
<td><b>Email</b></td>
<td><b>Website</b></td>
<td><b>Comment</b></td>
<td><b>Gender</b></td>
</tr>
<?php
if($member){
while($row = $member->fetch_assoc()){ ?>
<tr>
<td><?php echo $row['first_name'];?></td>
<td><?php echo $row['last_name'];?></td>
<td><?php echo $row['email'];?></td>
<td><?php echo '<a href="'.$row['website'].'">'.$row['website'].'</a>';?></td>
<td><?php echo $row['comment'];?></td>
<td><?php echo $row['gender'];?></td>
<td><button type="submit" onclick="deleteMember.php" value="$row['id']">Delete</button></td>
</tr>
<?php }
}?>
</table>
</body>
</html>



$query = "insert into members (first_name, last_name, email, website, comment, gender) values ('%s', '%s', '%s', '%s', '%s', '%s')";
$query = sprintf($query,$_POST['fName'], $_POST['lName'], $_POST['email'], $_POST['website'], $_POST['comment'], $_POST[$gender_select]);
$result = $mysqli ->query($query);
}
}

?>

index.php

<DOCTYPE html5>
<html>
<head>
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script>
function loadmembersList(response,textStatus,jqXHR){
request = $.ajax({
url:"memberListRequest.php",
type:"get"
})
request.done(function(response,textStatus,jqXHR){
$("#member_list").html(response);
});
}
$( document ).ready(loadmembersList);
</script>
</head>
<body>
<form action="", method="POST">
First name:<input type="text" name="fName">
<br>
Last name:<input type="text" name="lName">
<br>
Email:<input type="text" name="email">
<br>
Website:<input type="text" name="website">
<br>
Comment:<input type="textarea" name="comment" placeholder="your text here">
<br>
Gender:<input type="radio" name="Male"> Male <input type="radio"
name="Female"> Female <input type="radio" name="Other"> Other
<br>
<input type="submit">
</form>
<div id="member_list"></div>
</body>
</html>

最佳答案

常见的解决方案是使用 post-redirect-get 模式。从用户收集数据的表单发布到执行数据库操作的脚本,然后通过 302 重定向响应到显示结果的页面。这样做的缺点是,它需要至少连续 2 次往返服务器才能导航到下一页。

正如其他人所指出的,您的代码受 sql injection 的约束,但考虑到您所描述的行为,它也容易受到 cross site request forgery 的影响。 。 csrf token 可用于检测重复提交。

设置合适的主键/唯一索引并忽略重复提交将防止创建重复记录。

当用户使用 JavaScript 点击提交按钮时,还可以在表单内设置一个标志。然后仅在参数中设置了标志时才执行插入 - 但不要忘记针对禁用 javascript 的情况做好计划。

另一种解决方案是在 ajax 请求中发送数据到服务器端,而不是作为页面导航事件。

可能还有更多解决方案。

关于php - 如何防止刷新时重复插入数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47358299/

24 4 0
文章推荐: javascript - 基于 cucumber 标签切换 multiCapabilites 配置
文章推荐: ios - 一个应用程序可以使用 startMonitoringForRegion 注册多少个 UUID?
文章推荐: javascript - 警告 : validateDOMNesting(. ..):
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com