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

时间:2011-07-31 13:49:13

标签: php codeigniter activerecord

我正在使用codeigniter,我在我的模型中有以下功能给用户点。 但它不起作用,而是将points列设置为0。

这是它在codeigniter手册中的编写方式。因此,我不知道为什么它不起作用......

由于

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

3 个答案:

答案 0 :(得分:13)

我相信你必须专门告诉CI 逃避文本。我没有一个CI安装方便测试这个,但我认为它是这样的:

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

答案 1 :(得分:2)

不确定这是您的问题的原因,但您使用的是单引号,如下所示:

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

通过这种方式,$points字符串将按原样注入到您的SQL查询中 - 它不是将要使用的值。


如果您希望{em}插入$points(因此将其值放在该位置,在该字符串中),则必须使用双引号:

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


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

答案 2 :(得分:0)

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

然而,您的set()看起来有缺陷。

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

以前,$points字符串的一部分,由于您使用的是单引号而非双引号,因此不会被$points的内容扩展 - 请参阅PHP中的manual regarding strings

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

上面的代码稍微好一点,因为它会使SQL injection失败,具体取决于$points最初的来源。