Poiché MySQL evidentemente non può inserire automaticamente la funzione now() in un campo datetime nell'aggiunta di nuovi record come alcuni altri database, in base ai commenti, sto cercando esplicitamente di inserirla usando una dichiarazione SQL. (La gente sembra pensare che il timestamp con curdate() non sia la risposta a causa delle varie limitazioni del timestamp). Ci sono numerosi articoli sul web che suggeriscono che inserire now() usando SQL dovrebbe funzionare.
Quando cerco di inserire la data/ora usando l'istruzione SQL, tuttavia, il campo non si popola con l'ora/data corrente, ma mi dà solo il default 0000-00-, ecc. Questo è probabilmente un errore di sintassi, ma mi sta facendo impazzire, quindi lo sto postando.
mysql_query("INSERT INTO users (first, last, whenadded) VALUES ('$first', '$last', now())";
Inserisce il primo e l'ultimo, ma niente per quando aggiunto, lasciando 0000-00-00, ecc. nel campo whenadded.
Il tipo di campo è datetime, non ha collation, attributi, null default o extra. BTW, ho provato a mettere now() tra virgolette singole... Ha lanciato un errore.
NOW() funziona normalmente nelle istruzioni SQL e restituisce la data e l'ora. Controlla se il tuo campo del database ha il tipo corretto (datetime). Altrimenti, puoi sempre usare la funzione PHP date() e inserire:
date('Y-m-d H:i:s')
Ma non te lo consiglio.
Come ha detto Pekka, dovrebbe funzionare così. Non riesco a riprodurre il problema con questo esempio autonomo:
<?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";
}
Che (attualmente) stampa
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
Ed ecco (quasi) lo stesso script usando un campo TIMESTAMP e 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";
}
Convenientemente, il timestamp è convertito nella stessa rappresentazione della stringa datetime come nel primo esempio - almeno con la mia versione di PHP/PDO/mysqlnd.
Questi due funzionano bene per me...
<?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);
?>
Nota a margine: mysql_query() non è il modo migliore per connettersi a MySQL nelle attuali versioni di PHP.