我想在Codeigniter的活动记录中使用mySQL函数NOW()在数据库中插入当前时间。以下查询不起作用:
$data = array(
'name' => $name ,
'email' => $email,
'time' => NOW()
);
$this->db->insert('mytable', $data);
这是因为CodeIgniter的ActiveRecord类会自动转义输入。
以下工作正常,通过调用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
);
答案 0 :(得分:71)
我通常使用触发器来处理时间戳,但我认为这可行。
$data = array(
'name' => $name,
'email' => $email
);
$this->db->set('time', 'NOW()', FALSE);
$this->db->insert('mytable', $data);
答案 1 :(得分:32)
除非我大错特错,答案是“不,没有办法。”
在这种情况下的基本问题是你正在调用MySQL函数,而你实际上并没有设置一个值。 CI转义值,以便您可以执行干净的插入,但它不会测试这些值是否恰好调用aes_encrypt
,md5
或(在这种情况下)now()
等函数。虽然在大多数情况下这是很好的,但对于那些情况,原始的SQL是唯一的办法。
另一方面,date('Y-m-d');
应该作为MySQL的NOW()
的PHP版本。 (但它不适用于所有版本的SQL。)
答案 2 :(得分:14)
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);
答案 3 :(得分:9)
这是处理时间戳插入的简便方法
$data = array('created_on' => date('Y-m-d H:i:s'));
答案 4 :(得分:7)
如果要引用用户GMT时间偏移,可以加载日期帮助器并使用codeigniter interal now()
它看起来有点像这样$data = array(
'created_on' => date('Y-m-d H:i:s',now())
);
如果你不使用GTM主设置并让你的用户设置他们自己的偏移,那么使用php的time()函数没有任何优势。
答案 5 :(得分:5)
$data = array(
'name' => $name ,
'email' => $email,
'time' =>date('Y-m-d H:i:s')
);
$this->db->insert('mytable', $data);
答案 6 :(得分:4)
根据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');
答案 7 :(得分:3)
将NOW()放在引号中将无法正常工作,因为Active Records会将NOW()转义为字符串并尝试将其作为“NOW()”字符串推送到数据库中...您将需要使用
$this->db->set('time', 'NOW()', FALSE);
正确设置。
您可以随后使用
检查您的SQL$this->db->last_query();
答案 8 :(得分:3)
使用日期助手为我工作
$this->load->helper('date');
您可以找到date_helper
here的文档。
$data = array(
'created' => now(),
'modified' => now()
);
$this->db->insert('TABLENAME', $data);
答案 9 :(得分:0)
$this->db->query("update table_name set ts = now() where 1=1")
也适用于当前时间戳!
答案 10 :(得分:0)
运行查询从mysql获取now(),即选择now()as nowinmysql;
然后使用codeigniter来获取并放入
$data['created_on'] = $row->noinmyssql;
$this->db->insert($data);