Вставьте текущую дату / время, используя now () в поле, используя MySQL / PHP - PullRequest
43 голосов
/ 23 марта 2012

Поскольку MySQL, очевидно, не может автоматически вставлять функцию now () в поле datetime при добавлении новых записей, как некоторые другие базы данных, на основе комментариев, я явно пытаюсь вставить ее с помощью оператора SQL. (Кажется, что люди думают, что отметка времени с помощью curdate () не является ответом из-за различных ограничений отметки времени.) В Интернете есть множество статей, предлагающих вставить сейчас () с использованием SQL.

Однако, когда я пытаюсь вставить дату и время, используя оператор SQL, поле не заполняется текущим временем / датой, а только дает мне значение по умолчанию 0000-00- и т. Д. Это, вероятно, синтаксическая ошибка. , но это сводит меня с ума, поэтому я публикую это.

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

Он вставляет первый и последний, но ничего для добавления, оставляя 0000-00-00 и т. Д. В поле добавленного.

Тип поля: datetime, оно не имеет параметров сортировки, атрибутов, нулевого значения по умолчанию или дополнительного. Кстати, я пытался поместить now () в одинарные кавычки ... Это выдало ошибку.

Ответы [ 7 ]

78 голосов
/ 23 марта 2012

NOW () обычно работает в операторах SQL и возвращает дату и время.Проверьте, имеет ли поле вашей базы данных правильный тип (datetime).В противном случае вы всегда можете использовать функцию PHP date () и вставить:

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

Но я бы не рекомендовал это.

18 голосов
/ 19 мая 2013

Вы забыли закрыть команду mysql_query:

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

Обратите внимание, что последние скобки.

7 голосов
/ 23 марта 2012

Как сказал Пекка, так и должно быть.Я не могу воспроизвести проблему с этим автономным примером:

<?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.

6 голосов
/ 23 марта 2012

Единственная причина, по которой я могу придумать, это то, что вы добавляете ее как строку 'now()', а не вызов функции now().
Или как-то еще опечатка.

SELECT NOW();

, чтобы увидеть, вернется ли онаправильное значение?

2 голосов
/ 14 марта 2016

сейчас ()

работал на меня. но мой тип поля date only, а ваш datetime . я не уверен, если это так

1 голос
/ 30 июля 2015

Как насчет 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().

1 голос
/ 23 марта 2012

Они оба прекрасно работают для меня ...

<?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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...