web-dev-qa-db-ja.com

MySQL / PHPを使用してフィールドにnow()を使用して現在の日付/時刻を挿入する

MySQLはコメントに基づいて他のデータベースのように新しいレコードを追加する際にdatetimeフィールドに関数now()を自動的に挿入できないので、SQLステートメントを使用して明示的に挿入しようとしています。 (タイムスタンプにはさまざまな制限があるため、curdate()を含むタイムスタンプは答えではないと考えているようです。)SQLを使用してnow()を挿入することを推奨するWeb上の記事が多数あります。

ただし、SQLステートメントを使用して日付時刻を挿入しようとすると、フィールドに現在の時刻/日付が入力されませんが、デフォルトの0000-00-などしか表示されません。これはおそらく構文エラーですが、私を夢中にさせるので、私はそれを投稿しています。

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

最初と最後を挿入しますが、追加時は何も挿入されず、追加時フィールドには0000-00-00などが残ります。

フィールドタイプはdatetimeであり、照合、属性、nullのデフォルトまたは追加はありません。ところで、私はnow()を一重引用符で囲んでみました...エラーがスローされました。

44
user1260310

NOW()は通常SQLステートメントで機能し、日付と時刻を返します。データベースフィールドに正しいタイプ(日時)があるかどうかを確認します。それ以外の場合は、常に PHP date()関数を使用して以下を挿入できます。

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

しかし、これはお勧めしません。

78
Ronan

Mysql_queryコマンドを閉じるのを忘れました:

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

最後の括弧に注意してください。

18
ckwolfling

ペッカが言ったように、このように動作するはずです。この自己完結型の例では問題を再現できません。

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

私が考えることができる唯一の理由は、関数呼び出し'now()'ではなく、文字列now()として追加していることです。
または他のタイプミス。

SELECT NOW();

それが正しい値を返すかどうかを確認するには?

6

now()

私のために働いた。しかし、私のフィールドタイプはdateのみで、あなたのものはdatetimeです。これが事実かどうかわかりません

2
Shuhad zaman

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()の詳細については、 MySQLのNOW()、SYSDATE()およびCURRENT_DATE()の違い を参照してください。

1
Benas

これらはどちらも私にとってはうまくいきます...

<?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に接続する最良の方法ではありません。

1