2013-07-27 2 views
5

Привет, кто-нибудь знает, как избежать/остановить повторную вставку для php и html? Всякий раз, когда я обновляюсь, повторяются одни и те же данные, которые я не хочу. Есть ли что-то, что я могу изменить здесь? Я слышал, что добавление UNIQUE INDEX может избежать/остановить его. Возможно, это работает, но я ошибаюсь, что делает его невозможным. Любая помощь? Заранее спасибо!!! Будем очень благодарны!Как избежать/прекратить повторную вставку для php и html?

<?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>"; 
} 
?> 
+0

Должно ли это быть защищено? –

+0

Вы также можете управлять им с помощью PHP, например: установить сеанс после вставки '$ _SESSION ['insert'] = 'yes'', а затем добавить его как проверку на' if (isset ($ _ POST ["insert_click"]) && $ _SESSION ['insert']! = 'Yes') ' –

+0

Плюс этот вопрос задан, [См. Здесь] (http://stackoverflow.com/questions/2133964/how-to-prevent-multiple-inserts -when-submitting-a-form-in-php) –

ответ

0

Вы можете сделать PrisonerID основным ключом в своей таблице MySql таким образом, чтобы дубликаты не были разрешены.

+0

Но арестованный для пользователя исправлен – stupidgal

+0

Да, поэтому он уникален. Вы можете обновить любую новую информацию, но не можете добавить новую запись с тем же идентификатором PrisonerID. – Nareg

+0

Нет. Я имею в виду .. Пользователь, у которого есть только 1 заключенный. Таким образом, каждая запись, которую пользователь вводит, будет использовать тот же самый заключенный – stupidgal

0

Как вы уже сказали, вам нужно добавить ограничение UNIQUE в поле в вашей таблице, которое, как вы знаете, не может иметь двух значений. Когда вы говорите maybe it works, это означает, что вы действительно не пробовали этот метод. И мы не можем помочь, если вы не дадите более подробную информацию о том, как вы это пробовали, и что пошло не так.

Для того чтобы ограничение UNIQUE работало, вам нужно выбрать, какие поля в таблице уникально представляют каждую строку. Например, предположим, что PrisonerId однозначно представляют каждую строку. Затем, когда ваш создать таблицу, которую нужно добавить UNIQUE contraint в поле 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 таблицу, чтобы добавить новый contraint или использовать PhpMyAdmin/MySQL Workbench или любой другой метод, который вы предпочитаете, и когда вы вставляете новую запись, MySQL будет следить за тем, чтобы она соответствовала новому ограничению.

Кроме того, обратите внимание, что вы все еще можете вставить дубликат. не может вставлять повторяющиеся строки, но может отключать сообщения об ошибках, если вы хотите использовать ключевое слово IGNORE в своем запросе. See insert documentation

Другой подход, и дорогостоящий, будет проверять, нет ли новых записей в базе данных еще. Если они есть, не вставляйте их, иначе делайте.

Наконец, рассмотрите возможность перенаправления из обработчика формы (URL-адрес в action формы) после отправки формы.See here

+0

На самом деле, я попробовал. Но с других сайтов это ALTER, а затем UNIQUE. Поэтому я попробовал $ query = $ connect-> prepare («вставить UNIQUE в значения« Бронирование »(PrisonerID, VisitingMethod, VisitingLocation, Date, Time) (?,?,?,?,?)»); и $ query = $ connect-> подготовить («вставить в список« УНИКАЛЬ »(PrisonerID, VisitingMethod, VisitingLocation, Date, Time) значения (?,?,?,?,?) "); – stupidgal

+0

Я сказал, что это может сработать, потому что я знаю, что это неправильно, поэтому я сказал, что это может работать, но не так. – stupidgal

+0

@stupidgal Не пытайтесь изменить сама схему. Я обновляю ответ, чтобы проиллюстрировать. :-( –

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> 

Edit:Вот как использовать это в ваш код

изменить

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

Сообщите мне, если у вас возникли проблемы.

+0

Спасибо для этого .. Но я действительно не знаю, как вписаться в мое кодирование. Но все в порядке. – stupidgal

 Смежные вопросы

  • Нет связанных вопросов^_^