Я хочу вставить текущее время в базу данных, используя функцию 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 );
Если я не ошибаюсь, ответ: «Нет, нет способа».
Основная проблема в таких ситуациях заключается в том, что вы вызываете функцию MySQL, и вы фактически не устанавливаете значение. CI выдает значения, чтобы вы могли сделать чистую вставку, но не тестируете, чтобы увидеть, являются ли эти значения функциями вызова aes_encrypt
, md5
или (в данном случае) now()
. Хотя в большинстве ситуаций это замечательно, для этих ситуаций raw sql является единственным средством обращения.
На стороне, date('Ym-d');
должен работать как версия PHP для NOW()
для MySQL. (Это не будет работать для всех версий SQL, хотя).
Обычно я использую триггеры для обработки временных меток, но я думаю, что это может сработать.
$data = array( 'name' => $name, 'email' => $email ); $this->db->set('time', 'NOW()', FALSE); $this->db->insert('mytable', $data);
аспиринемагу, просто замените:
$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);
вы можете загрузить помощник даты и использовать interlode codeigniter now (), если вы хотите ссылаться на смещение времени по времени пользователя
это выглядит как это
$data = array( 'created_on' => date('Ymd H:i:s',now()) );
Если вы не используете основные настройки GTM и не позволяете своим пользователям устанавливать свои собственные смещения, нет преимущества перед использованием функции time () php.
Это простой способ обработки ввода временных меток
$data = array('created_on' => date('Ymd H:i:s'));
включение NOW () в кавычки не будет работать, так как активные записи помещают escape NOW () в строку и пытаются вставить ее в db как строку «NOW ()» … вам нужно будет использовать
$this->db->set('time', 'NOW()', FALSE);
чтобы установить его правильно.
вы всегда можете проверить свой sql после
$this->db->last_query();
Согласно исходному коду 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');
$data = array( 'name' => $name , 'email' => $email, 'time' =>date('Ymd H:i:s',time()) ); $this->db->insert('mytable', $data);
Использование помощника даты работало для меня
$this->load->helper('date');
Здесь вы можете найти документацию для date_helper
.
$data = array( 'created' => now(), 'modified' => now() ); $this->db->insert('TABLENAME', $data);
$this->db->query("update table_name set ts = now() where 1=1")
также работает для текущего штампа времени!
выполнить запрос для получения now () из mysql, т.е. select now () как nowinmysql;
затем используйте codeigniter, чтобы получить это и вставить
$data['created_on'] = $row->noinmyssql; $this->db->insert($data);