使用CodeIgniter的活动logging将NOW()插入到数据库中

我想在Codeigniter的活动logging中使用mySQL函数NOW()在数据库中插入当前时间。 以下查询将不起作用:

$data = array( 'name' => $name , 'email' => $email, 'time' => NOW() ); $this->db->insert('mytable', $data); 

这是因为CodeIgniter的ActiveRecord类自动转义input。

以下工作正常,通过调用set()并传递peratmeter FALSE,以便它不会转义NOW()。

 $data = array( 'name' => $name , 'email' => $email, ); $this->db->set('time', 'NOW()', FALSE); $this->db->insert('mytable', $data); 

不过,我的问题是,除此之外还有其他的方法吗? 例如,如果我可以以某种方式使用通过添加数据数组中的所有内容? 例如,像这样的东西:

 $data = array( 'name' => $name , 'email' => $email, 'time' => NOW(), FALSE ); 

除非我大错特错,否则答案是“不,没有办法”。

在这种情况下的基本问题是,你正在调用一个MySQL函数,而你实际上并没有设置一个值。 CI转义值,以便您可以做一个干净的插入,但它不testing,看看这些值是否正在调用函数,如aes_encryptmd5 ,或(在这种情况下) now() 。 虽然在大多数情况下,这是美好的,对于那些情况下原始sql是唯一的办法。

在一边, date('Ym-d'); 应该作为MySQL的NOW()的PHP版本。 (虽然它不适用于所有版本的SQL)。

我通常使用触发器来处理时间戳,但我认为这可能工作。

 $data = array( 'name' => $name, 'email' => $email ); $this->db->set('time', 'NOW()', FALSE); $this->db->insert('mytable', $data); 

aspirinemaga,只是取代:

 $this->db->set('time', 'NOW()', FALSE); $this->db->insert('mytable', $data); 

为了它:

 $this->db->set('time', 'NOW() + INTERVAL 1 DAY', FALSE); $this->db->insert('mytable', $data); 

你可以加载date帮助器并使用codeigniter interal now()如果你想引用用户的GMT时间偏移量

它看起来有点像这样

 $data = array( 'created_on' => date('Ymd H:i:s',now()) ); 

如果您不使用GTM主设置并让用户设置自己的偏移量,那么使用php的time()函数没有任何优势。

这是处理时间戳插入的简单方法

 $data = array('created_on' => date('Ymd H:i:s')); 

将NOW()放在引号中将不起作用,因为Active Records会将NOW()转义为string并尝试将其作为“NOW()”string推送到数据库中…您将需要使用

 $this->db->set('time', 'NOW()', FALSE); 

正确设置。

你可以随时检查你的SQL

 $this->db->last_query(); 

根据codeigniter的源代码,函数set定义如下:

 public function set($key, $value = '', $escape = TRUE) { $key = $this->_object_to_array($key); if ( ! is_array($key)) { $key = array($key => $value); } foreach ($key as $k => $v) { if ($escape === FALSE) { $this->ar_set[$this->_protect_identifiers($k)] = $v; } else { $this->ar_set[$this->_protect_identifiers($k, FALSE, TRUE)] = $this->escape($v); } } return $this; } 

显然,如果$key是一个数组,codeigniter将简单地忽略第二个参数$value ,但是第三个参数$escape仍然可以在整个$key迭代中工作,所以在这种情况下,下面的代码可以工作(使用链式方法) :

 $this->db->set(array( 'name' => $name , 'email' => $email, 'time' => 'NOW()'), '', FALSE)->insert('mytable'); 

但是,这样会忽略所有数据,因此可以将数据分为两部分:

 $this->db->set(array( 'name' => $name , 'email' => $email))->set(array('time' => 'NOW()'), '', FALSE)->insert('mytable'); 

使用date帮手为我工作

 $this->load->helper('date'); 

你可以在这里finddate_helper文档。

 $data = array( 'created' => now(), 'modified' => now() ); $this->db->insert('TABLENAME', $data); 
  $data = array( 'name' => $name , 'email' => $email, 'time' =>date('Ymd H:i:s',time()) ); $this->db->insert('mytable', $data); 

$this->db->query("update table_name set ts = now() where 1=1")也适用于当前时间戳!

运行查询从MySQL获取now(),即selectnow()作为nowinmysql;

然后使用codeigniter来获得这个并放入

 $data['created_on'] = $row->noinmyssql; $this->db->insert($data);