如何使用php在mysql中购买门票预订系统?

时间:2015-04-21 09:25:56

标签: php mysql

两个有问题的情景:

  • 如果2个用户想要购买1张票并且1张票有库存怎么办?
  • 如果3个用户想要购买1张票并且2张票有库存怎么办?

我希望能够在付款网关中“预订”门票。这意味着门票仍然没有购买,但目前保留给相关用户,这样当第一个用户仍在付款过程中时,没有其他用户可以购买。

我的数据库中有两个表:

1。 Ticket_type_id:包含一种故障单

  • ticket_type-ID
  • 名称
  • 描述
  • stock_remaining

2. Ticket_purchased:包含所有购买的门票

  • TICKET_ID
  • ticket_type_id
  • USER_ID

购买机票时,应该从&stock; stock_remaining'中减少正确的金额。当此人在支付网关时保留。只有在付款成功后,才能在第二个表格中创建所有票证,并从“stock_remaining”中扣除。是最后的。


到目前为止,我想出了以下流程(我的尝试代码):

当用户点击“结帐”时,会启动 PHP会话。 PHP在数据库中开始交易。此交易从门票库存总额中扣除,并为给定用户生成门票,但未提交

如果以下任何查询失败,整个交易将被回滚会话已关闭,系统会向用户显示错误消息。但是,如果成功,支付网关将打开

网关完成后,付款成功,用户从网关返回我使用排球将成功参数发送到正在运行的会话。如果Transaction提交成功,则返回。

session_start(); 
    $response = array();
    begin(); // transaction begins

if (isset($_POST['ticketTypeId']) && isset($_POST[‘ticketQuantity’]) && isset($_POST['userId'])){

$ticketTypeId = $_POST['ticketTypeId'];             
$ticketQuan = $_POST['ticketQuantity'];
        $userId= $_POST['userId'];

    $query1 = check if quantity required is available   
    $query2 = deduct quantity from total remaining
ForLoop(ticket quantity){
$query3 = generate one ticket for user
}

    if(!success){
        // On SUCCESS
        $response["success"] = 1;
            echo json_encode($response);
    }else{
        // On Failed
        $response["success"] = 0;
            echo json_encode($response);

            rollback(); // transaction rolls back
        exit;
}   
}


if (isset($_POST['Transaction'])){

$transaction =  $_POST['Transaction'];
    if($transaction == 1){ 
        // On Success
        $response["success"] = 1;
            echo json_encode($response);
         commit(); // transaction is committed
         exit; 
    }else{
        // On Failed
        $response["success"] = 0;
            echo json_encode($response);
        rollback(); // transaction rolls back
                exit;
    }
}

我不知道如何重新连接到会话,因此我不知道这是否有效。

1 个答案:

答案 0 :(得分:0)

对于出售1张票的问题情况,2请求它,你可能想要在有人把它放入购物车后锁定1张票或/并且你可以在MySQL上使用交易。

同样的问题发生在信用卡上。当两辆车试图同时拉出最大信用额度时。只有第一个获得服务..希望;)