Я хочу вставить текущее время в базу данных с помощью функции 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);