生成序列号或唯一订单号

发布于 2024-09-06 05:46:25 字数 36 浏览 10 评论 0原文

如何在 php 中生成唯一的序列号或订单号而不检查数据库?

How do generate unique serial or order number in php without checking against db?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

↘人皮目录ツ 2024-09-13 05:46:25

请参阅 uniqiduuid_create 中的 uuid peclcom_create_guid()

see uniqid or uuid_create in uuid pecl or com_create_guid()

梦中楼上月下 2024-09-13 05:46:25

如果你想保证唯一性,那么你必须检查一些东西。您可以使用平面文件并仅存储最近使用的数字(然后可以递增),但不使用数据库将是愚蠢的。您需要存储与该号码相关的大量其他信息(联系方式、订单内容等),而数据库是理想的选择。

If you want to guarantee uniqueness then you have to check against something. You could use a flat file and store just the most recently used number (which you can then increment), but it would be silly not to use a database. You need to store a bunch of other information linked to the number (contact details, what the order consists of, etc) and a database is ideal for that.

我一向站在原地 2024-09-13 05:46:25

在 mysql 中使用自动增量列存在几个问题(尤其是它不能扩展到等效节点)。

虽然您可以在任何地方(memcache、文件、数据库)维护序列生成器,但 PHP 并没有实现复杂的文件锁定语义 - 除了影响性能之外,您还可以快速陷入交易锁定情况。它无法扩展到大容量。

如果您有 PL/SQL 可用,那么我建议在那里实现一个序列生成器 - 或者您可以考虑在 PHP 和 sqlite 中实现一个生成器。

我强烈建议您实现生成器来创建以下格式的数字:

$use_number = ++$sequence_number 。 str_pad($node_id, '0', $max_nodes, STR_PAD_LEFT);

其中node_id是唯一引用存储当前序列号的存储基板的数字。并且 $max_nodes 比 $node_id 中找到的最大位数要多一些(例如 3 将允许最多 999 个节点)。

或者将其视为在两个部分之间带有标点符号的字符串(和/或将两个部分存储在不同的数据库列中)。

C.

There are several issues using autoincrement columns in mysql (not least the fact that it does not scale to equivalent nodes).

While you can maintain a sequence generator just about anywhere (memcache, files, database) PHP does not implmenet sophisticated file locking semantics - in addition to affecting performance you can quickly get into deal-lock situations. It doesn't scale to large volumes.

If you've got PL/SQL available, then I'd recommend implementing a sequence generator there - alternatively you might consider implementing a generator in PHP and sqlite.

I would strongly recommend that you implement your generator to create numbers of format:

$use_number = ++$sequence_number . str_pad($node_id, '0', $max_nodes, STR_PAD_LEFT);

Where node_id is a number uniquely referencing the storage substrate where the current sequence number is stored. And $max_nodes is somewhat more than the the max number of digits found in $node_id (e.g. 3 would allow up to 999 nodes).

Alternatively treat it as a string with punctuation between the 2 parts (and/or store the 2 parts in different database columns).

C.

半岛未凉 2024-09-13 05:46:25

如果您使用的是 MySQL 数据库,则可以使用 auto_increment 列。插入新行将导致为该列分配一个新的、唯一的 ID,而无需在 PHP 中读取/写入该列。

或者,如果您想要一个全局唯一的 ID,甚至不需要数据库,那么您可以使用 PHP 的 uniqid () 函数。请注意,这会返回一个字符串。如果您使用多台物理计算机或在服务器之间移动,则应添加每台计算机上不同的前缀(第一个参数)。当在同一台机器上使用时,此函数不应两次返回相同的字符串值。

If you are using a MySQL database, you can generate a serial order number without needing to pre-check the database by using an auto_increment column. Inserting a new row will cause a new, unique ID to be assigned to that column without having to read/write that column in your PHP.

Alternatively, if you want a globally unique ID without even a database, then you could use PHP's uniqid() function. Note that this returns a string. If you use more than one physical machine or move between servers you should add a prefix (first argument) that is different on every machine. When used on the same machine, this function should never return the same string value twice.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文