所以我在网上商店创建了一个报价(估算)生成模块。
我创造了一个,但我想得到一些困扰我的建议。
报价生成是由客户将产品添加到购物车,然后选择生成PDF报价而不是使用产品结帐。
引号(文档编号)存储在数据库中,这显然给每个引号一个唯一的引用号,原因很明显。
现在,只要成功尝试生成报价,以下代码就会提取当前参考编号,将其递增1,然后使用新增加的参考编号更新数据库条目:
$wbquery = "select wq.configuration_key, wq.configuration_value from " . TABLE_CONFIGURATION . " wq where wq.configuration_key='" . $wbkey . "'";
$wbadd = $db->Execute($wbquery);
$newwb = $wbadd->fields['configuration_value'] + 1;
$wbdone = "update " . TABLE_CONFIGURATION . " set configuration_value = '" . $db->prepare_input(trim($newwb)) . "' where configuration_key = '" . $wbkey . "'";
$db->Execute($wbdone);
$docno = $qtype.date('y').sprintf('%05d', $newwb);
bof TLDR;
所以在这里,我们得到当前保存的参考号,然后加1。然后我们用该值更新数据库中的引用号。
我们还将参考编号分配给变量$ docno,因为我们将其打印到PDF中,除了参考编号之外,我们还添加了前缀$ qtype(这是2字母)和日期(' y'),它是当前年份的2位数字表示。我们还强制参考号在参考号前面添加零,以确保其长度至少为5位。
eof TLDR;
如果通过某种程度或想象力,我如何确保如果2个客户碰巧产生报价并且恰好同时发生,那么就不存在轻微的冲突。
如果客户A与客户B同时生成报价,客户A的尝试是否有可能提取当前参考编号,客户B的尝试也会拉动相同的参考编号,并错误地共享相同的参考文献?
或者,更新回数据库的可能性是否有可能发生,并且错误地执行增量?
数据库中的值位于TEXT类型的列中 - 并且没有任何自动增量属性。
问题是,我不希望这种情况发生,报价系统将被客户和管理人员使用 - 但我只是想确保...它永远不会发生。
有什么建议吗?感谢。
P.S。 - 我确实有一个安全措施,它将随机MD5哈希添加到pdf-quote保存为的文件名中。这将确保生成报价的客户永远不会错误地提供由另一个客户生成的报价 - 如果报价共享相同的参考编号。最初,它使用基本的$ docno保存了引用 - 但我意识到这可能会造成隐私风险,这就是我在文件名中添加了MD5唯一哈希值。
答案 0 :(得分:1)
你在问一个"竞争条件" (如果你想做更多的研究)。
根据事情的声音,你不想在你的php中做这个增量。它将为您提供让mysql使用自己的自动递增功能。
所以我的答案/建议是,重新设计你的表结构,使引号id不是TEXT
,而且它是AUTO_INCREMENT。
否则,你将不得不面对更大的麻烦来防止种族歧视。