以下是该方案。此表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来说是个好主意吗?如果是这样,我该如何实现呢?
答案 0 :(得分:1)
如my answer to your last question中所述:
收集姓名,地址,items_ordered等
将相关详细信息插入orders
表,省略提供id
(MySQL将自动为您生成一个,通过使用锁保证其唯一性。)
通过询问id
来获取MySQL生成的last_insert_id
(实际函数调用将取决于您的驱动程序)。
发送给您的付款处理商。
答案 1 :(得分:0)
auto_increment列通常不需要在代码中进行操作。当您插入使用auto_increment定义的新记录列时,会自动递增。
last_insert_id用于获取分配给连接上下文中自动递增字段的值。
我不建议在您的案件中使用锁定表,因为您在问题陈述中没有提供任何理由。
答案 2 :(得分: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()
。
答案 3 :(得分:0)
我正在计算ID,因为我需要在实际插入之前将其发送到付款处理方。
您提到的所有技术都要求您打开数据库连接并在不同的HTTP请求之间保持打开(当您阻止其他脚本实例使用它时),这样可以从单个数据库会话中受益。没有可靠的方法可以这样做。
我已经多年没有使用osCommerce(我很惊讶它仍然存在:)但你基本上有两种可能性:
老实说,我认为您需要在重定向到支付网关之前保存订单。如果您信任会话数据,您迟早会丢失订单;并且你将失去支付的订单,这更糟糕。