<?php
//優化方案:將庫存字段number字段設爲unsigned,判斷庫存字段number減去購買量時,當庫存小於0,將會返回false
include('./mysql.php');
$username = 'wang'.rand(0,1000);
//生成唯一訂單
function build_order_no(){
return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
}
//記錄日誌
function insertLog($event,$type=0,$username){
global $conn;
$sql="insert into ih_log(event,type,usernma)
values('$event','$type','$username')";
return mysqli_query($conn,$sql);
}
function insertOrder($order_sn,$user_id,$goods_id,$sku_id,$price,$username,$number)
{
global $conn;
$sql="insert into ih_order(order_sn,user_id,goods_id,sku_id,price,username,number)
values('$order_sn','$user_id','$goods_id','$sku_id','$price','$username','$number')";
return mysqli_query($conn,$sql);
}
//模擬下單操作
//庫存是否大於0
$sql="select number from ih_store where goods_id='$goods_id' and sku_id='$sku_id' ";
$rs=mysqli_query($conn,$sql);
$row = $rs->fetch_assoc();
if($row['number']>0){//高併發下會導致超賣
if($row['number']<$number){
return insertLog('庫存不夠',3,$username);
}
$order_sn=build_order_no();
//庫存減少
$sql="update ih_store set number=number-{$number} where sku_id='$sku_id' and (number-{$number})>=0";
$store_rs=mysqli_query($conn,$sql);
if($store_rs){
//生成訂單
insertOrder($order_sn,$user_id,$goods_id,$sku_id,$price,$username,$number);
insertLog('庫存減少成功',1,$username);
}else{
insertLog('庫存減少失敗',2,$username);
}
}else{
insertLog('庫存不夠',3,$username);
}
?>