24

如何将以下 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已经被强制为整数,因此这次不需要转义。

4

7 回答 7

31

我为此被降级了?

$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。

于 2008-08-08T12:35:53.007 回答
11

这边走:

UPDATE skills
SET level = level + 1
WHERE id = $id
于 2008-08-08T12:36:42.113 回答
6

使用 PDO 和准备好的查询:

$query = $db->prepare("UPDATE skills SET level = level + 1 WHERE id = :id")
$query->bindValue(":id", $id);
$result = $query->execute();
于 2008-08-25T01:19:45.817 回答
3
$sql = "UPDATE skills SET level = level + 1 WHERE id = $id";

我只是希望您在代码中的其他地方进行了适当的清理$id

于 2008-08-08T12:36:22.863 回答
2

试试这个

UPDATE skills SET level = level + 1 WHERE id = $id
于 2008-08-08T12:36:27.107 回答
1

怎么样:

UPDATE skills SET level = level + 1 WHERE id = $id;
于 2008-08-08T12:37:17.980 回答
-1

Mat:这就是问题中粘贴的内容。它没有被编辑,所以我将其归因于 Markdown 中的一个错误。但是,奇怪的是,我注意到了。

还有:是的,mysql_escape_string()

于 2008-08-08T12:47:15.853 回答