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

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

Solutions Collecting From Web of "Вставка NOW () в базу данных с активной записью CodeIgniter"

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

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