向字段添加 1

2022-08-30 17:36:36

如何将以下 2 个查询转换为 1 个查询

$sql    = "SELECT level FROM skills WHERE id = $id LIMIT 1;";
$result = $db->sql_query($sql);
$level  = (int) $db->sql_fetchfield('level');
$db->sql_freeresult($result);

++$level;

$sql    = "UPDATE skills SET level = $level WHERE id = $id;";
$result = $db->sql_query($sql);
$db->sql_freeresult($result);

我在phpBB mod中使用它,但要点是我抓住关卡,添加一个然后更新,如果我能把它作为一个查询来做,它似乎会更容易和更快。

编辑:已被强制为整数,因此这次不需要转义。$id


答案 1

我为此被降级了吗?

$sql = "UPDATE skills SET level = level+1 WHERE id = $id";
$result = $db->sql_query($sql);
$db->sql_freeresult($result);

在 Teifion 的特定情况下,phpBB DDL 将该特定字段列为 NOT NULL,因此不存在递增 NULL 的危险。

在一般情况下,不应使用 NULL 来表示零。递增 NULL 给出 NULL 的答案。如果你是那种误入歧途的开发人员,认为NULL=0,离开键盘,找到另一种消遣方式,你只会让我们其他人的生活变得艰难。当然,这是计算机行业,我们谁能说你错了?如果您没有错,请使用

$sql = "UPDATE skills SET level = COALESCE(level,0)+1 WHERE id = $id";

...但让我们面对现实吧:你错了。如果每个人都从级别 0 开始,则您的 DDL 应包括

level INT DEFAULT '0' NOT NULL

以防程序员在创建记录时忘记设置它。如果不是每个人都从级别 0 开始,则跳过 DEFAULT 并强制程序员在创建时提供值。如果有些人超越了水平,对他们来说,拥有一个水平是一件毫无意义的事情,那么在他们的水平上加一个同样是没有意义的。在这种情况下,请从 DDL 中删除 NOT NULL。


答案 2

这边:

UPDATE skills
SET level = level + 1
WHERE id = $id

推荐