我想使用MySQL数据库来存储带有PHP脚本的事务。为此,我正在使用ID,Name和其他列名称。由于我国的法律问题,交易名称需要遵循特定的格式。例如,对于ID“ 25”,名称将为“ Inv。 25”。为此,我将使用“ lastInsertId();”和总和1来获得名称的下一个数字,以与ID列匹配。将相同的内容存储在两列中可能听起来很奇怪,但是再次,由于法律问题,我需要使用公共和私有密钥对该字符串进行哈希处理,而且所示的字符串只是一个示例,因为它可能会变成类似“ Inv。2018/24”。总结一下,这是一个图表表,可以帮助您直观地查看问题。
关于这个问题,我想确保当有多个用户通过PHP脚本向数据库添加数据时,确实会发生这种情况,否则“名称”将不同于“ ID”列。 由于我的PHP脚本有一个“获取”请求(用于“ lastInsertId()”)和一个“发布”请求(用于表行中的其余信息),我是否需要锁定或阻止用户进行更改当有人正在运行此PHP脚本时?如果这样做,恐怕会遇到性能问题。另一方面,我不确定两个不同的用户在执行同一脚本时是否可以获得相同的“ lastInsertId();”。并将它们以不同的ID和相同的名称发布到数据库中。
谢谢,
米格尔
编辑: 有关“名称”列和最终执行问题的说明。
答案 0 :(得分:3)
PDO的lastInsertId()不会受到其他请求或连接的影响,因此您可以依靠它。
但是,您真的需要两次存储ID吗?
如果名称始终为Inv. {id}
,那么在我看来,仅使用php:Inv. <?= $row['id'] ?>
或使用SQL的CONCAT和select CONCAT('Inv. ', id)
来格式化它就更有意义。
答案 1 :(得分:1)
仅当在insert语句之后立即执行lastInsertId()函数时,才可以依赖最后一个插入ID。
请注意,如果名称始终具有相同的字符,后跟标识符,则不应将相同的数据保存在两个不同的列中。取而代之的是,您应该具有一个带有getter的域对象作为交易的合法名称:
class Transaction {
private $id;
public function getId() {
return $this->id;
}
public function getLegalName() {
return 'Inv. ' . $this->id;
}
}
话虽如此;如果您正在开发金融系统,则可能实际上并不想重新发明轮子。有很多PHP解决方案,包括开源的。