5

嗨,有谁知道如何避免/停止 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>";
}   
?>
4

3 回答 3

1

这是我写的一个小班(未测试)

<?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(); ?>

如果您有任何问题,请告诉我。

于 2013-07-27T12:57:36.577 回答
0

您可以将 PrisonerID 作为 MySql 表中的主键,这样就不允许重复。

于 2013-07-27T12:44:35.760 回答
0

就像您已经说过的那样,您需要向您知道不能有两个值的表中的字段添加一个 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/MySQL Workbench 或您喜欢的任何其他方法,当您插入新记录时,MySQL 将确保它遵守新约束。

另外,请注意,如果您想在查询中使用关键字,您仍然可以插入重复不能插入重复行,但可以使错误消息静音。请参阅插入文档IGNORE

另一种昂贵的方法是检查新记录是否还没有在数据库中。如果是,请不要插入它们,否则请插入。

action最后考虑在表单提交后从表单处理程序(表单中的 url)重定向。看这里

于 2013-07-27T12:45:15.860 回答