使用CodeIgniter的活动记录将NOW()插入数据库


78

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

1
超出了范围,甚至超出了范围,但是您知道可以使用NOW()获得类似效果strtotime吗?有关例如echo date("N", strtotime('now'));将给您今天的日期的信息,请参考php.net/strtotime和php.net/date
Kumar

Answers:


32

除非我犯了个大错,否则答案是:“没有,没有办法。”

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

一方面,date('Y-m-d');应作为NOW()MySQL的PHP版本使用。(尽管它不适用于所有版本的SQL)。


22
为简单起见,我始终使用具有不同ORM等的date('Ymd H:i:s')设置时间戳,而无需与其他实现进行斗争。
geekuality 2011年

2
就个人而言,我总是使用Unix时间戳。我知道1308124173975在每种语言和数据库中都将始终是long型(或int或float或等效)。我喜欢不必在意。
cwallenpoole 2011年

1
那是个很好的观点。我很懒,所以如果可能的话,我喜欢可读的条目。:)
geekuality 2011年

1
@jupaju这只是另一种懒惰。我可能还记得PgSQL,MySQL,Oracle,Java,PHP和Python如何存储日期,或者我只是将所有内容都变成了一个糟透了的数字。你知道吗?如果是数字,那么它将立即转换为AS2,AS3和JS。而当我需要实际日期时?转到Chrome,Ctrl-shift-J并粘贴String(new Date(/ * numeric timestamp * /))
cwallenpoole 2011年

4
我想指出,使用date('Ymd H:i:s')可能会出现一个问题,即MySQL服务器和PHP库正在使用两个不同的时区,而您却没有意识到。例如,我有一个主机,该主机在GMT(+ 0h)上具有MySQL,而PHP是EST(-5h)。
bafromca 2014年

76

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

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

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

有什么办法可以使用now() + 1 day主动记录吗?
aspirinemaga

有什么办法可以触发空更新吗?
Edeph 2014年

1
我也工作过,2015
CI2.1.2

1
@AnwarHossain我正在使用3.1版及其工作版本,可能还有其他问题。
穆罕默德

1
我使用的是CI版本3.1.8,它的工作
原理

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);

2
我想指出,根据文档,这是CodeIgniter的“推荐方式”。如果您位于共享主机上,我建议使用MySQL的本机NOW()而不是PHP的date('Ymd H:i:s'),因为它们可能设置为不同的时区。
bafromca 2014年


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

该答案被标记为低质量。如果它回答了问题,请考虑添加一些文本以解释其工作原理。
lmo

3
为我工作。解释可能会有所帮助,但确实解决了我的问题。😁–
约旦

不需要time(),date()总是返回当前时间
Loki

7

如果您要引用用户GMT时间偏移,则可以加载日期帮助器并使用codeigniter中间now()

它看起来会像这样

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

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


date()发出php警告不要依赖系统日期
pankijs 2015年

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,因此在这种情况下,以下代码可以工作(使用chain方法):

$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');

3

将NOW()放在引号中将不起作用,因为Active Records会将NOW()放入字符串中,并尝试将其作为字符串“ NOW()”推入数据库中……您将需要使用

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

正确设置。

你总是可以在之后检查你的sql

$this->db->last_query();

3

使用约会助手对我有用

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

您可以在date_helper 此处找到文档。

$data = array(
  'created' => now(),
  'modified' => now()
);

$this->db->insert('TABLENAME', $data);

我认为它是一个死链接
安瓦尔·侯赛因

0

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


0

运行查询从mysql获取now(),即选择now()作为nowinmysql;

然后使用codeigniter获取并放入

$data['created_on'] = $row->noinmyssql;
$this->db->insert($data);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.