我正在为我的公寓创建一个预订系统。 所以我想防止预订中的日期重叠(所以我最终不会在同一天预订2次)
1.Fist我有这个"无法发布图片"表单和日历页面供用户输入和提交btn。(我可以在提交按钮之前防止天数重叠)。
2.第二个确认页面"所有输入信息都有效,日期也有效"和最终提交按钮(也可以防止天重叠)。
我的问题是:如果2个预订同时发生(几秒差异,例如,他们两个都在第二页,只需点击一次远离预订)我就不能防止重叠因为这两个预订都没有数据库和我的检查功能只比较数据库中的日期。
所以我需要一些东西让一个sql插入一次或者我不知道会使用sql事务帮助还是有办法检查数据库中的重叠但是怀疑最后的事情是可能的。
//MY SQL RESERVATION INSERT METHOD "CALSS METHOD"
public function insert_korisnik() {
$conn = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
$sql = "INSERT INTO rezervacije (dolazak,odlazak,apartman,status) VALUES (:dolazak,:odlazak,:apartman,0)";
$st = $conn->prepare ( $sql );
$st->bindValue( ":dolazak", $this->dolazak->format('Y-m-d H:i:s'), PDO::PARAM_STR );
$st->bindValue( ":odlazak", $this->odlazak->format('Y-m-d H:i:s'), PDO::PARAM_STR );
$st->bindValue( ":apartman", $this->apartman, PDO::PARAM_STR );
$st->execute();
$this->id = $conn->lastInsertId();
$sql = "";
$sql = "INSERT INTO gost (id_rezervacije, ime_prezime, adresa, kontakt, datum_rezervacije) VALUES (:id_rezervacije, :ime_prezime, :adresa, :kontakt, :datum_rezervacije)";
$st = $conn->prepare ( $sql );
$st->bindValue( ":id_rezervacije", $this->id, PDO::PARAM_INT );
$st->bindValue( ":ime_prezime", $this->ime_prezime, PDO::PARAM_STR );
$st->bindValue( ":adresa", $this->adresa, PDO::PARAM_STR );
$st->bindValue( ":kontakt", $this->kontakt, PDO::PARAM_STR );
$st->bindValue( ":datum_rezervacije", $this->datum_rezervacije->format('Y-m-d H:i:s'), PDO::PARAM_STR );
$st->execute();
$conn = null;
}
//PHP INSERTING FUNCTION
function addReservation() {
$results=$_POST;
$results['pageTitle'] = "Nova rezervacija";
$results['formAction'] = "newReservation";
if ( isset( $_POST['saveChanges'] ) ) {
$reservation = new rezervacija_osoba;
$reservation->storeFormValues_korisnik( $_POST );
if($reservation->last_date_check()){ //CALL TO FUNCTION TO CHECK DATES BEFORE INSERTING "ONLY COMPARES DATES THAT ARE ALREADY IN DB"
$reservation->insert_korisnik(); // CALL TO SQL INSERT "POSTED CODE UP"
$email_info=$_POST['email'];
$comment_info=$_POST['comment'];
send_email($reservation,$email_info,$comment_info);
require( TEMPLATE_PATH . "/include/rezervirano.php" );}
else{
$error="Looks like another reservation took place during yours that booked same days, to prevent days overllaping please go back and make another reservastin. Thanks";
display_warning($error);
}
} elseif ( isset( $_POST['cancel'] ) ) {
// CANCEL PRESSD
header( "Location: index.php" );
} else {
require( TEMPLATE_PATH . "/include/potvrda.php" );
}
}