如何避免/停止php和html的重复插入


how to avoid/stop duplicate insertion for php and html?

嗨,有人知道如何避免/停止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)重定向。请参阅此处