mysql 用php安全快速的选择和插入
Posted
技术标签:
【中文标题】mysql 用php安全快速的选择和插入【英文标题】:mysql select and insert safely and quickly with php 【发布时间】: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 从数据库中找到注释。除了这一行,如果该行将被删除,还会有另一个问题。所以,这就是为什么我必须将密钥保存在数据库中
【参考方案1】:
您可以使用 MyISAM 对 AUTO_INCREMENT
执行此操作。
来自 MySQL Docs:
对于 MyISAM 和 BDB 表,您可以在 多列索引中的第二列。 ...当您要将数据放入有序组时,这很有用。
否则,您应该使用SELECT MAX(key) + 1 FROM table WHERE groupID = 1
之类的子查询在插入查询中设置值并读回该值。
【讨论】:
这就是我需要的。太好了!以上是关于mysql 用php安全快速的选择和插入的主要内容,如果未能解决你的问题,请参考以下文章