web-dev-qa-db-fra.com

Insertion de NOW () dans la base de données avec l'enregistrement actif de CodeIgniter

Je veux insérer l'heure actuelle dans la base de données à l'aide de la fonction mySQL NOW () dans l'enregistrement actif de Codeigniter. La requête suivante ne fonctionnera pas:

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

En effet, la classe ActiveRecord de CodeIgniter échappe automatiquement à l’entrée.

Ce qui suit fonctionne bien, en appelant set () et en passant le compteur de mesure FALSE, afin qu’il n’échappe pas à NOW ().

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

Cependant, ma question est la suivante: existe-t-il un autre moyen? Par exemple, si je peux utiliser d'une manière ou d'une autre en ajoutant tout dans le tableau de données uniquement? Par exemple, quelque chose comme:

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

À moins que je ne me trompe énormément, la réponse est: "Non, il n'y a pas moyen."

Le problème fondamental dans ce genre de situation est le fait que vous appelez une fonction MySQL sans définir de valeur. CI échappe aux valeurs pour vous permettre d'effectuer une insertion propre, mais ne vérifie pas si ces valeurs appellent des fonctions telles que aes_encrypt, md5 ou (dans ce cas) now(). Bien que, dans la plupart des situations, cela soit merveilleux, pour ces situations, le sql brut est le seul recours.

D'un côté, date('Y-m-d'); devrait fonctionner comme une version PHP de NOW() pour MySQL. (Cela ne fonctionnera pas pour toutes les versions de SQL cependant).

32
cwallenpoole

J'utilise généralement des déclencheurs pour gérer les horodatages, mais je pense que cela peut fonctionner.

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

$this->db->set('time', 'NOW()', FALSE);
$this->db->insert('mytable', $data);
70
Bill H

aspirinemaga, remplacez simplement:

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

pour ça:

$this->db->set('time', 'NOW() + INTERVAL 1 DAY', FALSE);
$this->db->insert('mytable', $data);
12
Bruno Rigolon

C'est le moyen facile de gérer l'insertion d'horodatage 

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

vous pouvez charger l'assistant de date et utiliser le codeigniter interal now () si vous souhaitez référencer le décalage horaire de l'utilisateur GMT

ça ressemble un peu à ça

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

Si vous n'utilisez pas les paramètres principaux GTM et laissez vos utilisateurs définir leurs propres compensations, l'utilisation de la fonction time () de php ne présente aucun avantage.

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

mettre NOW () entre guillemets ne fonctionnera pas, car Active Records mettra d'échappement NOW () dans une chaîne et essaiera de l'insérer dans la base de données sous la forme d'une chaîne de "NOW ()" 

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

pour le définir correctement.

vous pouvez toujours vérifier votre sql après avec

$this->db->last_query();
3
williamli

Selon le code source de codeigniter, la fonction set est définie comme suit:

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

Apparemment, si $key est un tableau, codeigniter ignorera simplement le deuxième paramètre $value, mais le troisième paramètre $escape fonctionnera tout au long de l'itération de $key. Dans cette situation, les codes suivants fonctionnent (en utilisant la méthode de chaîne):

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

Cependant, toutes les données seront évacuées de sorte que vous puissiez diviser vos données en deux parties:

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

À l'aide de l'aide de date a travaillé pour moi

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

Vous pouvez trouver de la documentation pour date_helperhere .

$data = array(
  'created' => now(),
  'modified' => now()
);

$this->db->insert('TABLENAME', $data);
3
Brandon Hollenbeck

$this->db->query("update table_name set ts = now() where 1=1") fonctionne également pour l'horodatage actuel!

0
user3526

lance la requête pour obtenir now () de mysql i.e sélectionnez now () as nowinmysql;

puis utilisez codeigniter pour obtenir cela et mettre en 

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