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安全快速的选择和插入的主要内容,如果未能解决你的问题,请参考以下文章

PHP、HTML、CSS、Javascript 表单安全

PHP 安装版本选择

php四种基础算法:冒泡,选择,插入和快速排序法PHP基础教程

动态网站安全问题(PHP+MySQL)

使用PHP链接MySQL

这对于用户登录和验证是不是足够安全? (PHP、MySQL、会话)