题
如何将以下 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。
其他提示
这边走:
UPDATE skills
SET level = level + 1
WHERE id = $id
使用 PDO 和准备好的查询:
$query = $db->prepare("UPDATE skills SET level = level + 1 WHERE id = :id")
$query->bindValue(":id", $id);
$result = $query->execute();
$sql = "更新技能 SET level = level + 1 WHERE id = $id";
我只是希望你能在代码中的其他地方正确清理 $id !
尝试这个
UPDATE skills SET level = level + 1 WHERE id = $id
怎么样:
UPDATE skills SET level = level + 1 WHERE id = $id;
垫:这就是从问题中粘贴的内容。它尚未被编辑,所以我将其归因于 Markdown 中的一个错误。但是,奇怪的是,我注意到了。
还:是的, mysql_escape_string()
!
不隶属于 StackOverflow