【发布时间】:2015-02-07 09:50:32
【问题描述】:
我有一个简单的表,逻辑是在插入新行之前,我应该从该表中获取一列。让我解释一下:
table
id key groupId Note
1 00001 1 abd
2 00002 1 aasdas
3 00003 1 aasdas
4 00001 2 q2eqwd
5 00002 2 qwdvvd
6 00003 2 qwrqw
7 00004 2 qwdqdqw
您会看到,每个 groupId 的键增加就像自动增量一样。 当 id 为 2 的组想要添加一个新注释时,他应该知道最后一个键。找到它后,php 将 +1 添加到最后一个键并插入一个新行。我这样做如下:
$groupId = 2; //for example
$note = $_POST['note'];
$select = $db -> prepare("SELECT key FROM table where groupId = :groupId ORDER BY id DESC limit 1");
$select -> bindValue(":groupId", $groupId, PDO::PARAM_INT);
$select -> execute();
$fetch = $select -> fetch(PDO::FETCH_ASSOC);
$lastKey = $fetch['key']+1;
$insert = "INSERT INTO table (key, groupId, note) VALUES(:key, :groupId, :note)";
$ins = $db -> prepare($insert);
$insert -> bindValue(":key", $lastKey, PDO::PARAM_INT);
$insert -> bindValue(":groupId", $groupId, PDO::PARAM_INT);
$insert -> bindValue(":note", $note, PDO::PARAM_STR);
这个方法对我很好,但我担心从表中获取最后一个键时会不会有冲突?因为,同时,10 个具有相同 groupId 的用户可以添加一个新行。 php 可以同时为组 ID 为 2 的 3 个用户获取相同的密钥吗?
有什么快速安全的方法吗?
【问题讨论】:
-
会有冲突。这就是为什么
key应该是auto_increment而你不应该通过 PHP 来做。 -
但是对于不同的 groupId 键可以重复。可以有 10 个具有不同 GroupId 的相同密钥
-
事实是,如果您使用任何编程语言(用于插入)生成任何内容,则无法保证唯一性。如果您要使用任何语言执行此操作,您将面临同样的问题。这让我们回到分析你想要做什么。你有一个表,表有键、groupId 和注释。但是为什么这个
key必须以任何方式连续?您会看到,您遇到的问题实际上来自次优数据模型。使用 PHP 生成这样的序列很困难,因为您需要自己处理并发,这意味着您将其从 MySQL 中移除。 -
我认为您将数据存储与数据检索和显示混淆了。
-
每个用户的密钥必须从 1 开始,并且应该像 auto_increment 一样增加。这是我老板的要求。我们必须使用 key 找到每个音符。当然,我可以使用循环给出增量键。但在这种情况下,将无法通过 Key 从数据库中找到注释。除了这一行,如果该行将被删除,还会有另一个问题。所以,这就是为什么我必须将密钥保存在数据库中
标签: php mysql select pdo insert