Codeigniter,通过变量中包含的值增加数据库值

Posted

技术标签:

【中文标题】Codeigniter,通过变量中包含的值增加数据库值【英文标题】:Codeigniter, increase database value by value contained in variable 【发布时间】: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";

【问题讨论】:

【参考方案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() 中的给定字符串放在引号中,所以这不能那样工作。

以上是关于Codeigniter,通过变量中包含的值增加数据库值的主要内容,如果未能解决你的问题,请参考以下文章

在列表中包含的值中定义固定位置

通过更改代码格式来计算结构向量中包含的双变量的平均值的不同结果?

增加文本文件中包含的版本号

如何以简单的方式更改堆上 QVector 数组中包含的对象的值?

会话数据问题编号的值没有增加并在 codeigniter 项目中传递

从类中包含的结构访问变量