2012-03-23 180 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

相关问题