php mysql pdo拍卖竞标

时间:2013-03-11 07:36:45

标签: php mysql pdo

我正在使用php mySQL(MyISAM)和PDO使用两个表开发一个带限制或最高出价场景的拍卖系统

拍卖

 Id   | title | seller  |  currentbid   |  limit(max bid)   |  dated | bidder

出价

 Id  | auctionid | bid  | bidder | dated

用户出价后,会发生以下情况(我正在使用PDO预处理语句)

 $record = fetch (‘Select * from auction where id = :id’, array(‘id’ => $id))
 $increment = 1;
 $postedBid = $_REQUEST[‘postedBid’];
 $currentBid = $record[‘currentbid’];
 $limitBid = $record[‘limit’];

 If($postedBid < $currentBid + $increment){
    Return;(without processing bid!)
 }else{
    If($limitBid !> $postedBid){
       Insert into bids (auctionid, bid, bidder, dated(timestamp)) values ($auctioned, $postedBid, ……);

       Update auction set currentbid = $postedBid, limit = $postedBid ….

       }else{

       Insert into bids (auctionid, bid, bidder, dated(timestamp)) values ($auctioned, $postedBid, ……);

       Insert into bids (auctionid, bid, bidder, dated(timestamp)) values ($auctioned, $postedBid + $increment, ……);

       Update auction set currentbid = $postedBid + increment, limit = $limitBid ….
      }
  }

我想知道两件事

1-如果这种方法没问题,我该如何改进呢?

2-如何避免并发出价。我不知道如何使用PDO应用锁。使用锁或任何其他方法来感知任何示例查询来处理此问题

谢谢

(使用混合类型代码的道歉)

1 个答案:

答案 0 :(得分:0)

我认为你需要在MySQL的商店程序中执行此操作,只需返回成功/失败消息。

您需要将代码更改为:

If($postedBid < $currentBid + $increment){
   Return;(without processing bid!)
} else {
   $stmt = $db->prepare("CALL update_bid(?,?, ...)");
   $stmt->execute(array($parameter1, $parameter2, ...));
}

保持对代码的检查以帮助防止不必要的db调用,存储过程只会帮助确保没有并发问题。