我在预订成功后尝试生成条形码票,并且工作正常。但是昨天(2017年1月6日至2017年)晚上11点59分,一位顾客预订了2张门票,但门票sl.no是重复的。这两张票都是sl.no是1
。实际上它应该是2
。但是下一个客户的门票sl.no是正确的,它是3,4,5
。下面的代码中是否有错误产生故障单?
for($j=1;$j<=$cat_array[$i];$j++) {
$sel_max_dt = mysql_query("select MAX(DT) AS maxdt, MAX(REC_NO) AS maxrec FROM tkt_barcode");
//to select max date and max rec no.
$row_max_dt = mysql_fetch_array($sel_max_dt);
$dt_max = $row_max_dt['maxdt'];
//$no_max = $row_max_dt['maxno'];
$recno = $row_max_dt['maxrec'];
if($dt_max == date("Y-m-d") && $recno == $TxnID) {
//if same date and same bkid barcode slno continues.
$sel_no = mysql_query("select MAX(BARCODE_SLNO) AS maxno FROM tkt_barcode WHERE REC_NO=".$TxnID);
$row_sel_no = mysql_fetch_array($sel_no);
$tkt_slno = $row_sel_no['maxno'];
$tkt_slno = $tkt_slno + 1;
}
if($dt_max == date("Y-m-d")&& $recno != $TxnID) {
//if same date and different bkid barcode slno continues.
$sel_no = mysql_query("select MAX(BARCODE_SLNO) AS maxno FROM tkt_barcode WHERE DT='$dt_max' ");
$row_sel_no = mysql_fetch_array($sel_no);
$tkt_slno = $row_sel_no['maxno'];
$tkt_slno = $tkt_slno + 1;
}
if($dt_max != date("Y-m-d") && $recno != $TxnID) {
//if not same date start barcode slno from 1.
$tkt_slno = 1;
}
$sel_sl_no = mysql_query("select MAX(SL_NO) AS slno FROM tkt_barcode WHERE REC_NO=".$TxnID);
$row_slno = mysql_fetch_array($sel_sl_no);
$slno = $row_slno['slno'];
$bartkt_slno = $slno + 1;
if($i==1 && $j>$count_promo_adult && $arr_edit["PROMO_CODE"]!=""){
//adult cat and total adult count > total promo adult count
$disc_adult = $adult_amt;
$discamt=$adult_amt - $disc_adult ; // discount amt
$rate=$adult_amt; //normal rate
$net_amt=$disc_adult; //discount rate
$pro_cd ="";
//promo code is null when total adult count > total promo adult count
} //end if
//string pading digits
$len_txn =strlen($TxnID); // bookid length
$pad = 6; //str_pad digits
if($len_txn > 5) {
if($len_txn==6) { $pad = $pad-1;}// if 6 digit
if($len_txn==7){ $pad = $pad-2;}// if 7 digit
}
$fullbar = $TxnID.str_pad($tkt_slno, $pad, 0, STR_PAD_LEFT).$clnd_date.$counter_no;
//barcode no
$fields = "BARCODE_SLNO,DT,FIN_YEAR,Counter_Code,Branch_cd,REC_NO,BARCODE,TICKET_TYPE,CATG_CD,AMT,DISC_AMT,SL_NO,NET_AMT,BCODE_CATG_SLNO,BCODE_SLNO_GEN,BCODE_SLNO_CATG_TOT,DAY_TYPE,Check_in_date,PROMO_CODE,TAX,S_TAX,conv_base_rate,conv_tax_rate";
$values = "'$tkt_slno','$booked_date','$fin_year','$counter_no','$branch','$TxnID','$fullbar','$cat_name_tkt','$i','$rate','$discamt','$bartkt_slno','$net_amt','$j','$count','$cat_tot','$type_day','$date_check','$pro_cd','$tax_each','$ser_tax_each','$conv_base','$conv_tax'";
$sql_tkt = $objA->insert_fields(TABLEPREFIX.'tkt_barcode',$fields,$values);
}//end for loop
答案 0 :(得分:0)
您正在选择现有记录的数量
$sel_sl_no = mysql_query("select MAX(SL_NO) AS slno FROM tkt_barcode WHERE REC_NO=".$TxnID);
$row_slno = mysql_fetch_array($sel_sl_no);
$slno = $row_slno['slno'];
$bartkt_slno = $slno + 1;
并使用该计数来设置您的sl号码。但是,在读取计数和写入记录之间会有一段时间。当两个线程同时读取计数时,您就会遇到问题。
答案 1 :(得分:0)
最后,我通过添加下面给出的另一个条件找到了解决方案。
if($dt_max != date("Y-m-d")&& $recno == $TxnID) {
//if different date and same bkid barcode slno continues.
$sel_no = mysql_query("select MAX(BARCODE_SLNO) AS maxno FROM tkt_barcode WHERE DT='$dt_max' ");
$row_sel_no = mysql_fetch_array($sel_no);
$tkt_slno = $row_sel_no['maxno'];
$tkt_slno = $tkt_slno + 1;
}
谢谢大家的帮助。我将尝试使我的代码下次更具可读性。 :)