Định dạng đúng để truyền cho date()
hàm trong PHP là gì nếu tôi muốn chèn kết quả vào datetime
cột kiểu MySQL ?
Tôi đã cố gắng date("Y-M-D G:i:s")
nhưng chỉ cần chèn "0000-00-00 00:00:00" mọi lúc.
Định dạng đúng để truyền cho date()
hàm trong PHP là gì nếu tôi muốn chèn kết quả vào datetime
cột kiểu MySQL ?
Tôi đã cố gắng date("Y-M-D G:i:s")
nhưng chỉ cần chèn "0000-00-00 00:00:00" mọi lúc.
Câu trả lời:
Vấn đề là bạn đang sử dụng 'M'
và 'D'
, là một biểu diễn văn bản, MySQL đang mong đợi một biểu diễn số của định dạng2010-02-06 19:30:13
Hãy thử: date("Y-m-d H:i:s")
trong đó sử dụng tương đương số.
chỉnh sửa: chuyển G
đến H
, mặc dù nó có thể không có tác động, có thể bạn muốn sử dụng định dạng 24 giờ với leading 0s.
Từ các bình luận của date()
trang hướng dẫn của php :
<?php $mysqltime = date ("Y-m-d H:i:s", $phptime); ?>
Bạn đã có 'Y' chính xác - đó là một năm đầy đủ, nhưng 'M' là một tháng có ba ký tự, trong khi 'm' là một tháng có hai chữ số. Vấn đề tương tự với 'D' thay vì 'd'. 'G' là giờ 1 hoặc 2 chữ số, trong đó 'H' luôn có số 0 đứng đầu khi cần.
Đây là một giải pháp thay thế: nếu bạn có ngày trong PHP dưới dạng dấu thời gian, hãy bỏ qua việc xử lý nó với PHP và để DB đảm nhiệm việc chuyển đổi nó bằng cách sử dụng FROM_UNIXTIME
hàm.
mysql> insert into a_table values(FROM_UNIXTIME(1231634282));
Query OK, 1 row affected (0.00 sec)
mysql> select * from a_table;
+---------------------+
| a_date |
+---------------------+
| 2009-01-10 18:38:02 |
+---------------------+
Tôi sử dụng mã PHP sau đây để tạo một biến mà tôi chèn vào cột MySQL DATETIME.
$datetime = date_create()->format('Y-m-d H:i:s');
Điều này sẽ giữ Ngày và Giờ hiện tại của máy chủ.
$date_old = '23-5-2016 23:15:23';
//Date for database
$date_for_database = date ("Y-m-d H:i:s", strtotime($date_old));
//Format should be like 'Y-m-d H:i:s'`enter code here`
Định dạng dấu thời gian vào cột MySQL DATETIME:
strftime('%Y-%m-%d %H:%M:%S',$timestamp);
Tôi sử dụng chức năng này (PHP 7)
function getDateForDatabase(string $date): string {
$timestamp = strtotime($date);
$date_formated = date('Y-m-d H:i:s', $timestamp);
return $date_formated;
}
Các phiên bản cũ hơn của PHP (PHP <7)
function getDateForDatabase($date) {
$timestamp = strtotime($date);
$date_formated = date('Y-m-d H:i:s', $timestamp);
return $date_formated;
}
function getDateForDatabase(string $date) : string {
đến function getDateForDatabase($date) {
Tại sao các khai báo kiểu đưa ra một lỗi tôi không biết đủ PHP để nói.
Không cần sử dụng phương thức date () từ PHP nếu bạn không sử dụng dấu thời gian. Nếu dateposted
là cột datetime, bạn có thể chèn ngày hiện tại như thế này:
$db->query("INSERT INTO table (dateposted) VALUES (now())");
Điều này đã khiến tôi phát điên khi tìm kiếm một câu trả lời đơn giản. Cuối cùng tôi đã thực hiện chức năng này có vẻ như bắt tất cả đầu vào và đưa ra một chuỗi SQL tốt, chính xác hoặc ít nhất là hợp lệ và có thể kiểm tra được. Nếu đó là 1999-12-31 thì có lẽ sai nhưng sẽ không gây ra lỗi xấu trong MySQL.
function MakeSQLDate($date) {
if (is_null($date)) {
//use 1999-12-31 as a valid date or as an alert
return date('Y-m-d', strtotime('1999-12-31'));
}
if (($t = strtotime($date)) === false) {
//use 1999-12-31 as a valid date or as an alert
return date('Y-m-d', strtotime('1999-12-31'));
} else {
return date('Y-m-d H:i:s', strtotime($date));
}
}
Sử dụng DateTime
lớp trong PHP7 +:
function getMysqlDatetimeFromDate(int $day, int $month, int $year): string {
$dt = new DateTime();
$dt->setTimezone(new DateTimeZone('UTC'));
$dt->setDate($year, $month, $day);
$dt->setTime(0, 0, 0, 0); // set tine to midnight
return $dt->format("Y-m-d H:i:s");
}
Một phụ lục nhỏ cho câu trả lời được chấp nhận: Nếu cơ sở dữ liệu datetime
được lưu trữ dưới dạng UTC (những gì tôi luôn làm), bạn nên sử dụng gmdate("Y-m-d H:i:s")
thay vì date("Y-m-d H:i:s")
.
Hoặc, nếu bạn muốn để MySQL xử lý mọi thứ, như một số câu trả lời gợi ý, tôi sẽ chèn MySQL UTC_TIMESTAMP
, với kết quả tương tự.
Lưu ý: Tôi hiểu câu hỏi đề cập đến thời điểm hiện tại.
Đây là một cách chính xác hơn để làm điều đó. Nó đặt số thập phân phía sau giây cho độ chính xác cao hơn.
$now = date('Y-m-d\TH:i:s.uP', time());
Hãy chú ý .uP
.
Thông tin thêm: https://stackoverflow.com/a/6153162/8662476