Quiero insertar la hora actual en la base de datos usando la función mySQL NOW () en el registro activo de Codeigniter. La siguiente consulta no funcionará:
$data = array(
'name' => $name ,
'email' => $email,
'time' => NOW()
);
$this->db->insert('mytable', $data);
Esto se debe a que la clase ActiveRecord de CodeIgniter escapa automáticamente de la entrada.
Lo siguiente funciona bien, llamando a set () y pasando el parámetro FALSE, para que no escape NOW ().
$data = array(
'name' => $name ,
'email' => $email,
);
$this->db->set('time', 'NOW()', FALSE);
$this->db->insert('mytable', $data);
Sin embargo, mi pregunta es: ¿hay alguna otra forma que no sea esta? Por ejemplo, ¿puedo usarlo de alguna manera agregando todo en la matriz de datos solamente? Por ejemplo, algo como:
$data = array(
'name' => $name ,
'email' => $email,
'time' => NOW(), FALSE
);
php
mysql
codeigniter
romano
fuente
fuente
strtotime
? Por ejemplo,echo date("N", strtotime('now'));
le dará la fecha de hoy, consulte php.net/strtotime y php.net/dateRespuestas:
A menos que esté muy equivocado, la respuesta es: "No, no hay manera".
El problema básico en situaciones como esa es el hecho de que está llamando a una función MySQL y en realidad no está estableciendo un valor. CI escapa valores para que pueda hacer una inserción limpio, pero no prueba para ver si esos valores pasan a estar llamando a funciones como
aes_encrypt
,md5
, o (en este caso)now()
. Si bien en la mayoría de las situaciones esto es maravilloso, para esas situaciones, el único recurso es sql sin formato.Por un lado,
date('Y-m-d');
debería funcionar como una versión de PHPNOW()
para MySQL. (Sin embargo, no funcionará para todas las versiones de SQL).fuente
Normalmente utilizo desencadenadores para manejar las marcas de tiempo, pero creo que esto puede funcionar.
$data = array( 'name' => $name, 'email' => $email ); $this->db->set('time', 'NOW()', FALSE); $this->db->insert('mytable', $data);
fuente
now() + 1 day
alguna manera para registros activos?aspirinemaga, simplemente reemplace:
$this->db->set('time', 'NOW()', FALSE); $this->db->insert('mytable', $data);
para ello:
$this->db->set('time', 'NOW() + INTERVAL 1 DAY', FALSE); $this->db->insert('mytable', $data);
fuente
Esta es la forma fácil de manejar la inserción de la marca de tiempo.
$data = array('created_on' => date('Y-m-d H:i:s'));
fuente
$data = array( 'name' => $name , 'email' => $email, 'time' =>date('Y-m-d H:i:s') ); $this->db->insert('mytable', $data);
fuente
puede cargar el asistente de fecha y usar el interal codeigniter now () si desea hacer referencia al desplazamiento de tiempo GMT de los usuarios
se vería algo así
$data = array( 'created_on' => date('Y-m-d H:i:s',now()) );
Si no usa la configuración maestra de GTM y deja que sus usuarios establezcan sus propias compensaciones, no hay ninguna ventaja sobre el uso de la función time () de php.
fuente
Según el código fuente de codeigniter, la función
set
se define como: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; }
Aparentemente, si
$key
es una matriz, codeigniter simplemente ignorará el segundo parámetro$value
, pero el tercer parámetro$escape
seguirá funcionando durante la iteración de$key
, por lo que en esta situación, los siguientes códigos funcionan (usando el método de cadena):$this->db->set(array( 'name' => $name , 'email' => $email, 'time' => 'NOW()'), '', FALSE)->insert('mytable');
Sin embargo, esto eliminará todos los datos, por lo que puede dividirlos en dos partes:
$this->db->set(array( 'name' => $name , 'email' => $email))->set(array('time' => 'NOW()'), '', FALSE)->insert('mytable');
fuente
poner NOW () entre comillas no funcionará ya que Active Records pondrá el escape NOW () en una cadena e intentará insertarlo en la base de datos como una cadena de "NOW ()" ... necesitará usar
$this->db->set('time', 'NOW()', FALSE);
para configurarlo correctamente.
siempre puede verificar su sql después con
$this->db->last_query();
fuente
Usar el asistente de fecha funcionó para mí
$this->load->helper('date');
Puede encontrar documentación
date_helper
aquí .$data = array( 'created' => now(), 'modified' => now() ); $this->db->insert('TABLENAME', $data);
fuente
$this->db->query("update table_name set ts = now() where 1=1")
¡también funciona para la marca de tiempo actual!fuente
ejecutar la consulta para obtener ahora () desde mysql, es decir, seleccionar ahora () como ahora enmysql;
luego use codeigniter para obtener esto y poner
$data['created_on'] = $row->noinmyssql; $this->db->insert($data);
fuente