这是最奇怪的问题。如果我将其作为查询字符串写入,我的更新查询将始终如一。这是我的模特功能:
public function approveListing($params)
{
//This always works.
$sql = "UPDATE `assets` set approved = ".$params['approved']." WHERE as_id = ".$params['as_id']."";
$this->db->query($sql);
// and I use this select query to detect the actual updated value change.
$this->db->select('approved');
$this->db->where('as_id', $params['as_id']);
$query = $this->db->get('assets');
foreach($query->result() as $row)
{
$params['approved'] = $row->approved;
}
return $params;
}
...输出看起来像这样:
as_id = 260
approved = 1 (or 0, if the input param is 0)
但是如果我使用查询构建器方法而不是sql字符串,它只能使用一次:
public function approveListing($params)
{
// This only works on the first ajax call. After that, no update occurs.
$this->db->set('approved', $params['approved']); // this will be a value of 1 or 0
$this->db->where('as_id', $params['as_id']);
$this->db->update('assets');
$params['updated'] = $this->db->affected_rows();
// and I use this select query to detect the actual updated value change.
$this->db->select('approved');
$this->db->where('as_id', $params['as_id']);
$query = $this->db->get('assets');
foreach($query->result() as $row)
{
$params['approved'] = $row->approved;
}
return $params;
}
...输出看起来像这样:
as_id = 260
approved = 1
updated = 0 <!- notice this is the affected_rows() value. :( ->
$params['approved']
是1
或0
。表approved
中的字段assets
是BIT(1)
从控制器功能调用该功能,该功能本身是从ajax调用调用的,该调用发送一组单选按钮点击的更改(&#39; 1&#39;或&#39; 0& #39;)
在查询构建器更新的情况下,我也在捕获affected_rows。第一次执行查询时,affected_rows()= 1.每次此后,affected_rows = 0,并通过检查PHPMyAdmin中的记录,我可以看到该值并不想更改。
答案 0 :(得分:2)
嗯,我真的不喜欢回答我自己的问题,但是因为我确实找到了答案,而且因为这个问题(虽然很少见)不是“太本地化”,但实际上是其他编码器会遇到的问题如果他们试图更新MySQL数据类型BIT(为什么我们没有看到很多关于数据类型BIT的问题是因为它是最新的MySQL或MariaDB数据类型之一),这就是正在发生的事情。
CodeIgniter查询构建器使用单引号包装值,如下所示:
UPDATE `assets` set approved = '1' WHERE as_id = 260
MySQL不喜欢这样。您可以手写您的查询,如下所示:
$sql = "UPDATE `assets` set approved = ".$params['approved']." WHERE as_id = ".$params['as_id']."";
$this->db->query($sql);
......但这不是一个好的解决方案,而是一个结账。查询构建器应该可以工作。
你要做的是将值声明为INT,你这样做是这样的:
$this->db->set('approved', (int) $params['approved']);
$this->db->where('as_id', $params['as_id']);
$this->db->update('assets');