嗨,有人知道如何避免/停止php和html的重复插入吗?每当我刷新时,相同的数据都会重复,这不是我想要的。从这里我能改变什么吗?我听说添加UNIQUE INDEX可以避免/阻止它。也许它有效,但我放置错误,导致它无法工作。有什么帮助吗?提前感谢!!!我真的很感激!
<?php
session_start();
include("Validation.php");
$connect=mysqli_connect("localhost","root","","jailbird");
if(mysqli_error($connect))
{
die("Could not connect.");
}
if(isset($_POST["insert_click"]))
{
//Bookingid is auto increment, therefore no need
//$Bookingid=$_POST["BookingID"];
$Prisonerid=$_SESSION['Prisonerid'];
$Visiting_method=$_POST["VisitingMethod"];
$Visiting_location=$_POST["VisitingLocation"];
$Date=$_POST["Date"];
$Time=$_POST["Time"];
$query=$connect->prepare("insert into Booking(PrisonerID, VisitingMethod, VisitingLocation, Date, Time) values (?,?,?,?,?)");
$query->bind_param('sssss', $Prisonerid, $Visiting_method, $Visiting_location, $Date, $Time);
$query->execute();
}
$query=$connect->prepare("select * from booking WHERE Prisonerid=?");
$query->bind_param('s',$_SESSION['Prisonerid']);
$query->execute();
$query->bind_result($Bookingid, $Prisonerid, $Visiting_method, $Visiting_location, $Date, $Time);
while($query->fetch())
{
echo "<tr>";
//echo "<td width=60>".$Bookingid."</td>";
echo "<td>$Prisonerid</td>";
echo "<td>$Visiting_method</td>";
echo "<td>$Visiting_location</td>";
echo "<td>$Date</td>";
echo "<td>$Time</td>";
echo "</tr>";
}
?>
这是我写的一个小类(未测试)
<?php
class FormID {
private $lastFormID = "";
private $newFormID = "";
function __construct(){
$this->lastFormID = $_SESSION['__frmid__'];
$_SESSION['__frmid__'] = uniqid('sm');
$this->newFormID = $_SESSION['__frmid__'];
}
public function isFormDataValid(){
return (isset($_POST['__frmid__']) && $_POST['__frmid__']==$this->lastFormID);
}
public function FromIDHTML(){
return "<input type='"hidden'" name='"__frmid__'" value='"{$this->newFormID}'"/>";
}
}
?>
你可以像这个一样使用它
<?php
$frmid = new FormID();
if ($frmid->isFormDataValid()){
//do your insert here
}
?>
<form method="post">
<?php echo $frmid->FromIDHTML(); ?>
<input .... />
</form>
编辑:以下是如何在代码中使用它
更改
if(isset($_POST["insert_click"]))
{
至
$frmid = new FormID();
if(isset($_POST["insert_click"]) && $frmid->isFormDataValid())
{
在生成HTML表单的文件中,执行类似的操作
<form method="post">
<?php $frmid = new FormID(); echo $frmid->FromIDHTML(); ?>
<!--Below is your form with all the fields -->
<input type="text" name="VisitingMethod" />
</form>
注意,我刚刚在<?php $frmid = new FormID(); echo $frmid->FromIDHTML(); ?>
表格中添加了一行
如果你有任何问题,请告诉我。
您可以将PrisonerID作为MySql表中的主键,这样就不允许重复。
正如您已经说过的,您需要向表中不能有两个值的字段添加一个UNIQUE约束当你说maybe it works
时,意味着你还没有真正尝试过那种方法。除非你提供更多关于你是如何尝试的以及出了什么问题的细节,否则我们无能为力
为了使UNIQUE约束发挥作用,您需要选择表中的哪些字段唯一地表示每一行。例如,假设PrisonerId
唯一地表示每一行。然后,当您创建表时,您需要将UNIQUE
约束添加到PrisonerId字段,如下所示:
CREATE TABLE `Booking` (
`PrisonerId` int(10) NOT NULL,
`VisitingMethod` varchar(100) NOT NULL,
# Put other fields here #
UNIQUE KEY `uc_PrisonerId` (`PrisonerId`)
) ENGINE=InnoDB;
您可以在创建表时运行该查询,也可以ALTER
表以添加新约束,或者使用phpMyAdmin/MySQLWorkbench或您喜欢的任何其他方法,当您插入新记录时,MySQL将确保它遵守新约束。
此外,请注意,仍然可以插入重复行不能插入重复行,但如果您希望在查询中使用IGNORE
关键字,则可以静音错误消息。参见插入文档
另一种昂贵的方法是检查数据库中是否还没有新记录。如果是,不要插入,否则就插入。
最后考虑在表单提交后从表单处理程序(表单的action
中的url)重定向。请参阅此处