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




mysql error (10)

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

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

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

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.


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


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

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

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

Algo importante que agregar: cuando se usa INSERT IGNORE y tienes violaciones clave, ¡MySQL NO genera una advertencia!

Si intenta, por ejemplo, insertar 100 registros a la vez, con uno defectuoso, obtendría el modo interactivo:

Query OK, 99 rows affected (0.04 sec)

Records: 100 Duplicates: 1 Warnings: 0

Como ves: ¡No hay advertencias! Este comportamiento incluso se describe erróneamente en la documentación oficial de Mysql.

Si su script necesita ser informado, si no se han agregado algunos registros (debido a violaciones clave), debe llamar a mysql_info () y analizarlo para el valor de "Duplicados".







php mysql codeigniter