【问题标题】:Increment value in MySQL update queryMySQL更新查询中的增量值
【发布时间】:2011-01-16 13:54:58
【问题描述】:

我已经制作了这个代码来给出+1分,但它不能正常工作。

mysql_query("
    UPDATE member_profile 
    SET points= ' ".$points." ' + 1 
    WHERE user_id = '".$userid."'
");

$points 变量是用户现在的积分。我希望它添加一个。例如,如果他有 5 分,应该是 5+1 = 6,但不是,它只是变为 1。

我做错了什么?

【问题讨论】:

  • 我遇到了类似的问题,然后意识到该字段的默认类型是“NULL”,将其更改为 0,一切都很好。

标签: php mysql sql sql-update


【解决方案1】:

接受的答案很好,但不能使用空值试试这个

mysql_query("
    UPDATE member_profile 
    SET points = IFNULL(points, 0) + 1
    WHERE user_id = '".$userid."'
");

More info on IFNULL

【讨论】:

    【解决方案2】:

    您应该使用 PDO 来防止 SQL 注入风险。

    您可以像这样连接到数据库:

    try {
        $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
        $bdd = new PDO('mysql:host=xxxx;dbname=xxxx', 'user', 'password', $pdo_options);
        $bdd->query('SET NAMES "utf8"');
    } catch (PDOException $e) {
        exit('Error');
    }
    

    无需查询数据库即可获得点数。您可以直接在更新查询中递增 (points = points + 1)。

    (注意:另外,使用 PHP 增加值不是一个好主意,因为您需要先选择数据,如果其他用户更新它,值可能会改变。)

    $req = $bdd->prepare('UPDATE member_profile SET 
                points = points + 1
                WHERE user_id = :user_id');
    
    $req->execute(array(
        'user_id' => $userid
    ));
    

    【讨论】:

      【解决方案3】:

      谁需要更新字符串和数字 SET @a = 0; UPDATE obj_disposition SET CODE = CONCAT('CD_', @a:=@a+1);

      【讨论】:

        【解决方案4】:

        你也可以这样做:

        mysql_query("
            UPDATE member_profile 
            SET points = points + 1
            WHERE user_id = '".$userid."'
        ");
        

        【讨论】:

        • @Steve 对于知道什么是 PDO 的人来说,您的评论可能听起来很聪明,但对于刚刚涉足 PHP/MySQL 的我来说,它并没有真正说明这个问题。 PDO 是否使该代码更小或更优雅?如果是这样,请编辑答案或发布您自己的答案,以展示 PDO 的优势。谢谢。
        • @CamiloMartin 我也很好奇。我发现这很有帮助net.tutsplus.com/tutorials/php/…
        • @CamiloMartin mysql_query 的php.net manuals 页面有以下注释:此扩展自 PHP 5.5.0 起已弃用,并将在未来删除。相反,应该使用MySQLiPDO_MySQL 扩展名。另请参阅MySQL: choosing an API 指南和related FAQ 了解更多信息。
        • 将用户数据连接到 SQL 查询中是主要的 SQL 注入风险。
        • 您可以使用库或在用户 ID 周围使用 mysql_real_escape_string() 来避免注入攻击或编码错误
        【解决方案5】:

        另外,要“增加”字符串,更新时使用CONCAT

        update dbo.test set foo=CONCAT(foo, 'bar') where 1=1
        

        【讨论】:

          【解决方案6】:

          希望我的第一篇文章不会偏离主题,但我想稍微扩展一下整数到字符串的转换,因为一些受访者似乎有错误。

          由于此查询中的表达式使用算术运算符(加号 +),MySQL 会将表达式中的任何字符串转换为数字。

          为了演示,下面将产生结果 6:

          SELECT ' 05.05 '+'.95';
          

          MySQL 中的字符串连接需要 CONCAT() 函数,因此这里没有歧义,MySQL 将字符串转换为浮点数并将它们相加。

          我实际上认为初始查询不起作用的原因很可能是因为 $points 变量实际上并未设置为用户的当前点。它要么设置为零,要么未设置:MySQL 会将空字符串强制转换为零。为了说明,下面将返回 0:

          SELECT ABS('');
          

          就像我说的,我希望我不会太离题。我同意 Daan 和 Tomas 对这个特定问题有最好的解决方案。

          【讨论】:

          • +1 康普顿 非常好的点,你对演员工作的看法是对的,不管有没有引号。欢迎来到 SO!
          【解决方案7】:

          您无需查询实际点数即可执行此操作,因此在脚本执行期间可以节省一些时间和资源。

          mysql_query("UPDATE `member_profile` SET `points`= `points` + 1 WHERE `user_id` = '".intval($userid)."'");
          

          否则,您做错的是您将旧的点数作为字符串 (points='5'+1) 传递,并且您不能将数字添加到字符串中。 ;)

          【讨论】:

            【解决方案8】:

            为什么不让 PHP 来做呢?

            "UPDATE member_profile SET points= ' ". ($points+1) ." '  WHERE user_id = '".$userid."'"
            

            【讨论】:

            • 好点,但在并发环境中要小心,因为 DB 值可能在此期间发生了变化。
            • 谢谢@VincentNikkelen,你一针见血。并发!
            • 如果你使用这种方法,你应该首先选择数据,这意味着对行的额外访问。如果您只需要更新值,这不是要走的路。
            【解决方案9】:

            去掉point周围的'

            mysql_query("UPDATE member_profile SET points=".$points."+1 WHERE user_id = '".$userid."'");
            

            您正在将整数值“转换”为原始查询中的字符串...

            【讨论】:

              【解决方案10】:
              "UPDATE member_profile SET points = points + 1 WHERE user_id = '".$userid."'"
              

              【讨论】:

              • 如果我使用变量而不是 value=1 会怎样?我应该这样做“点=点+ $变量”吗?或“点=点+'$变量'”
              猜你喜欢
              • 1970-01-01
              • 2011-05-25
              • 1970-01-01
              • 2012-06-10
              • 2015-04-09
              • 1970-01-01
              • 1970-01-01
              • 2011-03-20
              相关资源
              最近更新 更多