使用CodeIgniter的Active Record将NOW()插入数据库

时间:2011-06-15 07:17:07

标签: php mysql codeigniter

我想在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
            );

11 个答案:

答案 0 :(得分:71)

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

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

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

答案 1 :(得分:32)

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

在这种情况下的基本问题是你正在调用MySQL函数,而你实际上并没有设置一个值。 CI转义值,以便您可以执行干净的插入,但它不会测试这些值是否恰好调用aes_encryptmd5或(在这种情况下)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);