使用PHP和MySQL一次一个请求

使用PHP和MySQL一次一个请求,php,mysql,Php,Mysql,我想使用MySQL数据库存储带有PHP脚本的事务。为此,我使用ID、Name和其他列名称。由于我国的法律问题,交易名称需要遵循特定的模式。例如,对于ID“25”,名称将是“Inv.25”。为此,我将使用“lastInsertId();”和sum 1来获取名称的下一个数字,以便与ID列匹配。将同一内容存储在两列中听起来可能有些奇怪,但由于法律问题,我需要使用公钥和私钥对该字符串进行散列,而且,显示的字符串只是一个示例,因为它可以变成类似“Inv.2018/24”的内容。总而言之,这里有一个图表表来

我想使用MySQL数据库存储带有PHP脚本的事务。为此,我使用ID、Name和其他列名称。由于我国的法律问题,交易名称需要遵循特定的模式。例如,对于ID“25”,名称将是“Inv.25”。为此,我将使用“lastInsertId();”和sum 1来获取名称的下一个数字,以便与ID列匹配。将同一内容存储在两列中听起来可能有些奇怪,但由于法律问题,我需要使用公钥和私钥对该字符串进行散列,而且,显示的字符串只是一个示例,因为它可以变成类似“Inv.2018/24”的内容。总而言之,这里有一个图表表来帮助可视化问题

对于这个问题,我想确保当有多个用户通过PHP脚本向数据库添加数据时,确实会发生这种情况,否则名称将与ID列不同。 由于我的PHP脚本有一个“get”请求(对于“lastInsertId()”)和一个“post”请求(对于表行中的其余信息),我是否需要在有人运行此PHP脚本时锁定或阻止用户进行更改?如果我这样做,恐怕会遇到性能问题。另一方面,我不确定两个不同的用户在执行同一个脚本时是否可以获得相同的“lastInsertId();”,并将它们以不同的ID和相同的名称发布到数据库中

谢谢,
米格尔

编辑: 解释名称列的用途和最终的执行问题。

PDO的lastInsertId()不会受到其他请求或连接的影响,因此您可以依赖它

然而,您真的需要存储两次ID吗

如果名称始终是
Inv.{id}
,那么在我看来,仅使用php对其进行格式化就更有意义:
Inv.
或使用CONCAT与SQL:
选择CONCAT('Inv.,id)
)。

PDO的lastInsertId()不会受到其他请求或连接的影响,因此您可以依赖它

然而,您真的需要存储两次ID吗


如果名称始终是
Inv.{id}
,那么在我看来,仅使用php对其进行格式化更有意义:
Inv.
或使用CONCAT与SQL:
select CONCAT('Inv.,id)
)。

如果在insert语句之后立即执行lastInsertId()函数,则只能依赖于last insert id

请注意,如果名称后面始终有相同的字符和标识符,则不应将相同的数据保存在两个不同的列中。相反,您应该有一个域对象,其中包含一个getter作为事务的合法名称:

class Transaction {
    private $id;

    public function getId() {
         return $this->id;
    }

    public function getLegalName() {
        return 'Inv. ' . $this->id;
    }
}

话虽如此,;如果你正在开发一个金融系统,你可能实际上不想重新发明轮子。有很多PHP解决方案,包括开源解决方案。

如果在insert语句之后立即执行lastInsertId()函数,则只能依赖last insert id

请注意,如果名称后面始终有相同的字符和标识符,则不应将相同的数据保存在两个不同的列中。相反,您应该有一个域对象,其中包含一个getter作为事务的合法名称:

class Transaction {
    private $id;

    public function getId() {
         return $this->id;
    }

    public function getLegalName() {
        return 'Inv. ' . $this->id;
    }
}


话虽如此,;如果你正在开发一个金融系统,你可能实际上不想重新发明轮子。有很多PHP解决方案,包括开源解决方案。

如果格式已知并且需要“Inv.[ID]”,为什么需要将名称存储在数据库中?当你展示这些信息时,就要处理这些问题?在展示层做类似的事情。不在数据库中将ID存储在名称中的优点是,如果我们执行一些导入/导出/合并表,则数据库中发票的名称不会更改(例如,在数据库迁移期间,ID可能会更改)。。。就我而言,我同意米格尔的想法,即使我从未这样做过……我真诚地怀疑发票名称是否需要与dbs内部id匹配。您需要序列生成器。您不希望依赖MySQL发出的ID值。这些可能有由回滚的事务创建的“漏洞”。如果格式已知并且需要“Inv.[ID]”,为什么需要将名称存储在db中?当你展示这些信息时,就要处理这些问题?在展示层做类似的事情。不在数据库中将ID存储在名称中的优点是,如果我们执行一些导入/导出/合并表,则数据库中发票的名称不会更改(例如,在数据库迁移期间,ID可能会更改)。。。就我而言,我同意米格尔的想法,即使我从未这样做过……我真诚地怀疑发票名称是否需要与dbs内部id匹配。您需要序列生成器。您不希望依赖MySQL发出的ID值。除其他事项外,这些可能有被回滚的事务所造成的“漏洞”。完全同意“使用php或使用CONCAT与SQL生成漏洞”,或将其完全转移到演示文稿中layer@RiggsFolly我就是这样读的。当它被显示时,它被组合在一起。。。存储时不会。谢谢@Devon的回答。我已经编辑了这个问题,解释了名称列的用途以及我认为可能出现的最终执行问题。我认为现在更清楚了。@MiguelSantana我的第一句话应该仍然涵盖您编辑的问题。完全同意“使用php或使用CONCAT与SQL生成”,或者将其完全转移到演示文稿中layer@RiggsFolly我就是这样读的。当它被显示时,它被组合在一起。。。存储时不会。谢谢@Devon的回答。我已经编辑了这个问题,解释了名称列的用途以及我认为可能出现的最终执行问题。我想现在更清楚了。@MiguelSantana我的第一句话应该还包括你编辑过的问题。