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


78

Ich möchte die aktuelle Zeit mit der mySQL-Funktion NOW () in den aktiven Datensatz von Codeigniter in die Datenbank einfügen. 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 das Peratmeter FALSE übergeben, damit es nicht dem NOW () entgeht.

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

Meine Frage ist jedoch, ob es einen anderen Weg als diesen gibt. Zum Beispiel, wenn ich irgendwie verwenden kann, indem ich alles nur in das Datenarray hinzufüge? Zum Beispiel so etwas wie:

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

1
Außerhalb der Spur und sogar des Umfangs, aber wissen Sie, dass Sie mit JETZT () einen ähnlichen Effekt erzielen können strtotime? Für zB echo date("N", strtotime('now'));Sie das heutige Datum geben, beziehen sich auf php.net/strtotime und php.net/date
Kumar

Antworten:


32

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

Das Grundproblem in solchen Situationen ist die Tatsache, dass Sie eine MySQL-Funktion aufrufen und keinen Wert festlegen. CI entkommt Werte , so dass Sie einen sauberen Einsatz tun können , aber es prüft nicht , wenn diese Werte sehen passieren Funktionen zu rufen möchten aes_encrypt, md5oder (in diesem Fall) now(). Während dies in den meisten Situationen wunderbar ist, ist in diesen Situationen nur rohes SQL der Rückgriff.

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


22
Der Einfachheit halber setze ich immer Zeitstempel mit Datum ('Ymd H: i: s') mit verschiedenen ORMs usw., ohne gegen verschiedene Implementierungen kämpfen zu müssen.
Geekualität

2
Persönlich verwende ich immer Unix-Zeitstempel. Ich weiß, dass 1308124173975 in jeder Sprache und Datenbank immer ein Long (oder Int oder Float oder Äquivalent) sein wird. Ich mag es nicht, mich darum kümmern zu müssen.
Cwallenpoole

1
Das ist ein guter Punkt. Ich bin faul und mag es, wenn möglich, von Menschen lesbare Einträge zu haben. :)
Geekualität

1
@jupaju Es ist nur eine andere Art von Faulheit. Ich könnte mich daran erinnern, wie PgSQL, MySQL, Oracle, Java, PHP und Python Daten speichern, oder ich könnte einfach alles eine verdammte Zahl sein lassen. Und weisst du was? Wenn es sich um eine Zahl handelt, wird sie sofort in AS2, AS3 und JS übersetzt. Und wann brauche ich das aktuelle Datum? Gehen Sie zu Chrome, Strg-Umschalt-J und fügen Sie einen String ein (neues Datum (/ * numerischer Zeitstempel * /))
cwallenpoole

4
Ich möchte darauf hinweisen, dass die Verwendung von Datum ('Ymd H: i: s') ein Problem haben kann, bei dem der MySQL-Server und die PHP-Bibliothek zwei verschiedene Zeitzonen verwenden, ohne dass Sie sich dessen bewusst sind. Zum Beispiel hatte ich einen Host, der MySQL auf GMT (+ 0h) hatte und PHP war EST (-5h).
bafromca

76

Ich verwende normalerweise Trigger, um Zeitstempel zu verarbeiten, aber ich denke, dass dies funktionieren kann.

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

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

Wie kann man es now() + 1 dayirgendwie für aktive Datensätze verwenden?
aspirinemaga

Gibt es eine Möglichkeit, dies bei einem leeren Update auszulösen?
Edeph

1
Arbeitete auch für mich, CI2.1.2 im Jahr 2015
Fedmich

1
@AnwarHossain Ich verwende Version 3.1 und es funktioniert, es könnte ein anderes Problem geben.
Muhammad

1
Ich benutze CI Version 3.1.8 und es funktioniert absolut
einwandfrei

14

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

2
Ich möchte darauf hinweisen, dass dies laut den Dokumenten der von CodeIgniter "empfohlene Weg" ist. Ich würde empfehlen, MySQLs natives NOW () anstelle von PHPs Datum ('Ymd H: i: s') zu verwenden, wenn Sie sich auf einem gemeinsam genutzten Host befinden, da diese möglicherweise auf unterschiedliche Zeitzonen eingestellt sind.
bafromca

12

Dies ist die einfache Möglichkeit, das Einfügen von Zeitstempeln zu handhaben

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

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

Diese Antwort wurde als minderwertig gekennzeichnet. Wenn die Frage beantwortet wird, sollten Sie ein wenig Text hinzufügen, um zu erklären, wie es funktioniert.
lmo

3
Hat für mich gearbeitet. Erklärung könnte helfen, aber es hat mein Problem gelöst. 😁
Jordanien

Zeit () wird nicht benötigt, Datum () gibt immer die aktuelle Zeit zurück
Loki

7

Sie können den Datumshelfer laden und jetzt den Codeigniter interal () verwenden, wenn Sie auf den GMT-Zeitversatz des Benutzers verweisen 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 ihre eigenen Offsets festlegen lassen, gibt es keinen Vorteil gegenüber der Verwendung der time () -Funktion von php.


date () warnt PHP davor, sich auf das
Systemdatum

4

Gemäß dem Quellcode des Codeigniters ist die Funktion setdefiniert 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 $keyes sich um ein Array handelt, ignoriert der Codeigniter anscheinend einfach den zweiten Parameter $value, aber der dritte Parameter $escapefunktioniert während der gesamten Iteration von $key. In dieser Situation funktionieren die folgenden Codes (unter Verwendung der Kettenmethode):

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

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

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

3

Das Setzen von NOW () in Anführungszeichen funktioniert nicht, da Active Records das Escape von NOW () in eine Zeichenfolge einfügt und versucht, es als Zeichenfolge von "NOW ()" in die Datenbank zu verschieben. Sie müssen es verwenden

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

um es richtig einzustellen.

Sie können Ihre SQL danach jederzeit mit überprüfen

$this->db->last_query();

3

Die Verwendung des Date Helfer hat bei mir funktioniert

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

Dokumentation dazu finden Sie date_helper hier .

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

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

Ich denke, es ist eine tote Verbindung
Anwar Hossain

0

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


0

Führen Sie eine Abfrage aus, um now () von mysql zu erhalten, dh wählen Sie now () als nowinmysql aus.

Verwenden Sie dann den Codeigniter, um dies zu erhalten und einzugeben

$data['created_on'] = $row->noinmyssql;
$this->db->insert($data);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.