Вставка NOW () в базу данных с активной записью CodeIgniter - PullRequest
75 голосов
/ 15 июня 2011

Я хочу вставить текущее время в базу данных, используя функцию mySQL NOW () в активной записи Codeigniter. Следующий запрос не будет работать:

$data = array(
        'name' => $name ,
        'email' => $email,
        'time' => NOW()
        );
        $this->db->insert('mytable', $data);

Это потому, что класс ActiveRecord CodeIgniter автоматически экранирует входные данные.

Следующее работает нормально, вызывая 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 ]

72 голосов
/ 16 июня 2011

Обычно я использую триггеры для обработки меток времени, но я думаю, что это может сработать.

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

$this->db->set('time', 'NOW()', FALSE);
$this->db->insert('mytable', $data);
32 голосов
/ 15 июня 2011

Если я не сильно ошибаюсь, ответ: «Нет, нет пути».

Основная проблема в подобных ситуациях заключается в том, что вы вызываете функцию MySQL, а на самом деле вы не устанавливаете значение. CI экранирует значения, так что вы можете выполнить чистую вставку, но не проверяет, являются ли эти значения вызывающими функциями, такими как aes_encrypt, md5 или (в данном случае) now(). Хотя в большинстве ситуаций это замечательно, для таких ситуаций единственным подходящим решением является raw sql.

С другой стороны, date('Y-m-d'); должен работать как версия PHP NOW() для MySQL. (Хотя это не будет работать для всех версий SQL).

14 голосов
/ 19 ноября 2013

аспиринемега, просто замените:

$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);
10 голосов
/ 06 января 2014

Это простой способ обработки вставки метки времени

$data = array('created_on' => date('Y-m-d H:i:s'));
7 голосов
/ 03 января 2013

вы можете загрузить помощник по дате и использовать кодовое значение interal сейчас (), если вы хотите сослаться на смещение времени пользователя по Гринвичу

это выглядит примерно так

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

Если вы не используете основные настройки GTM и позволяете своим пользователям устанавливать свои собственные смещения, использование php time () не дает никаких преимуществ.

5 голосов
/ 24 августа 2016
    $data = array(
            'name' => $name ,
            'email' => $email,
            'time' =>date('Y-m-d H:i:s')
            );
            $this->db->insert('mytable', $data);
4 голосов
/ 29 августа 2014

Согласно исходному коду 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');
3 голосов
/ 05 января 2014

Использование помощника по датам сработало для меня

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

Документацию по date_helper можно найти здесь .

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

$this->db->insert('TABLENAME', $data);
3 голосов
/ 26 февраля 2012

помещение NOW () в кавычки не будет работать, так как Active Records поместит escape-NOW () в строку и попытается вставить его в БД в виде строки «NOW ()» ... вам нужно будетиспользуйте

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

для правильной установки.

Вы всегда можете проверить свой sql позже с помощью

$this->db->last_query();
0 голосов
/ 12 мая 2016

запустите запрос, чтобы получить now () из mysql, т.е. выберите now () как nowinmysql;

, затем используйте codeigniter, чтобы получить это, и введите

$data['created_on'] = $row->noinmyssql;
$this->db->insert($data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...