使用 MySQL/PHP 在字段中使用 now() 插入当前日期/时间

Posted

技术标签:

【中文标题】使用 MySQL/PHP 在字段中使用 now() 插入当前日期/时间【英文标题】:Insert current date/time using now() in a field using MySQL/PHP 【发布时间】:2012-04-08 03:20:21 【问题描述】:

由于 mysql 显然不能像其他一些数据库一样基于 cmets 在 datetime 字段中自动插入函数 now() ,因此我明确地尝试使用 SQL 语句插入它。 (由于时间戳的各种限制,人们似乎认为带有 curdate() 的时间戳不是答案。)网上有很多文章建议使用 SQL 插入 now() 应该可以工作。

但是,当我尝试使用 SQL 语句插入日期时间时,该字段不会填充当前时间/日期,而是只给我默认的 0000-00- 等。这可能是语法错误,但它让我发疯,所以我发布它。

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

它首先插入和最后插入,但添加时不插入,在添加字段中留下 0000-00-00 等。

字段类型是日期时间,它没有排序规则、属性、null default 或 extra。顺便说一句,我尝试将 now() 放在单引号中......它引发了错误。

【问题讨论】:

奇怪,你展示的应该可以。您确定这是一个正确的 DATETIME 字段吗?无论如何,cmets 不正确,您可以使用 DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html 自动执行此操作 适用于 TIMESTAMP (CURRENT_TIMESTAMP) 的内容是否也适用于 Datetime? bugs.mysql.com/bug.php?id=27645 由于人们将其描述为日期限制,因此我回避了 Timestamp。将尝试重置字段类型 呃,我的错。对不起。这似乎确实只适用于 TIMESTAMP 字段,这是一种耻辱。但是您在上面显示的查询应该工作 @Pekka - 尽管有名字,CURRENT_TIMESTAMP 对我来说是 DateTime 列的默认值。 MySQL 的UTC_TIMESTAMP() 有时也很有用。同样,尽管有名称(时间戳),但在将 DateTime 列设置为此值时也可以使用。例如。 "UPDATE mytable SET MyDateTimeField=UTC_TIMESTAMP() WHERE MyID=$theID;" 【参考方案1】:

只需转到 when added 列并将 默认值 更改为 CURRENT_TIMESTAMP

【讨论】:

【参考方案2】:

目前,新版本的 Mysql 可以自动插入当前日期,而无需在 PHP 文件中添加代码。您可以在设置数据库时从 Mysql 中实现这一点,如下所示:

现在,任何新帖子都会自动获得唯一的日期和时间。 希望这能有所帮助。

【讨论】:

【参考方案3】:

现在()

为我工作。 但我的字段类型仅为 date,而您的字段类型为 datetime。我不确定是不是这样

【讨论】:

它肯定适用于 MySQL 中的所有日期类型列,我过去三年一直在使用它【参考方案4】:

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

查看Difference between NOW(), SYSDATE() & CURRENT_DATE() in MySQL 了解有关 NOW() 和 SYSDATE() 的更多信息。

【讨论】:

【参考方案5】:

NOW() 通常在 SQL 语句中工作并返回日期和时间。检查您的数据库字段是否具有正确的类型(日期时间)。否则,您始终可以使用PHP date() 函数并插入:

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

但我不建议这样做。

【讨论】:

-1:NOW() 不适用于 DATETIME 类型。它仅适用于 TIMESTAMP。所以我建议为此使用 PHP(使用 DATETIME 类型时)。 @IvoPereira 实际上,NOW() 确实适用于 DATETIME。使用 php 生成时间戳并不是一个糟糕的解决方案。但是运行 php 的服务器和 MySQL 服务器之间的时区需要同步。 实际上这是当前日期、时间或两者的最佳方法。 你不会推荐它 真的取决于你的服务器集群。如果一切都在一台服务器上运行,则可以使用此方法。否则,您可能会遇到时区问题。总而言之,我总是更喜欢使用 hack 的本机函数。 NOW() 存在于 SQL 中,所以我宁愿找出它为什么不起作用并修复它,而不是破解它。【参考方案6】:

就像 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

这里(几乎)是使用 TIMESTAMP 字段和 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 版本中是这样。

【讨论】:

【参考方案7】:

您忘记关闭 mysql_query 命令:

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

注意最后的括号。

【讨论】:

【参考方案8】:

我能想到的唯一原因是您将其添加为字符串'now()',而不是函数调用now()。 或其他任何错字。

SELECT NOW();

看它是否返回正确的值?

【讨论】:

【参考方案9】:

这两个对我来说都很好......

<?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() 不是当前 PHP 版本中连接 MySQL 的最佳方式。

【讨论】:

谢谢大家!我发现了愚蠢的错误。在调试中,我注释掉了错误版本的查询。啊。顺便说一句,如果不是 mysql_query,那么执行查询的首选方式是什么。

以上是关于使用 MySQL/PHP 在字段中使用 now() 插入当前日期/时间的主要内容,如果未能解决你的问题,请参考以下文章

使用 Now() 函数时截断日期[重复]

向 MySQL (PHP) 添加值时防止在输入字段中执行数学表达式

mysql中now()函数的使用,还有oracle的sysdate

datetime.now()提示没有now方法

什么是informix for mysql now() 中的replace 函数

mysql php从2个表中选择字段,具有相同的字段名称[重复]