CodeIgniter UPDATE适用于第一次,但不是连续的AJAX调用

时间:2017-06-18 23:56:51

标签: php mysql sql codeigniter-3

这是最奇怪的问题。如果我将其作为查询字符串写入,我的更新查询将始终如一。这是我的模特功能:

    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']10。表approved中的字段assets是BIT(1)

从控制器功能调用该功能,该功能本身是从ajax调用调用的,该调用发送一组单选按钮点击的更改(&#39; 1&#39;或&#39; 0& #39;)

在查询构建器更新的情况下,我也在捕获affected_rows。第一次执行查询时,affected_rows()= 1.每次此后,affected_rows = 0,并通过检查PHPMyAdmin中的记录,我可以看到该值并不想更改。

1 个答案:

答案 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');