Вставьте текущую дату/время, используя now() в поле, используя MySQL/PHP
Так как MySQL, очевидно, не может автоматически вставлять функцию now() в поле datetime при добавлении новых записей, подобных некоторым другим базам данных, на основе комментариев, я явно пытаюсь вставить его с помощью инструкции SQL. (Люди, похоже, считают временную метку с curdate() не ответом из-за различных ограничений временной метки.) В Интернете есть множество статей, в которых предлагается вставить now(), используя SQL.
Когда я пытаюсь вставить дату, используя инструкцию SQL, однако поле не заполняется текущим временем/датой, но оно дает мне только 0000-00- и т.д. Это, вероятно, синтаксическая ошибка, но это сводит меня с ума, поэтому я отправляю его.
mysql_query("INSERT INTO users (first, last, whenadded) VALUES ('$first', '$last', now())";
Он вставляет первый и последний, но ничего не добавляется, оставляя 0000-00-00 и т.д. в поле whenadded.
Тип поля - это дата и время, он не имеет сортировки, атрибутов, нулевого значения по умолчанию или дополнительного. BTW, я попробовал поставить now() в одинарных кавычках... Он выбросил ошибку.
Ответы
Ответ 1
СЕЙЧАС() обычно работает в операциях SQL и возвращает дату и время. Проверьте, имеет ли поле базы данных правильный тип (дата и время). В противном случае вы всегда можете использовать функцию PHP date() и вставить:
date('Y-m-d H:i:s')
Но я бы не рекомендовал этого.
Ответ 2
Вы забыли закрыть команду mysql_query:
mysql_query("INSERT INTO users (first, last, whenadded) VALUES ('$first', '$last', now())"
) ;
Обратите внимание, что последние скобки.
Ответ 3
Как сказал Пекка, он должен работать таким образом. Я не могу воспроизвести проблему с этим автономным примером:
<?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
И здесь (почти) тот же самый script, используя поле 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.
Ответ 4
Единственная причина, по которой я могу думать, это добавить ее как строку 'now()'
, а не вызов функции now()
.
Или что-то еще опечатка.
SELECT NOW();
чтобы увидеть, возвращает ли оно правильное значение?
Ответ 5
сейчас()
работал у меня.
но мой тип поля дата, а ваш datetime. я не уверен, что это так.
Ответ 6
Эти обе работают отлично для меня...
<?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.
Ответ 7
Как насчет 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() и CURRENT_DATE() в MySQL для получения дополнительной информации о NOW() и SYSDATE().