【问题标题】:Prevent Select sql from select the same data from DB PHP防止 Select sql 从 DB PHP 中选择相同的数据
【发布时间】:2020-08-06 19:55:13
【问题描述】:

我对 PHP 中的 Seq 有一些疑问。 我创建 1 个表来维护序列表, 前任。表是序列,字段是序列(从1开始) 序列应该是唯一值。

问题是。 有 2 个并行运行的进程将使用它。 我收到了重复值的错误消息。

问题。 如何从另一个选择查询中锁定表?

这是我的代码

//select seq
$sqlSeq = "select seq from sequence for update";
$resultSeq = pg_query($sqlSeq);
$rowSeq = pg_fetch_assoc($resultSeq);
$seqCif = $rowSeq['seq'];

//INSERT
$sqlInsert1 ="insert into TEST (customer_id) values( '".$seqCif."')";

//UPDATE 
 $sqlInsert1 .= "update sequence set seq=seq+1;" ; 

你能帮我处理这个案子吗? 非常感谢..

【问题讨论】:

  • 为什么不用postgresql内置的序列呢? postgresql.org/docs/9.5/sql-createsequence.html
  • 因为您的代码包含 SQL 注入,请查看此处了解更多信息:owasp.org/www-community/attacks/SQL_Injection
  • 嗨@FelippeDuarte,如果我使用自动递增,如果插入失败,序列仍然递增,那就是问题所在。我不能跳过这个号码。
  • @Inazo 是的,我知道,但是这个工具是供内部使用的。所以我认为是安全的......
  • 然后使用事务

标签: php sql postgresql sql-insert


【解决方案1】:

使操作原子化并保证增量id 没有间隙的一种简单方法是将语句转换为insert ... select ... 查询:

insert into test(customer_id)
select coalesce(max(customer_id), 0) + 1 from test

【讨论】:

  • 我不能使用那个方法,因为我创建了ETL工具,而表(测试)被现有的核心程序使用,而我创建的序列仅来自我的工具。前任。核心是 C00001 我的工具是 M00001
  • @LodeweykAndri:我们可以提取数字部分,将其递增并重新格式化:insert into test(customer_id) select 'C' || lpad((coalesce(max(substring(customer_id, 2)::int), 0) + 1)::text, 5, '0') from test
猜你喜欢
  • 1970-01-01
  • 2013-03-21
  • 2014-05-06
  • 2011-04-29
  • 1970-01-01
  • 2016-06-30
  • 2010-12-16
  • 2023-03-18
  • 1970-01-01
相关资源
最近更新 更多