2008-08-08 156 views
18

如何打开以下2个查询到1个查询添加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,但主旨是我抢的程度,增加一个给它,然后更新,如果我可以将它作为一个查询来做,它似乎会更容易和更快。

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

回答

29

我得到了downmodded这个?

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

+1

我有一个问题,即如果“水平”为空,也不会增加。 – MaurerPower 2012-05-24 21:59:29

2

$ sql =“UPDATE skills SET level = level + 1 WHERE id = $ id”;

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

+0

特别是没有引号的人甚至不需要用SQL注入来逃避最后的引用 $ id =“'null'或删除技能;”;哈哈 – 2013-05-21 21:06:39

1

试试这个

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

这样:

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

如何:

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

太:那就是从问题中粘贴英寸它没有被编辑,所以我把它归因于Markdown中的一个错误。但是,奇怪的是,我注意到了。

另外:是的,mysql_escape_string()

5

随着PDO和准备好的查询:

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