5

我正在使用 PHP 和 MySQL 开发一个简单的发票系统。
我最初的想法是使用 ID(自动递增)作为发票 ID。但这行不通。

当用户向我的支付服务提供商提交订单时,会创建一张临时发票。如果交易失败,我需要删除临时发票。

问题是发票已经创建并提供了 ID - 根据法律,我不允许删除任何已提供发票编号的发票。所以我需要添加另一列'invoice_id'并在成功交易后添加一个ID。

多个用户可以同时进行购买。

我的问题是,如何确保检索最后创建的发票 ID 并增加它?

我应该使用 a$_SESSION[]来存储invoice_id吗?或者我应该从数据库中检索最新的 ID?如果从数据库中检索,我应该为这个事务锁定表吗?

非常感谢任何指导。

4

4 回答 4

5

为尚未处理的发票创建一个临时表。处理完发票后,转到永久表并使用 mysql 中的 AUTO_INCREMENT 选项分配发票 ID

这将允许两个表,一个用于未处理,另一个用于处理。您还可以放置一个 id 字段来跟踪从 temp -> perm 的移动

于 2012-07-25T11:55:46.453 回答
2

我不会删除它,我只会取消它。另外通常在交易失败后,当发票不再存在时,交易者会提醒客户付款,这是不可能的。

于 2012-07-25T11:58:42.697 回答
0

一种方法是将发票保持在会话中,直到付款得到批准。如果付款未获批准,发票将随着用户的会话而消失。

另一种方法是为待处理的发票创建一个保留表。批准付款后,只需将数据移动到发票表中。

最后一种方法,继续在发票表中创建发票,但如果付款失败则软删除它。只需设置一个标志,deleted = 1 并在所有 procs 中添加“where deleted = 0”。

于 2012-07-25T12:00:11.213 回答
0

我会生成纯粹的随机发票号码。最简单的策略:

md5(uniqid())

但仍然——将未完成的发票存储在数据库中听起来更加理智。

此外,随机因素会使猜测发票号码更加困难。

于 2012-07-25T12:01:21.747 回答