2011-07-31 45 views
7

我正在使用codeigniter,并且在我的模型中有以下函数来为用户提供指向。 但是它并不工作,而是将点列设置为0.Codeigniter,通过变量中包含的值增加数据库值

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

感谢

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

回答

10

我相信你必须告诉CI具体到不是转义文字。我没有一个CI安装方便,以测试这,但我想应该是这样的:

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

不知道这是你的问题的原因,但使用的是单引号,在下面几行:

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

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


如果你想$points要插值(所以它的价值放在它的位置,在该字符串),则必须使用双引号:

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


有关变量的详细信息插值,参见PHP手册的Variables parsing部分。

+0

这producse查询:UPDATE'users' SET'points' =“点+ 1000” WHERE'用户名'='托马斯' 哪些行不通..任何进一步的想法? –

+0

看起来像数据库中的'points'字段是一个整数,并且您试图像字符串一样访问它:您的查询应该看起来像'UPDATE users SET points ='points + 1000'WHERE username ='thomas''; ;;也许你有某种方式向CI表明这一点?我不知道CI是否足够帮助更多,抱歉。 –

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最初来自。

+0

这两个建议产生的查询:更新'用户'SET' points' ='points + 1000'其中'用户名'='托马斯' 此查询不起作用... 谢谢 –

+0

您必须检查CI手册然后。看起来好像CI总是将给定的字符串放在'set()'引号中,所以不能这样工作。 – Shi