【问题标题】:Inserting NOW() into Database with CodeIgniter's Active Record使用 CodeIgniter 的 Active Record 将 NOW() 插入数据库
【发布时间】:2011-09-15 07:23:34
【问题描述】:

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

【问题讨论】:

  • 超出轨道甚至范围,但您知道使用strtotime 可以获得类似NOW() 的效果吗?例如echo date("N", strtotime('now')); 会给你今天的日期,参考 php.net/strtotime 和 php.net/date

标签: php mysql codeigniter


【解决方案1】:

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

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

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

【讨论】:

  • 有什么方法可以将now() + 1 day 用于活动记录?
  • 有什么方法可以触发空更新?
  • 2015 年 CI2.1.2 也为我工作
  • @AnwarHossain 我正在使用 3.1 版本,它的工作正常,可能还有其他问题。
  • 我使用的是 CI 3.1.8 版本,它工作得非常好:)
【解决方案2】:

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

在这种情况下的基本问题是您正在调用 MySQL 函数而实际上并没有设置值。 CI 对值进行转义,以便您可以进行干净插入,但它不会测试这些值是否恰好正在调用诸如 aes_encryptmd5 或(在这种情况下)now() 之类的函数。虽然在大多数情况下这很好,但对于这些情况,原始 sql 是唯一的资源。

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

【讨论】:

  • 为简单起见,我总是用不同的 ORM 等设置带有 date('Y-m-d H:i:s') 的时间戳,无需与不同的实现作斗争。
  • 就个人而言,我总是使用 Unix 时间戳。我知道 1308124173975 在每种语言和数据库中都将始终是 long(或 int、float 或等效项)。我喜欢不必在意。
  • 这很好。我很懒,所以如果可能的话,我喜欢有人类可读的条目。 :)
  • @jupaju 这只是一种不同类型的懒惰。我可以记住 PgSQL、MySQL、Oracle、Java、PHP 和 Python 是如何存储日期的,或者我可以让一切都是一个糟糕的数字。你知道吗?如果它是一个数字,那么它会立即转换为 AS2、AS3 和 JS。当我需要实际日期时?转到 Chrome,Ctrl-shift-J 并粘贴 String(new Date(/*numeric timestamp*/))
  • 我想指出,使用 date('Y-m-d H:i:s') 可能会出现问题,即 MySQL 服务器和 PHP 库在您不知道的情况下使用两个不同的时区。例如,我的主机在 GMT (+0h) 上有 MySQL,而 PHP 是 EST (-5h)。
【解决方案3】:

阿司匹林,只需替换:

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

【讨论】:

  • 我想指出,根据文档,这是 CodeIgniter 的“推荐方式”。如果您在共享主机上,我建议使用 MySQL 的本机 NOW() 而不是 PHP 的 date('Y-m-d H:i:s'),因为它们可能设置为不同的时区。
  • 是的,理论上您无法决定设计时间,您的基础架构在 3 年后会是什么样子。实际上,我可以,经常这样做,但不应该这样做。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:
        $data = array(
                'name' => $name ,
                'email' => $email,
                'time' =>date('Y-m-d H:i:s')
                );
                $this->db->insert('mytable', $data);
    

    【讨论】:

    • 此答案已被标记为低质量。如果它回答了问题,请考虑添加一些文字来解释它是如何工作的。
    • 为我工作。解释可能会有所帮助,但它确实解决了我的问题。 ?
    • time() 不需要,date() 总是返回当前时间
    【解决方案6】:

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

    看起来有点像这样

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

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

    【讨论】:

    • date() 给出 php 警告不要依赖系统日期
    【解决方案7】:

    根据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');
    

    【讨论】:

      【解决方案8】:

      将 NOW() 放在引号中不起作用,因为 Active Records 会将 NOW() 转义到一个字符串中,并尝试将其作为“NOW()”字符串推送到数据库中......你需要使用

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

      正确设置。

      之后您可以随时检查您的 sql

      $this->db->last_query();
      

      【讨论】:

        【解决方案9】:

        使用为我工作的日期助手

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

        您可以找到date_helper here 的文档。

        $data = array(
          'created' => now(),
          'modified' => now()
        );
        
        $this->db->insert('TABLENAME', $data);
        

        【讨论】:

        • 我认为它是一个死链接
        【解决方案10】:

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

        【讨论】:

          【解决方案11】:

          运行查询以从 mysql 获取 now(),即 select now() as nowinmysql;

          然后使用codeigniter得到这个并放入

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

          【讨论】:

            猜你喜欢
            • 2013-02-18
            • 1970-01-01
            • 2012-06-27
            • 1970-01-01
            • 1970-01-01
            • 2013-08-06
            • 1970-01-01
            • 2014-11-26
            • 1970-01-01
            相关资源
            最近更新 更多