发送给付款处理器的重复ID

时间:2012-10-15 16:12:12

标签: php mysql transactions oscommerce

以下是该方案。此表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 个答案:

答案 0 :(得分:1)

my answer to your last question中所述:

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

  2. 将相关详细信息插入orders表,省略提供id(MySQL将自动为您生成一个,通过使用锁保证其唯一性。)

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

  4. 发送给您的付款处理商。

答案 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(我很惊讶它仍然存在:)但你基本上有两种可能性:

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

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