0

这是场景。此表 Orders 有一个名为 orders_id 的 auto_increment 列。该表使用 InnoDB 存储引擎。(这不是关于在 Orders 表中插入新记录,而是关于如何避免向处理器发送重复的 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 来说是个好主意吗?如果是这样,我该如何实施?

4

4 回答 4

1

正如我对您上一个问题的回答中所解释的:

  1. 收集姓名、地址、items_ordered 等。

  2. 在表中插入相关细节orders,省略提供id(MySQL会自动为你生成一个,通过使用锁保证其唯一性)。

  3. id通过询问从 MySQL获取生成的内容last_insert_id(实际的函数调用将取决于您的驱动程序)。

  4. 发送到您的付款处理器。

于 2012-10-15T16:27:50.923 回答
0

auto_increment 列通常不需要在您的代码中进行操作。当您插入用 auto_increment 定义的新记录列时,它会自动递增。

last_insert_id 用于获取分配给连接上下文中自动递增字段的值。

在您的情况下,我不建议锁定表,因为您在问题陈述中没有提供任何理由这样做。

于 2012-10-15T16:19:56.743 回答
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()

于 2012-10-15T16:35:10.667 回答
0

我正在计算 ID,因为我需要在实际插入之前将其发送到支付处理器。

您提到的所有技术都要求您打开数据库连接并在不同的 HTTP 请求之间保持打开状态(同时阻止其他脚本实例使用它),以便从单个数据库会话中受益。没有可靠的方法可以做到这一点。

我已经很久没有与 osCommerce 合作了(我很惊讶它仍然存在 :) 但你基本上有两种可能性:

  • 以通常的方式插入真实订单,但将其标记为待处理。
  • 在另一个表中插入预订单(可能由您设计)。

老实说,我认为您需要在重定向到支付网关之前保存订单。如果您信任会话数据,您迟早会丢失订单;你会失去已付款的订单,这更糟。

于 2012-10-15T16:58:53.963 回答