query example error ejecutar consulta php mysql codeigniter

php - example - Insertar NOW() en la base de datos con el registro activo de CodeIgniter



query codeigniter example (11)

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 peratómetro FALSE, para que no escape el 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 manera que esto? Por ejemplo, si puedo usar de alguna manera el uso agregando todo en la matriz de datos solamente? Por ejemplo, algo como:

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


A menos que esté muy equivocado, la respuesta es: "No, no hay forma".

El problema básico en situaciones como esa es el hecho de que está llamando a una función MySQL y no está realmente estableciendo un valor. CI escapa de los valores para que pueda hacer una inserción limpia, pero no prueba para ver si esos valores llaman 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 sql en bruto es el único recurso.

Por un lado, la date(''Ym-d''); debería funcionar como una versión PHP de NOW() para MySQL. (Sin embargo, no funcionará para todas las versiones de SQL).


De acuerdo con el código fuente de codeigniter, el set funciones 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 liberará todos los datos, por lo que puede dividir sus datos en dos partes:

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


Esta es la manera más fácil de manejar la inserción de la marca de tiempo

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


Normalmente utilizo desencadenadores para manejar 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);


Poner AHORA () entre comillas no funcionará ya que los Registros Activos colocarán el escape AHORA () en una cadena e intenta insertarlo en el DB como una cadena de "AHORA ()" ... necesitarás usar

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

para configurarlo correctamente

siempre puede verificar su sql después con

$this->db->last_query();


Usar el fechador me funcionó

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

Puede encontrar documentación para date_helper here .

$data = array( ''created'' => now(), ''modified'' => now() ); $this->db->insert(''TABLENAME'', $data);


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


ejecutar la consulta para obtener ahora () de mysql, es decir, seleccionar ahora () como nowinmysql;

luego usa codeigniter para obtener esto y poner

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


puede cargar el helper de fecha y usar el codificador de señal interal ahora () si desea hacer referencia al tiempo de compensación de tiempo de los usuarios

se vería algo como esto

$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 propios desplazamientos, no hay ventaja sobre el uso de la función de tiempo de php ().


$this->db->query("update table_name set ts = now() where 1=1") también funciona para la marca de tiempo actual.


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