2012-03-23 38 views
38

Vì MySQL rõ ràng không thể tự động chèn hàm now() trong trường datetime trong việc thêm bản ghi mới như một số cơ sở dữ liệu khác, dựa trên nhận xét, tôi cố gắng chèn nó một cách rõ ràng bằng cách sử dụng câu lệnh SQL. (Mọi người dường như nghĩ rằng dấu thời gian với curdate() không phải là câu trả lời do những hạn chế khác nhau của dấu thời gian.) Có rất nhiều bài viết trên web cho thấy chèn bây giờ() bằng cách sử dụng SQL nên làm việc.Chèn ngày/giờ hiện tại bằng cách sử dụng now() trong một trường bằng cách sử dụng MySQL/PHP

Khi tôi cố gắng chèn thời gian ngày bằng câu lệnh SQL, trường không điền thời gian/ngày hiện tại, nhưng nó chỉ cho tôi mặc định 0000-00-, v.v. Đây có thể là cú pháp lỗi, nhưng nó làm tôi phát điên, vì vậy tôi đăng nó lên.

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

Nó chèn đầu tiên và cuối cùng, nhưng không có gì khi được thêm, để lại 0000-00-00, v.v. trong trường được thêm vào.

Loại trường là datetime, không có collation, thuộc tính, null mặc định hoặc bổ sung. BTW, tôi đã thử đặt ngay bây giờ() trong dấu nháy đơn ... Nó đã ném một lỗi.

+3

Lạ, những gì bạn hiển thị sẽ hoạt động. Bạn có chắc đó là trường DATETIME thích hợp không? Dù sao, các bình luận là không chính xác, bạn có thể tự động hóa điều này bằng cách sử dụng 'DEFAULT CURRENT_TIMESTAMP' và' ON UPDATE CURRENT_TIMESTAMP' http://dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html –

+0

. TIMESTAMP (CURRENT_TIMESTAMP) cũng hoạt động cho Ngày giờ? http://bugs.mysql.com/bug.php?id=27645 Am shying xa Timestamp do những gì mọi người mô tả như là giới hạn ngày của nó. sẽ thử đặt lại kiểu trường – user1260310

+0

Ugh, sai lầm của tôi. Lấy làm tiếc. Điều này thực sự dường như chỉ hoạt động cho các trường TIMESTAMP, điều này thật đáng tiếc. Nhưng truy vấn bạn hiển thị ở trên * nên * hoạt động –

Trả lời

7

Như Pekka đã nói, nó sẽ hoạt động theo cách này. Tôi không thể tạo lại vấn đề với ví dụ khép kín này:

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

nào (hiện tại) in

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 

Và đây là (hầu như) cùng một kịch bản sử dụng một lĩnh vực dấu thời gian và 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"; 
    } 

Thuận tiện, dấu thời gian được chuyển đổi thành cùng biểu diễn chuỗi ngày giờ như trong ví dụ đầu tiên - ít nhất với phiên bản PHP/PDO/mysqlnd của tôi.

65

NOW() thường hoạt động trong các câu lệnh SQL và trả về ngày giờ. Kiểm tra xem trường cơ sở dữ liệu của bạn có đúng loại (datetime) hay không. Nếu không, bạn luôn có thể sử dụng hàm PHP ngày() và chèn:

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

Nhưng tôi sẽ không đề xuất điều này.

+3

-1: NOW() không hoạt động cho loại DATETIME. Nó chỉ hoạt động cho TIMESTAMP. Vì vậy, tôi khuyên bạn nên sử dụng PHP cho điều này (khi sử dụng loại DATETIME). –

+21

@IvoPereira Trên thực tế, 'NOW()' hoạt động cho 'DATETIME'. Sử dụng php để tạo dấu thời gian không phải là một giải pháp tồi. Nhưng các múi giờ giữa các máy chủ chạy php và các máy chủ MySQL cần phải được đồng bộ. –

+0

Thực ra đây là phương pháp tối ưu cho ngày, giờ hiện tại hoặc cả hai. –

1

Những cả công việc tốt cho tôi ...

<?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 lưu ý: mysql_query() không phải là cách tốt nhất để kết nối với MySQL trong các phiên bản hiện tại của PHP.

+0

Cảm ơn tất cả mọi người! Tôi đã tìm thấy sai lầm ngu ngốc .. Trong gỡ lỗi, tôi đã nhận xét ra phiên bản sai của truy vấn. Ugh. Btw, cách ưa thích để thực hiện truy vấn nếu không phải là mysql_query. – user1260310

6

Lý do duy nhất tôi có thể nghĩ đến là bạn thêm nó dưới dạng chuỗi 'now()', không gọi hàm now().
Hoặc bất kỳ lỗi nào khác.

SELECT NOW(); 

để xem nó có trả về giá trị chính xác không?

13

Bạn quên để đóng lệnh mysql_query:

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

Lưu ý rằng ngoặc ngoái.

1

Còn SYSDATE() thì sao?

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

Xem Difference between NOW(), SYSDATE() & CURRENT_DATE() in MySQL để biết thêm thông tin về NOW() và SYSDATE().

2

tại()

làm việc cho tôi. nhưng loại trường của tôi là ngày chỉ và số của bạn là datetime. tôi không chắc chắn nếu đây là trường hợp

+0

nó chắc chắn sẽ hoạt động cho tất cả các cột kiểu ngày trong MySQL, tôi đã sử dụng nó trong ba năm qua – Michael

Các vấn đề liên quan