如何在 PHP 和 mySQL 中创建工单参考号
How to create a ticket reference number in PHP and mySQL
我正在 PHP 和 mySQL 开发票务系统。
我有一个 table support
,id
作为我的主键和 AI。
我想添加 ticket_number
,以便在提交工单时为每张工单分配一个唯一编号。我不能使用 mySQL 来 AI 第二个字段,对吗?
如果我给第一张票一个数字,然后写一个查询来查找数据库中的最后一张 ticket_number
,那么我正在考虑做类似的事情:
$ticket = 1;
$next = $ticket+1;
echo "ticket number: #".$next;
这行得通还是有更好的方法?
您可以通过以下代码实现。每次都会生成唯一的票号
$brand = '#ref';
$cur_date = date('d').date('m').date('y');
$invoice = $brand.$cur_date;
$customer_id = rand(00000 , 99999);
$uRefNo = $invoice.'-'.$customer_id;
echo $uRefNo;
对于一个好的和唯一的 ID,你有更好的解决方案:
- 您可以使用基于微时间的 md5 哈希(与 PHP 中的 uniqid 相同,但更安全)
- 您可以使用具有
unique = true
功能的额外列,并请求获取此列的最大值并在新插入之前在代码中递增
- 您可以使用您的支持 ID 作为唯一条目,这是完全可行的,方法是先插入另一个字段,然后取回插入的 ID 以更新您的工单 ID(如果它是您的 table 的另一个组成部分)或者,如果您将其视为您的票证 ID,则单独向您的用户展示它..
我决定按如下方式调整@Himanshu kumar 的回答(因为它解决了我的组织问题),以使用用户 ID 和时间戳(我已经在使用这两者)作为票号:
$user_id = 7; //example from session variable
$cur_date = date('dmyHis'); //timestamp ticket submitted
$ticket = '#'.$user_id.'-'. $cur_date;
这将创建一个具有用户 ID 以及日期和时间的唯一变量。我用几秒钟让它变得更加独特。然后我将使用查询来查找所有 messages/tickets 和这张票。
根据 MonkeyZeus 的建议,您需要退后一步并重新考虑您的架构。
您希望多行(回复)通过单个 ID(票号)链接在一起。
您肯定希望此 ID 成为另一个 table 中一行的 ID。
所以你应该有两个 tables:
- 一个
tickets
- 另一个
replies
第一个将能够保存特定于工单的数据,包括工单的状态(打开、关闭...)、分配给谁(用户 ID)、创建者票证(同样是一个 ID),可能还有它打开和关闭的时间(尽管这可以通过其他方式推断出来)。
第二个将保存您票中每个条目的特定数据(初始消息,以及随后来回的回复)。
对于其他类型的操作(工单状态更改、子工单创建等),您可能还有其他 table(或者可能与 replies
相同)。
tickets
将有一个唯一的 ID,您可以将其用作票号(可能带有某种前缀,可能以某种方式重新格式化)。
replies
将有一个唯一的 ID(当您想将文件附加到回复或编辑它时,这将很有用)以及与之关联的工单的 ID。
让Mysql创建ID。使用您喜欢的语言 API 获取最后插入行的 ID。
- 不要 根据服务器返回的最大 ID 增加客户端 ID。竞争条件迫在眉睫。
- 不要使用客户端生成的 ID,不保证唯一
@jcaron 我设计了一个模式 - 这行得通吗?
我正在 PHP 和 mySQL 开发票务系统。
我有一个 table support
,id
作为我的主键和 AI。
我想添加 ticket_number
,以便在提交工单时为每张工单分配一个唯一编号。我不能使用 mySQL 来 AI 第二个字段,对吗?
如果我给第一张票一个数字,然后写一个查询来查找数据库中的最后一张 ticket_number
,那么我正在考虑做类似的事情:
$ticket = 1;
$next = $ticket+1;
echo "ticket number: #".$next;
这行得通还是有更好的方法?
您可以通过以下代码实现。每次都会生成唯一的票号
$brand = '#ref';
$cur_date = date('d').date('m').date('y');
$invoice = $brand.$cur_date;
$customer_id = rand(00000 , 99999);
$uRefNo = $invoice.'-'.$customer_id;
echo $uRefNo;
对于一个好的和唯一的 ID,你有更好的解决方案:
- 您可以使用基于微时间的 md5 哈希(与 PHP 中的 uniqid 相同,但更安全)
- 您可以使用具有
unique = true
功能的额外列,并请求获取此列的最大值并在新插入之前在代码中递增 - 您可以使用您的支持 ID 作为唯一条目,这是完全可行的,方法是先插入另一个字段,然后取回插入的 ID 以更新您的工单 ID(如果它是您的 table 的另一个组成部分)或者,如果您将其视为您的票证 ID,则单独向您的用户展示它..
我决定按如下方式调整@Himanshu kumar 的回答(因为它解决了我的组织问题),以使用用户 ID 和时间戳(我已经在使用这两者)作为票号:
$user_id = 7; //example from session variable
$cur_date = date('dmyHis'); //timestamp ticket submitted
$ticket = '#'.$user_id.'-'. $cur_date;
这将创建一个具有用户 ID 以及日期和时间的唯一变量。我用几秒钟让它变得更加独特。然后我将使用查询来查找所有 messages/tickets 和这张票。
根据 MonkeyZeus 的建议,您需要退后一步并重新考虑您的架构。
您希望多行(回复)通过单个 ID(票号)链接在一起。
您肯定希望此 ID 成为另一个 table 中一行的 ID。
所以你应该有两个 tables:
- 一个
tickets
- 另一个
replies
第一个将能够保存特定于工单的数据,包括工单的状态(打开、关闭...)、分配给谁(用户 ID)、创建者票证(同样是一个 ID),可能还有它打开和关闭的时间(尽管这可以通过其他方式推断出来)。
第二个将保存您票中每个条目的特定数据(初始消息,以及随后来回的回复)。
对于其他类型的操作(工单状态更改、子工单创建等),您可能还有其他 table(或者可能与 replies
相同)。
tickets
将有一个唯一的 ID,您可以将其用作票号(可能带有某种前缀,可能以某种方式重新格式化)。
replies
将有一个唯一的 ID(当您想将文件附加到回复或编辑它时,这将很有用)以及与之关联的工单的 ID。
让Mysql创建ID。使用您喜欢的语言 API 获取最后插入行的 ID。
- 不要 根据服务器返回的最大 ID 增加客户端 ID。竞争条件迫在眉睫。
- 不要使用客户端生成的 ID,不保证唯一
@jcaron 我设计了一个模式 - 这行得通吗?