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()を一重引用符で囲んでみました...エラーがスローされました。
NOW()は通常SQLステートメントで機能し、日付と時刻を返します。データベースフィールドに正しいタイプ(日時)があるかどうかを確認します。それ以外の場合は、常に PHP date()関数を使用して以下を挿入できます。
date('Y-m-d H:i:s')
しかし、これはお勧めしません。
Mysql_queryコマンドを閉じるのを忘れました:
mysql_query("INSERT INTO users (first, last, whenadded) VALUES ('$first', '$last', now())"
);
最後の括弧に注意してください。
ペッカが言ったように、このように動作するはずです。この自己完結型の例では問題を再現できません。
<?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バージョンでは。
私が考えることができる唯一の理由は、関数呼び出し'now()'
ではなく、文字列now()
として追加していることです。
または他のタイプミス。
SELECT NOW();
それが正しい値を返すかどうかを確認するには?
now()
私のために働いた。しかし、私のフィールドタイプはdateのみで、あなたのものはdatetimeです。これが事実かどうかわかりません
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()の違い を参照してください。
これらはどちらも私にとってはうまくいきます...
<?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に接続する最良の方法ではありません。