【问题标题】:Add 1 to a field将 1 添加到字段
【发布时间】:2010-09-05 13:43:42
【问题描述】:

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

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    我为此被降级了?

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

    【讨论】:

    • 我有一个问题,如果 'level' 为空,它不会增加。
    【解决方案2】:

    这边:

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

    【讨论】:

      【解决方案3】:

      使用 PDO 和准备好的查询:

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

      【讨论】:

        【解决方案4】:
        $sql = "UPDATE skills SET level = level + 1 WHERE id = $id";
        

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

        【讨论】:

        • 尤其是没有引号的人甚至不必使用 SQL 注入来转义最后一个引号 $id = "'null' OR DELETE FROM Skills;";哈哈
        【解决方案5】:

        试试这个

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

        【讨论】:

          【解决方案6】:

          怎么样:

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

          【讨论】:

            【解决方案7】:

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

            另外:是的,mysql_escape_string()

            【讨论】:

              猜你喜欢
              • 2011-05-11
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-02-29
              • 1970-01-01
              • 2019-09-13
              相关资源
              最近更新 更多