Вставьте текущую дату/время, используя 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().