2012-03-23 17 views
38

Dado que MySQL evidentemente no puede insertar automáticamente la función now() en un campo de fecha y hora agregando nuevos registros como otras bases de datos, basado en comentarios, estoy explícitamente tratando de insertarlo usando una declaración SQL. (La gente parece pensar que la marca de tiempo con curdate() no es la respuesta debido a las diversas limitaciones de la marca de tiempo). Hay numerosos artículos en la web que sugieren que insertar ahora() usando SQL debería funcionar.Insertar fecha/hora actual usando now() en un campo usando MySQL/PHP

Cuando trato de insertar la fecha y hora usando la instrucción SQL, sin embargo, el campo no se llena con la hora/fecha actual, pero solo me da el predeterminado 0000-00-, etc. Esta es probablemente una sintaxis error, pero me está volviendo loco, así que lo estoy publicando.

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

Se inserta primero y el último, pero nada para cuando se agrega, dejando 0000-00-00, etc. en el campo whenadded.

El tipo de campo es datetime, no tiene intercalación, atributos, nulo predeterminado o extra. Por cierto, intenté poner ahora() en comillas simples ... Lanzó un error.

+3

Extraño, lo que demuestre debería funcionar. ¿Estás seguro de que es un campo DATETIME apropiado? De todos modos, los comentarios son incorrectos, puedes automatizar esto usando 'DEFAULT CURRENT_TIMESTAMP' y' ON UPDATE CURRENT_TIMESTAMP' http://dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html –

+0

¿Para qué sirve? TIMESTAMP (CURRENT_TIMESTAMP) también funciona para Datetime? http://bugs.mysql.com/bug.php?id=27645 Me estoy alejando de Timestamp debido a lo que las personas describen como sus limitaciones de fecha. intentará restablecer el tipo de campo – user1260310

+0

Ugh, mi error. Lo siento. Esto parece funcionar solo para los campos TIMESTAMP, lo cual es una pena. Pero la consulta que se muestra arriba * debe * funcionar –

Respuesta

7

Como dijo Pekka, debería funcionar de esta manera. No puedo reproducir el problema con este ejemplo autónomo:

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

Qué (actualmente) imprime

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 

Y aquí está (casi) la misma secuencia de comandos con un campo de marca y CURRENT_TIMESTAMP DEFAULT:

<?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, la marca de tiempo se convierte a la misma representación de cadena de fecha y hora que en el primer ejemplo, al menos con mi versión de PHP/PDO/mysqlnd.

65

NOW() normalmente funciona en instrucciones SQL y devuelve la fecha y la hora. Compruebe si su campo de base de datos tiene el tipo correcto (fecha y hora). De lo contrario, siempre se puede utilizar la función PHP fecha() e inserte:

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

Pero yo no recomendaría este. nota

+3

-1: NOW() no funciona para el tipo DATETIME. Solo funciona para TIMESTAMP. Así que recomiendo usar PHP para esto (cuando se usa el tipo DATETIME). –

+21

@IvoPereira En realidad, 'NOW()' funciona para 'DATETIME'. Usar php para generar marcas de tiempo no es una mala solución. Pero las zonas horarias entre los servidores que ejecutan php y los servidores MySQL deben estar sincronizados. –

+0

En realidad este es el enfoque óptimo para la fecha actual, el tiempo o ambos. –

1

Estos ambos trabajan muy bien para mí ...

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

?> 

Side: mysql_query() no es la mejor manera de conectar a MySQL en las versiones actuales de PHP.

+0

¡Gracias a todos! Encontré el error estúpido ... En la depuración comenté la versión incorrecta de la consulta. Ugh. Por cierto, ¿cuál es la forma preferida de ejecutar la consulta si no es mysql_query? – user1260310

6

La única razón por la que se me ocurre es que la está agregando como una cadena 'now()', no es una función llamada now().
O cualquier otro tipo de error.

SELECT NOW(); 

para ver si devuelve el valor correcto?

13

que se olvidó de cerrar el comando mysql_query:

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

Nota: ultima paréntesis.

1

¿Qué ocurre con 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); 
?> 

Mira Difference between NOW(), SYSDATE() & CURRENT_DATE() in MySQL para obtener más información sobre Now() y SYSDATE().

2

ahora()

trabajó para mí. pero mi tipo de campo es fecha solamente y el suyo es datetime. No estoy seguro si este es el caso

+0

seguramente funcionará para todas las columnas de tipo de fecha en MySQL, lo he usado durante los últimos tres años – Michael

Cuestiones relacionadas