我正在使用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";
}
答案 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
最初的来源。