wake-up-neo.net

Einfügen von NOW () in die Datenbank mit dem aktiven Datensatz von CodeIgniter

Ich möchte die aktuelle Zeit in die Datenbank einfügen, indem Sie die mySQL-Funktion NOW () im aktiven Datensatz von Codeigniter verwenden. Die folgende Abfrage funktioniert nicht:

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

Dies liegt daran, dass die ActiveRecord-Klasse von CodeIgniter der Eingabe automatisch entgeht.

Das Folgende funktioniert gut, indem Sie set () aufrufen und peratmeter FALSE übergeben, damit es NOW () nicht entgeht.

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

Meine Frage ist jedoch, dass es einen anderen Weg gibt als diesen? Zum Beispiel, wenn ich irgendwie verwenden kann, indem ich nur alles im Datenfeld hinzufüge? Zum Beispiel so etwas wie:

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

Wenn ich mich nicht sehr irre, lautet die Antwort: "Nein, es gibt keinen Weg."

Das grundlegende Problem in solchen Situationen ist die Tatsache, dass Sie eine MySQL-Funktion aufrufen und nicht tatsächlich einen Wert festlegen. CI entgeht den Werten, sodass Sie eine saubere Einfügung vornehmen können. Es wird jedoch nicht getestet, ob diese Werte Funktionen wie aes_encrypt, md5 oder (in diesem Fall) now() aufrufen. In den meisten Situationen ist dies wunderbar, für diese Situationen ist Raw SQL die einzige Möglichkeit.

Auf der einen Seite sollte date('Y-m-d'); als PHP -Version von NOW() für MySQL funktionieren. (Es funktioniert jedoch nicht für alle SQL-Versionen).

32
cwallenpoole

Normalerweise verwende ich Trigger, um mit Zeitstempeln umzugehen, aber ich denke, dass dies funktionieren kann.

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

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

aspirinemaga, ersetzen Sie einfach:

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

dafür:

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

Dies ist die einfache Möglichkeit, Zeitstempel einzufügen 

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

sie können den Datums-Helfer laden und den Codeigniter interal now () verwenden, wenn Sie den GMT-Zeitversatz der Benutzer referenzieren möchten

es würde so aussehen

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

Wenn Sie die GTM-Master-Einstellungen nicht verwenden und Ihre Benutzer eigene Offsets festlegen lassen, besteht kein Vorteil gegenüber der time () - Funktion von php.

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

jETZT () in Anführungszeichen setzen, wird nicht funktionieren, da Active Records das JETZT () in einen String fluchtet und versucht, es als String von "NOW ()" in die Datenbank zu verschieben ... 

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

um es richtig einzustellen.

sie können Ihre SQL später immer mit überprüfen

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

Gemäß dem Quellcode von codeigniter ist die Funktion set definiert als:

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

Wenn $key ein Array ist, wird der zweite Parameter $value von codeigniter anscheinend einfach ignoriert. Der dritte Parameter $escape funktioniert jedoch auch während der gesamten Iteration von $key. In diesem Fall funktionieren die folgenden Codes (mit der chain-Methode):

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

Dadurch werden jedoch alle Daten aufgehoben, sodass Sie Ihre Daten in zwei Teile teilen können:

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

Mit dem Datums-Helfer arbeitete ich für mich

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

Sie finden die Dokumentation für date_helperhier .

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

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

$this->db->query("update table_name set ts = now() where 1=1") Funktioniert auch für den aktuellen Zeitstempel!

0
user3526

führen Sie die Abfrage aus, um now () von mysql zu erhalten. Wählen Sie now () jetzt als nowinmysql aus.

verwenden Sie dann den Codeigniter, um dies zu erhalten, und fügen Sie es ein 

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