就像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版本中。
奇怪的是,你显示的应该工作。你确定这是一个适当的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
又能怎样工程TIMESTAMP(CURRENT_TIMESTAMP)也适用于Datetime? http://bugs.mysql.com/bug.php?id=27645由于人们将其描述为日期限制,因此我们回避时间戳。将尝试重置字段类型 – user1260310 2012-03-23 15:34:01
呃,我的错误。抱歉。这确实似乎只适用于TIMESTAMP字段,这是一个耻辱。但是,上面显示的查询*应该*工作 – 2012-03-23 15:39:42