gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:58:32 26 4
gpt4 key购买 nike

这是最奇怪的问题。如果我将其写为查询字符串,我的更新查询将始终有效。这是我的模型函数:

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

该函数是从 Controller 函数调用的,该函数本身是从 ajax 调用调用的,该调用发送一组单选按钮单击的更改(“1”或“0”)。

在查询生成器更新的情况下,我还捕获了受影响的行。我第一次执行查询时,affected_rows() = 1。此后每次,affected_rows = 0,通过检查PHPMyAdmin中的记录,我可以看到该值不想改变。

最佳答案

嗯,我真的不喜欢回答我自己的问题,但是因为我确实找到了答案,而且这个问题(虽然很少见)并不是“太本地化”,而是事实上其他程序员会遇到的问题如果他们尝试更新 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');

关于php - CodeIgniter UPDATE 适用于第一次调用,但不适用于连续的 AJAX 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44620607/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com