CodeIgniter 查询:如何将列值移动到同一行中的另一列并将当前时间保存在原始列中?

Posted

技术标签:

【中文标题】CodeIgniter 查询:如何将列值移动到同一行中的另一列并将当前时间保存在原始列中?【英文标题】:CodeIgniter query: How to move a column value to another column in the same row and save the current time in the original column? 【发布时间】:2013-09-12 13:44:25 【问题描述】:

在我的数据库表中,我有两个日期时间列:LastCurrent。这些列允许我跟踪某人上次使用有效登录到我正在构建的服务的时间。

使用 CodeIgniter 的活动记录,是否可以更新一行以使 Last 值接收 Current 值,然后将 Current 值替换为当前日期时间?

【问题讨论】:

这可能会有所帮助:***.com/questions/2758415/… 【参考方案1】:

试试这样:

$data = array('current_login' => date('Y-m-d H:i:s'));
$this->db->set('last_login', 'current_login', false);
$this->db->where('id', 'some_id');
$this->db->update('login_table', $data);

特别注意set() 调用的第三个参数。 false 阻止 CodeIgniter 引用第二个参数——这允许将值视为表列而不是字符串值。对于不需要特殊处理的任何数据,您可以将所有这些声明集中到 $data 数组中。

以上代码生成的查询:

UPDATE `login_table`
SET last_login = current_login, `current_login` = '2018-01-18 15:24:13'
WHERE `id` = 'some_id'

【讨论】:

如果需要执行的话怎么办$this->db->set('some_column','some_column+$some_data'); @krishnachalise 如果是要添加的号码,$this->db->set('some_column','some_column+$some_data',false) 或者如果要连接字符串,$this->db->set('some_column','CONCAT(some_column,\''.$some_data.'\')',false); 如果只想移动列而不更新 current_login 日期怎么办。像 $this->db->update('login_table', $data); 这样的语句会是什么? ?【参考方案2】:
$data = array( 
    'name'      => $_POST['name'] , 
    'groupname' => $_POST['groupname'], 
    'age'       => $_POST['age']
);

$this->db->where('id', $_POST['id']);

$this->db->update('tbl_user', $data);

【讨论】:

无关答案?? 我同意@Loki 这个答案并不试图解决所提出的问题。这只是用用户提交的数据更新一行。 Rajeev 适当回答的问题是如何使用同一行中另一列的值更新一个列值。这个答案完全是错误的(或者是旋转它的积极方式——这是对另一个问题的正确答案。此外,这是一个纯代码答案,这意味着它是 *** 上的低价值帖子。【参考方案3】:

如果您只想升级表格行的单个列,则可以使用如下:

$this->db->set('column_header', $value); //value that used to update column  
$this->db->where('column_id', $column_id_value); //which row want to upgrade  
$this->db->update('table_name');  //table name

【讨论】:

这个答案并不试图解决所提出的问题。这只是用变量中的值更新一行。 Rajeev 适当回答的问题是如何使用同一行中另一列的值更新一个列值。这个答案完全是错误的(或者说它是积极的方式——这是对另一个问题的正确答案。【参考方案4】:

是的,这是可能的,我想提供一个轻微的替代 Rajeev 的答案,它不会将 php 生成的日期时间格式的字符串传递给查询。

关于如何在 UPDATE 查询中声明要设置的值的重要区别是它们不能被引用为文字字符串。

要防止 CodeIgniter 自动执行此“优惠”,请使用带有第三个参数 falseset() 方法。

$userId = 444;
$this->db->set('Last', 'Current', false);
$this->db->set('Current', 'NOW()', false);
$this->db->where('Id', $userId);
// return $this->db->get_compiled_update('Login');  // uncomment to see the rendered query
$this->db->update('Login');
return $this->db->affected_rows();  // this is expected to return the integer: 1

生成的查询(取决于您的数据库适配器)如下所示:

UPDATE `Login` SET Last = Current, Current = NOW() WHERE `Id` = 444

查询有效的证明:https://www.db-fiddle.com/f/vcc6PfMcYhDD87wZE5gBtw/0

在这种情况下,LastCurrentmysql 关键字,但它们不是保留关键字,因此它们不需要 反引号。

如果您的精确查询需要正确引用标识符(表/列名),那么总是有protectIdentifiers()。

【讨论】:

以上是关于CodeIgniter 查询:如何将列值移动到同一行中的另一列并将当前时间保存在原始列中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将列值从存储过程中的另一个表更新到表中?

如何仅将列值插入前一千行

spark将列值作为sql查询执行

SQL:将列值链接到列名以满足某些条件

将列值除以 impala 中的总行数

SQL查询将列值显示为表中的列名