iT邦幫忙

0

[php] 訂單流水號

php

各位大大好:

想請問讓客戶登入帳密即產生一個訂單編號,如用下面的程式,因為怕重複,是否需要馬上將流水編號寫入暫存資料表(但若客戶未完成訂單,流水編號就要從資料庫刪除..刪除的方法目前想到若客戶有填完單寫入正式資料表有流水編號跟暫存資料表的流水編號比對,若沒有對到號的流水編號就刪除..可是這樣好像也會有問題比如有人已產生流水號但較慢送出完整資料..)

謝謝

function writeMsg() {
$hostdb='127.0.0.1';
$namedb='survey';
$userdb='root';
$passdb='!';
$conn= new PDO("mysql:host=$hostdb;dbname=$namedb",$userdb,$passdb);
//echo'資料庫伺服器連線及資料庫開啟成功';
$conn->exec("SET CHARACTER SET utf8");
$taiwan_year = date('Y')-1911;
$sqnumber=$taiwan_year.substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 7);
$sql="SELECT * FROM 108u where sqnumber= ?";
$result = $conn->prepare($sql);
$result->execute(array($sqnumber));
$result2=$result->fetch(PDO::FETCH_OBJ);
if ($result2){
echo writeMsg();
}
else{
echo $sqnumber;
}
}
moonfish iT邦新手 5 級 ‧ 2019-10-09 10:02:15 檢舉
插入資料的同時,再新增訂單編號,就比較不會有訂單編號重複的問題

2 個回答

3
小魚
iT邦高手 1 級 ‧ 2019-10-09 10:22:17
最佳解答

登入帳密即產生一個訂單編號

還有這種機制,
通常是要插入的時候再產生編號就好了,
如果怕衝到可以使用transaction.

mayyola iT邦新手 2 級 ‧ 2019-10-09 10:37:55 檢舉

那應該是完整填單後,再寫入流水號是嗎? 謝謝

小魚 iT邦高手 1 級 ‧ 2019-10-09 11:14:24 檢舉

因為我還要接金流,
通常我會在對方確認訂單之後先寫一筆,
但是狀態記為未付款,
(狀態可能有很多, 看需求)
等到金流回傳之後,
看結果如何再去改狀態,
然後後台會根據不同的狀態來決定訂單處理的方式,
也可能只處理 付款完成 的訂單.

0
程式狗
iT邦新手 4 級 ‧ 2019-10-09 10:38:58

我認為與其將未成功的訂單單號刪除,不如保留已產生訂單編號然後寫一個資料庫欄位另外辨識就好,如A20191009001已經產生,附加一個資料庫欄位為is_done預設為0,若真的完成整筆訂單就將is_done改為1,這樣做要取得最新的訂單編號也相對簡單。

mayyola iT邦新手 2 級 ‧ 2019-10-09 10:47:12 檢舉

這也是好方法,但是先產生跟寫入流水編號,好像真的後續會有重複使用問題..剛好正在寫卻沒寫入的用編號1,後面有使用者產生編號比對發現編號1沒寫入,又將編號1拿去用..似乎是產生訂單再產生編號比較好的樣子..

程式狗 iT邦新手 4 級 ‧ 2019-10-09 11:37:17 檢舉

若擔心重複單號的問題可參考這篇文章我的回答

每一小時的訂單流水號?

mayyola iT邦新手 2 級 ‧ 2019-10-12 20:15:30 檢舉

謝謝您

我要發表回答

立即登入回答