将1添加到一个字段

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

0

7 答案

$ sql =“更新技能SET level = level + 1 WHERE id = $ id”;

我只是希望你能正确清理代码中其他地方的$ id!

0
额外
特别是没有引号的人甚至没有必要用SQL注入来逃避最后的引用$ id =“'null'或DELETE FROM skills;”;哈哈
额外 作者 Josh Bedo,

尝试这个

UPDATE skills SET level = level + 1 WHERE id = $id
0
额外

这条路:

UPDATE skills
SET level = level + 1
WHERE id = $id
0
额外

我为此下了功夫?

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

0
额外
我有一个问题,如果'级别'为空,它不会增加。
额外 作者 MaurerPower,

马特:这就是问题所在。它没有被编辑,所以我把它归因于Markdown中的一个错误。但是,奇怪的是,我注意到了。

另外:是的, mysql_escape_string()

0
额外

怎么样:

UPDATE skills SET level = level + 1 WHERE id = $id;
0
额外

使用PDO并准备好查询:

$query = $db->prepare("UPDATE skills SET level = level + 1 WHERE id = :id")
$query->bindValue(":id", $id);
$result = $query->execute();
0
额外