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

Rom*_*man 77 php mysql codeigniter

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

$data = array(
        'name' => $name ,
        'email' => $email,
        'time' => NOW()
        );
        $this->db->insert('mytable', $data);
Run Code Online (Sandbox Code Playgroud)

这是因为CodeIgniter的ActiveRecord类会自动转义输入.

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

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

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

$data = array(
            'name' => $name ,
            'email' => $email,
            'time' => NOW(), FALSE
            );
Run Code Online (Sandbox Code Playgroud)

Bil*_*l H 73

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

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

$this->db->set('time', 'NOW()', FALSE);
$this->db->insert('mytable', $data);
Run Code Online (Sandbox Code Playgroud)

  • 我刚刚确认这适用于CI 2.1.2 (6认同)

cwa*_*ole 32

除非我大错特错,答案是"不,没有办法."

在这种情况下的基本问题是你正在调用MySQL函数,而你实际上并没有设置一个值.CI逃脱值,这样你可以做一个干净的插入,但它并没有测试,看看这些值碰巧被调用函数一样aes_encrypt,md5或(在这种情况下)now().虽然在大多数情况下这很好,但对于那些情况,原始sql是唯一的办法.

另一方面,date('Y-m-d');应该作为NOW()MySQL 的PHP版本.(但它不适用于所有版本的SQL).

  • 为简单起见,我总是设置带有不同ORM等的日期('Ymd H:i:s')的时间戳,不需要对抗不同的实现. (22认同)
  • 我想要注意的是,使用日期('Ymd H:i:s')可能会遇到一个问题,即MySQL服务器和PHP库在没有您知道的情况下使用两个不同的时区.例如,我有一个主机在GMT(+ 0h)上有MySQL,而PHP是EST(-5h). (4认同)
  • 就个人而言,我总是使用Unix时间戳.我知道1308124173975将始终是每个语言和数据库中的long(或int,或float,或等效).我不想在乎. (2认同)

小智 14

aspirinemaga,只需替换:

$this->db->set('time', 'NOW()', FALSE);
$this->db->insert('mytable', $data);
Run Code Online (Sandbox Code Playgroud)

为了它:

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

  • 我想指出,根据文档,这是CodeIgniter"推荐方式".如果您在共享主机上,我建议使用MySQL的本机NOW()而不是PHP的日期('Ymd H:i:s'),因为它们可能设置为不同的时区. (2认同)

sau*_*ble 12

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

$data = array('created_on' => date('Y-m-d H:i:s'));
Run Code Online (Sandbox Code Playgroud)


san*_*mar 8

    $data = array(
            'name' => $name ,
            'email' => $email,
            'time' =>date('Y-m-d H:i:s')
            );
            $this->db->insert('mytable', $data);
Run Code Online (Sandbox Code Playgroud)

  • 为我工作。解释可能会有所帮助,但确实解决了我的问题。 (3认同)

Ste*_*ven 7

如果要引用用户GMT时间偏移量,可以加载日期助手并使用codeigniter interal now()

它看起来有点像这样

$data = array(
'created_on' => date('Y-m-d H:i:s',now())
);
Run Code Online (Sandbox Code Playgroud)

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