web-dev-qa-db-fra.com

Insérer la date / heure actuelle en utilisant now () dans un champ en utilisant MySQL / PHP

Étant donné que MySQL ne peut évidemment pas insérer automatiquement la fonction now () dans un champ datetime en ajoutant de nouveaux enregistrements, comme certaines autres bases de données, sur la base de commentaires, je tente explicitement de l'insérer à l'aide d'une instruction SQL. (Les gens semblent penser que l'horodatage avec curdate () n'est pas la solution en raison des diverses limitations de l'horodatage.) Il existe de nombreux articles sur le Web qui suggèrent d'insérer now () à l'aide de SQL devrait fonctionner.

Lorsque j'essaie d'insérer la date et l'heure à l'aide de l'instruction SQL, le champ n'est pas renseigné avec la date et l'heure actuelles, mais il ne me donne que la valeur par défaut 0000-00-, etc. Il s'agit probablement d'une erreur de syntaxe, mais me rend fou, alors je le poste.

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

Il insère le premier et le dernier, mais rien pour l'ajout, laissant 0000-00-00, etc. dans le champ whenadded.

Le type de champ est datetime, il n'a pas de classement, d'attribut, null default ou extra. BTW, j'ai essayé de mettre maintenant () entre guillemets simples ... Il a jeté une erreur.

44
user1260310

NOW () fonctionne normalement dans les instructions SQL et renvoie la date et l'heure. Vérifiez si le champ de votre base de données a le type correct (date/heure). Sinon, vous pouvez toujours utiliser la fonction PHP date () et insérer:

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

Mais je ne recommanderais pas cela.

78
Ronan

Vous avez oublié de fermer la commande mysql_query:

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

Notez que les dernières parenthèses.

18
ckwolfling

Comme Pekka l'a dit, cela devrait fonctionner ainsi. Je ne peux pas reproduire le problème avec cet exemple autonome:

<?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";
    }

Quels tirages (actuellement)

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

Et voici (presque) le même script utilisant un champ TIMESTAMP et 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";
    }

De manière pratique, l'horodatage est converti en la même représentation de chaîne datetime que dans le premier exemple - au moins avec ma version PHP/PDO/mysqlnd.

7
VolkerK

La seule raison pour laquelle je peux penser est que vous l'ajoutez sous la chaîne 'now()', et non par l'appel de fonction now().
Ou toute autre faute de frappe.

SELECT NOW();

pour voir si elle retourne une valeur correcte?

6
Your Common Sense

maintenant()

a travaillé pour moi. mais mon type de champ est date seulement et le vôtre est date/heure. je ne suis pas sûr que ce soit le cas

2
Shuhad zaman

Qu'en est-il de 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);
?>

Regardez Différence entre NOW (), SYSDATE () & CURRENT_DATE () dans MySQL pour plus d’informations sur NOW () et SYSDATE ().

1
Benas

Ces deux fonctionnent bien pour moi ...

<?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);

?>

Note secondaire: mysql_query () n'est pas le meilleur moyen de se connecter à MySQL dans les versions actuelles de PHP.

1
DismissedAsDrone