使用 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_TIMESTAMP
和 ON 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() 插入当前日期/时间的主要内容,如果未能解决你的问题,请参考以下文章
向 MySQL (PHP) 添加值时防止在输入字段中执行数学表达式
mysql中now()函数的使用,还有oracle的sysdate