Вставка NOW() в базу данных с активной записью CodeIgniter

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

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

Это потому, что класс CodeIgniters 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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

вы можете загрузить помощник даты и использовать interign codeigniter now(), если вы хотите ссылаться на смещение времени по времени пользователя

это woulk выглядит несколько как это

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

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

Ответ 5

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

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

Ответ 6

удержание NOW() в кавычках не будет работать, так как Active Records поместит escape NOW() в строку и попытается вставить его в db как строку "NOW()"... вам нужно будет используйте

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

чтобы установить его правильно.

вы всегда можете проверить свой sql после

$this->db->last_query();

Ответ 7

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

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

Вы можете найти документацию для date_helper здесь.

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

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

Ответ 8

В соответствии с исходным кодом 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');

Ответ 9

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

Ответ 10

$this->db->query("update table_name set ts = now() where 1=1") также работает для текущего штампа времени!

Ответ 11

запустить запрос для получения now() из mysql i.e select now() as nowinmysql;

затем используйте codeigniter для его получения и введите

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