2012-03-23 400 views
38

由於MySQL顯然不能根據評論自動地將日期時間字段中的函數now()添加到像其他一些數據庫一樣的新記錄中,所以我顯式地嘗試使用SQL語句插入它。 (由於時間戳的各種限制,人們似乎認爲使用curdate()的時間戳不是答案。)網絡上有很多文章建議使用SQL現在插入()應該可以工作。在MySQL/PHP中使用now()插入當前日期/時間

當我嘗試插入日期時間使用SQL語句,但是,該字段不填充當前時間/日期,但它只給我默認0000-00-等。這可能是一種語法錯誤,但它讓我發瘋,所以我發佈它。

mysql_query("INSERT INTO users (first, last, whenadded) VALUES ('$first', '$last', now())"; 

它插入第一個和最後一個,但沒有添加時,在0000-00-00 whenadded字段中保留等等。

字段類型是日期時間,它沒有排序規則,屬性,空默認或額外。順便說一句,我試圖把現在()用單引號......它拋出了一個錯誤。

+3

奇怪的是,你顯示的應該工作。你確定這是一個適當的DATETIME字段嗎?無論如何,評論是不正確的,你可以自動完成這一使用'DEFAULT CURRENT_TIMESTAMP'和'ON UPDATE CURRENT_TIMESTAMP' http://dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html – 2012-03-23 14:57:53

+0

又能怎樣工程TIMESTAMP(CURRENT_TIMESTAMP)也適用於Datetime? http://bugs.mysql.com/bug.php?id=27645由於人們將其描述爲日期限制,因此我們迴避時間戳。將嘗試重置字段類型 – user1260310 2012-03-23 15:34:01

+0

呃,我的錯誤。抱歉。這確實似乎只適用於TIMESTAMP字段,這是一個恥辱。但是,上面顯示的查詢*應該*工作 – 2012-03-23 15:39:42

回答

7

就像Pekka說的那樣,它應該以這種方式工作。我不能與此自足例如重現該問題:

<?php 
    $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly'); 
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

    $pdo->exec(' 
     CREATE TEMPORARY TABLE soFoo (
      id int auto_increment, 
      first int, 
      last int, 
      whenadded DATETIME, 
      primary key(id) 
     ) 
    '); 
    $pdo->exec('INSERT INTO soFoo (first,last,whenadded) VALUES (0,1,Now())'); 
    $pdo->exec('INSERT INTO soFoo (first,last,whenadded) VALUES (0,2,Now())'); 
    $pdo->exec('INSERT INTO soFoo (first,last,whenadded) VALUES (0,3,Now())'); 

    foreach($pdo->query('SELECT * FROM soFoo', PDO::FETCH_ASSOC) as $row) { 
     echo join(' | ', $row), "\n"; 
    } 

哪個(目前)打印

1 | 0 | 1 | 2012-03-23 16:00:18 
2 | 0 | 2 | 2012-03-23 16:00:18 
3 | 0 | 3 | 2012-03-23 16:00:18 

而這裏的(幾乎)使用時間戳字段和DEFAULT CURRENT_TIMESTAMP相同的腳本:

<?php 
    $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly'); 
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 

    $pdo->exec(' 
     CREATE TEMPORARY TABLE soFoo (
      id int auto_increment, 
      first int, 
      last int, 
      whenadded TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
      primary key(id) 
     ) 
    '); 
    $pdo->exec('INSERT INTO soFoo (first,last) VALUES (0,1)'); 
    $pdo->exec('INSERT INTO soFoo (first,last) VALUES (0,2)'); 
    sleep(1); 
    $pdo->exec('INSERT INTO soFoo (first,last) VALUES (0,3)'); 

    foreach($pdo->query('SELECT * FROM soFoo', PDO::FETCH_ASSOC) as $row) { 
     echo join(' | ', $row), "\n"; 
    } 

方便地將時間戳轉換爲與第一個示例中相同的日期時間字符串表示 - 至少在我的PHP/PDO/mysqlnd版本中。

65

NOW()通常在SQL語句中工作並返回日期和時間。檢查你的數據庫字段是否有正確的類型(日期時間)。否則,你可以隨時使用PHP date()函數,並插入:

date('Y-m-d H:i:s') 

但我不會推薦。

+3

-1:NOW()不適用於DATETIME類型。它只適用於TIMESTAMP。所以我建議使用PHP(當使用DATETIME類型時)。 – 2013-06-03 14:06:25

+21

@IvoPereira實際上,'NOW()'對'DATETIME'確實有效。使用php來生成時間戳不是一個不好的解決方案。但運行php和MySQL服務器的服務器之間的時區需要同步。 – 2013-06-28 22:46:41

+0

實際上,這是當前日期,時間或兩者的最佳方法。 – 2015-08-04 17:11:47

1

這些都工作正常,我...

<?php 
    $db = mysql_connect('localhost','user','pass'); 
    mysql_select_db('test_db'); 

    $stmt = "INSERT INTO `test` (`first`,`last`,`whenadded`) VALUES ". 
      "('{$first}','{$last}','NOW())"; 
    $rslt = mysql_query($stmt); 

    $stmt = "INSERT INTO `users` (`first`,`last`,`whenadded`) VALUES ". 
      "('{$first}', '{$last}', CURRENT_TIMESTAMP)"; 
    $rslt = mysql_query($stmt); 

?> 

邊注:請求mysql_query()不連接到MySQL在PHP的當前版本的最佳途徑。

+0

謝謝大家!我發現了這個愚蠢的錯誤。在調試中,我註釋了錯誤的查詢版本。啊。順便說一句,如果不是mysql_query,執行查詢的首選方法是什麼。 – user1260310 2012-03-23 21:46:57

6

我能想到的唯一原因是您將它添加爲字符串'now()',而不是函數調用now()
或其他任何錯字。

SELECT NOW(); 

看看它是否返回正確的值?

13

你忘了關閉的mysql_query命令:

mysql_query("INSERT INTO users (first, last, whenadded) VALUES ('$first', '$last', now())";

注意,最後括號。

1

怎麼樣SYSDATE()?

<?php 
    $db = mysql_connect('localhost','user','pass'); 
    mysql_select_db('test_db'); 

    $stmt = "INSERT INTO `test` (`first`,`last`,`whenadded`) VALUES ". 
      "('{$first}','{$last}','SYSDATE())"; 
    $rslt = mysql_query($stmt); 
?> 

有關NOW()和SYSDATE()的更多信息,請參閱Difference between NOW(), SYSDATE() & CURRENT_DATE() in MySQL

2

現在()

爲我工作。 但我的字段類型爲日期只和你是日期時間。我不知道這是否是這種情況

+0

它肯定會適用於MySQL中的所有日期類型列,我過去三年來一直使用它 – Michael 2016-06-11 18:57:09

相關問題