【问题标题】:Codeigniter, increase database value by value contained in variableCodeigniter,通过变量中包含的值增加数据库值
【发布时间】:2011-10-16 22:02:11
【问题描述】:

我正在使用 codeigniter,并且我的模型中有以下函数可以给用户积分。 但是它不起作用,而是将点列设置为 0。

codeigniter 手册中是这样写的。因此我不知道为什么它不工作......

谢谢

function give_points($username,$points)
{
    $this->db->set('points', 'points + $points');
    $this->db->where('username', $username);
    $this->db->update('users'); 
    echo"done";
}

【问题讨论】:

    标签: php codeigniter activerecord


    【解决方案1】:

    我相信你必须专门告诉 CI 不要转义文本。我没有方便的 CI 安装来测试它,但我认为它类似于:

    $this->db->set('points', 'points + ' . (int) $points, FALSE);
    

    【讨论】:

      【解决方案2】:

      不确定这是您问题的原因,但您在以下几行中使用了单引号:

      $this->db->set('points', 'points + $points');
      

      这样,$points 字符串将按原样注入到您的 SQL 查询中——这不是要使用的值。


      如果你想插入$points (所以它的值放在它的位置,在那个字符串中),你必须使用双引号:

      $this->db->set('points', "points + $points");
      


      有关变量插值的更多信息,请参阅 PHP 手册的 Variables parsing 部分。

      【讨论】:

      • 产生查询:UPDATE users SET points = 'points + 1000' WHERE username = 'thomas' 这不起作用..还有什么想法吗?
      • 看起来您在数据库中的 points 字段是一个整数,而您正试图像字符串一样访问它:您的查询应该看起来像 UPDATE users SET points = 'points + 1000' WHERE username = 'thomas' ;;;也许您有某种方式向 CI 表明这一点?我不太了解 CI,无法提供更多帮助,抱歉。
      【解决方案3】:

      如果有机会,请始终检查创建的 SQL 查询 - 我不知道如何使用 CI。

      但是,您的 set() 看起来有缺陷。

      $this->db->set('points', "points + $points");
      

      以前,$points字符串 的一部分,并且没有被 $points 的内容扩展,因为您使用单引号而不是双引号 - 请参阅 manual regarding strings在 PHP 中。

      $this->db->set('points', 'points + ' . (int) $points);
      

      上面的代码稍微好一点,因为它可能会击败SQL injection,这取决于$points 最初来自哪里。

      【讨论】:

      • 两个建议都会产生查询:UPDATE users SET points = 'points + 1000' WHERE username = 'thomas' 这个查询不起作用...谢谢
      • 你必须查看 CI 手册。似乎 CI 总是将set() 中的给定字符串放在引号中,所以这不能那样工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多