【问题标题】:Codeigniter increase value in database from array with only one component escapedCodeigniter 从数组中增加数据库中的值,仅转义一个组件
【发布时间】:2019-12-17 03:25:15
【问题描述】:

我需要增加 CodeIgniter 数据库中某个字段的值。

我了解 CI 不允许转义值,将 $this->db->set() 中的第三个参数设置为 FALSE。

我正在从一个数组中插入多个数据,据我所知,将它们全部转义(数据来自表单)并不安全,因为我只需要在一个字段中增加。

如何避免单独插入此值?

我当前的代码:

$dataCliente = array(
    'nombre'          => $nombre,
    'email'           => $email,
    'genero'          => $genero,
    'reserva_next'    => $fecha,
    'reserva_next_id' => $reserva_id,
    'reserva_lastreq' => time(),
    'reservas'        => "reservas+1"
);
$this->db->where('telefono', $telefono);
$this->db->update('clientes', $dataCliente);

编辑:我已经用简单和双引号进行了测试,在这两种情况下,字段的值都保存为 0(零)

前面的代码没有产生预期的结果。但这有效:

$dataCliente = array(
    'nombre'          => $nombre,
    'email'           => $email,
    'genero'          => $genero,
    'reserva_next'    => $fecha,
    'reserva_next_id' => $reserva_id,
    'reserva_lastreq' => time(),
    //'reservas'        => "reservas+1"
);
$this->db->where('telefono', $telefono);
$this->db->update('clientes', $dataCliente);


$this->db->set('reservas', 'reservas+1', FALSE);
$this->db->where('telefono', $telefono);
$this->db->update('clientes', $dataCliente);

我的意图是只使用一个语句来插入数据。 使用第一个代码是否可以不转义数组的单个元素?

非常感谢!

【问题讨论】:

  • 试试 'reservas' => 'reservas'+ 1'
  • @DevsiOdedra 您的值似乎格式不正确,只剩下一个引号。你能纠正它来测试它吗?谢谢!
  • refer stackoverflow.com/a/20183089/6309457 有值 ib set ,在数组中使用该值
  • @DevsiOdedra 更改为:'reservas' => '`reservas`+1' 但在更新时,该值设置为 0(零)
  • 我想知道为什么在您的“工作”示例中,您执行了两次更新?您只需要数组和最后 3 个语句即可。

标签: php codeigniter codeigniter-3 query-builder codeigniter-query-builder


【解决方案1】:

简单的答案是否定的。这是一个非常简单的数组。

可以看到 SET 语句有 3 个参数。你打算如何将它添加到你的数据数组中。

其他原因可能是......

  1. 使用 set with false 已经涵盖了这一点。
  2. 在数组中添加更多字段并必须对其进行解析以确定哪个字段需要 false 标志是一件非常痛苦的事情。

按照你的方式使用 Set 是完全可以接受的,当你在你的情况下考虑它时......

每次对条目执行更新时,您总是会增加 "reservas" 值。这不是而且绝对不应该是您希望从表单更新的“数据”的一部分。它是更新本身的功能。

所以那种导致...让我们做一个函数。这不是您问题答案的一部分,但我已将其添加为简单的思考。

你可以把它放在你喜欢的任何地方,但为了简单起见,我假设你有一个客户端控制器,我会在这个例子中把它全部放在那里......

所以设置你的 $telefono 和 $dataCliente,因为只有你知道它们来自哪里......然后创建一个简单的单个函数。

private function update_client_details($data, $telefono) {
    $this->db->set('reservas', 'reservas+1', FALSE);
    $this->db->where('telefono', $telefono);
    $this->db->update('clientes', $data);
}

并调用上述方法进行更新。它已成为一个声明。

如果它在控制器中,最好将其设为私有。在模型中,它需要是公开的。

【讨论】:

  • 嘿!我将在我的方法中使用函数的内容,正如你在comment 中推荐的那样。关于数据的更新,该部分仅在与插入数据相关的条件下执行,而不是在更新时执行(数据正在插入另一个表中,如果客户端已经存在则增加值,否则值保持不变如 1)。非常感谢您的回答。
【解决方案2】:

使用单引号而不是双引号

$dataCliente = array(
    'nombre'          => $nombre,
    'email'           => $email,
    'genero'          => $genero,
    'reserva_next'    => $fecha,
    'reserva_next_id' => $reserva_id,
    'reserva_lastreq' => time(),
    'reservas'        => 'reservas+1'
);

查看此link 了解更多信息

【讨论】:

  • 嗨!谢谢您的回复。更改为单引号对我不起作用。使用单引号将值更改为0(我的字段类型是INT),所以在获取零值时,我想是由于插入了错误的值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多