2012-10-15 16 views
0

以下是方案。此表訂單有一個名爲orders_id的auto_increment列。該表使用InnoDB存儲引擎。 (這不是在訂單表中插入新記錄,其關於如何避免發送重複的ID給處理器)發送到付款處理器的重複ID

orders_id  cust_id  name  address 
100    55   abc  123 street  
101    12   def  456 street 

對於下一個訂單,我計算了下一個可用Orders_id像這樣

$new_order_id_query = "SHOW TABLE STATUS LIKE ORDERS"; 
$result = tep_db_query($new_order_id_query); 
$row = tep_db_fetch_array($result); 
$new_order_id = $row['Auto_increment']; 

然後我收集如姓名,地址等信息,items_ordered ......並將其發送給付費處理器這樣

102    44   xyz   44 Street 

的問題是只有有時當有兩個或更多的訂單在同一時間,我最終發送兩個訂單相同orders_id到付款處理器。

問題是如何確保我不會將重複的Orders_id發送到付款處理器?

我被建議使用last_insert_id(),它可能是對的或錯的,但我不知道我可以如何實現它。

我讀過關於鎖定表 - 這是一個交易環境和InnoDB的好主意嗎?如果是的話,我該如何執行它?

+1

將數據插入到具有掛起狀態的表中,然後在處理完成後更新它。這樣,您的訂單總是與實際條目相關聯。 – Waygood

+1

我有點困惑,如果它是自動增量,爲什麼你計算ID?您是先添加到訂單表然後將其發送到付款處理器?如果是這樣,那麼是使用last_insert_id()。 – MatthewMcGovern

+0

這是怎麼一回事? a)您從未使用過AUTO_INCREMENT,並且不知道如何b)您想爲將來的插入預訂訂單ID? c)其他 –

回答

1

my answer to your last question解釋:

  1. 收集姓名,地址,items_ordered等

  2. 插入相關的細節進orders表,省略提供一種id(MySQL將自動產生一個對你來說,通過使用鎖來保證它的獨特性)。

  3. 從MySQL獲取生成的id,方法是詢問last_insert_id(實際的函數調用將取決於您的驅動程序)。

  4. 發送到您的付款處理器。

+0

好吧,我明白但是訂單被支付處理器拒絕了嗎?那意味着它不應該在訂單表中。但通過這些步驟,訂單在評估之前已經在訂單表中。 –

+0

@ManishPradhan:然後,在'orders'表中標記爲被拒絕,或者將其刪除(在業務邏輯中適當)。 – eggyal

+0

現在確實有道理,但出於好奇,有什麼辦法可以在任何插入之前獲得下一個ID? –

0

auto_increment列通常不需要在代碼中進行操作。當您插入用auto_increment定義的新記錄列時會自動遞增。

last_insert_id用於獲取分配給連接上下文中自動遞增字段的值。

我不會在你的案例中推薦鎖定表,因爲你在問題陳述中沒有提供任何理由。

0

您不需要計算下一個訂單ID是什麼。當您向該表中插入一行時,自動增量會自動爲您提供下一個ID。這是它的全部重點。

您只需運行一個插入,將所有其他信息放入表中,而不指定auto_increment字段的值。

"INSERT INTO Orders (cust_id, name, address) VALUES (55, 'me', 'My House')" 

如果你想找出什麼ID順序爲您剛插入的行,只需調用LAST_INSERT_ID()的查詢結果。我不知道tep_db是什麼,因爲它不是我用過的,但我認爲你需要功能tep_db_insert_id()

+0

但我沒有做一個插入語句。這就是最後的結果。我只是需要在下一個值開始發送到處理器。 –

0

我正在計算ID,因爲我需要在實際插入前將其發送到付款處理器。

你提到的所有技術要求你打開一個數據庫連接並保持打開不同的HTTP請求之間(而你阻止其他腳本情況下使用它),這樣可以從一個單一的數據庫會話中受益。沒有可靠的方法來做到這一點。

我還沒有跟自從工作的年齡(我很驚訝,它仍然存在:)但你基本上有兩種可能性:

  • 插入實際的順序通常的方式,而是將其標記爲待定。
  • 在另一個表格中插入預訂(可能由您設計)。

老實說,我認爲您需要在重定向到支付網關之前保存訂單。如果您信任會話數據,您遲早會失去訂單;你會失去支付訂單,這是更糟糕的。