2017-01-07 7 views
0

Я пытаюсь сгенерировать билеты на штрих-коды после успешного бронирования, и он отлично работает. Но вчера (06-янв-2017) в 11.59 вечера один клиент заказал 2 билета, но билет sl.no был дублированным. Tthat как билеты 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

Звучит как состояние гонки с дБ. Но я не знаю достаточно php для разбора, где бы это ни было. – Aaron

+0

@ Арон, я не понимаю, что вы на самом деле имеете в виду по состоянию гонки с db. Не могли бы вы дать мне пример или любую ссылку, чтобы проверить его? – Amiyar

+0

http://stackoverflow.com/questions/34510/what-is-a-race-condition. Одновременно на ваш сервер одновременно приходили два запроса и обрабатывались двумя разными потоками. Эти два потока участвуют в гонке друг за другом. – Aaron

ответ

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; 
} 

Спасибо, ребята, за помощь. В следующий раз я попытаюсь сделать мой код более читаемым. :)

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; 

и используя этот счет, чтобы установить номер СЛ. Но время между чтением счета и записью записи. Когда два потока читают счет одновременно, вы получаете свою проблему.

+0

спасибо @ Аарон, есть ли решение для решения этой проблемы. – Amiyar

+0

У меня есть решение. спасибо @Aaron – Amiyar