将1加到栏位

时间:2020-03-05 18:38:35  来源:igfitidea点击:

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

解决方案

回答

我为此感到沮丧吗?

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

回答

$ sql ="更新技能设置级别=级别+ 1 WHERE id = $ id";

我只是希望我们可以在代码中的其他地方正确地清理$ id!

回答

试试这个

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

回答

这条路:

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

回答

怎么样:

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

回答

Mat:这就是问题的内容。它尚未被编辑,因此我将其归因于Markdown中的一个错误。但是,奇怪的是,我注意到了。

另外:是的,mysql_escape_string()

回答

使用PDO和准备好的查询:

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