Tôi nghĩ rằng việc giữ các giá trị ngày-giờ của bạn trong trường thuộc loại DATETIME
sẽ là một cách tự nhiên.
Từ kinh nghiệm của riêng tôi với ứng dụng PHP hiện tại của tôi, chỉ read
/ write
các hoạt động liên quan đến thông tin này có thể có vấn đề.
Một trong những giải pháp khả thi (giả sử rằng bạn sử dụng DATETIME
kiểu dữ liệu) để thực hiện đúng toàn bộ quá trình có thể là cách tiếp cận sau:
Đọc các giá trị DATETIME để sử dụng PHP
- Có được
DATETIME
các trường từ cơ sở dữ liệu của bạn chuyển đổi chúng trong truy vấn biểu diễn chuỗi ở dạng'2011-10-02T23:25:42Z'
bằng cách sử dụngDATE_FORMAT
Hàm MySQL với'%Y-%m-%dT%H:%i:%sZ'
chuỗi định dạng ( tài liệu vào DATE_FORMAT ) - Đọc giá trị cột đã tìm nạp ở định dạng cụ thể này và chuyển đổi nó trong PHP từ chuỗi thành biểu diễn ngày-giờ thực hợp lệ cho PHP (chẳng hạn như
DateTime
các đối tượng lớp vàDateTime::createFromFormat
phương thức tĩnh được cung cấp'Y-m-d\TH:i:s\Z'
chuỗi định dạng (T
vàZ
được thoát để tránh coi chúng là lệnh định dạng) ( tài liệu cho phương pháp ). - Sử dụng các giá trị đã chuyển đổi làm giá trị ngày-giờ thực với tất cả logic có thể áp dụng, như so sánh ngày tháng thực (không phải so sánh văn bản), v.v.
Ghi date-time PHP vào cơ sở dữ liệu MySQL
- Chuyển đổi tức là PHP
DateTime
đối tượng lớp cho ISO 8601 của chúng tôi trong biểu diễn chuỗi định dạng UTC bằng cách sử dụngDateTime
định dạngformat
với phương thức giống như trước'Y-m-d\TH:i:s\Z'
chuỗi định dạng ( tài liệu ). - Thực hiện
INSERT
/UPDATE
thao tác trên thông tin cơ sở dữ liệu bằng cách sử dụng chuỗi đã chuẩn bị như vậy làm tham số cho hàm MySQLSTR_TO_DATE
(với'%Y-%m-%dT%H:%i:%sZ'
chuỗi định dạng) chuyển đổi nó thành cơ sở dữ liệu thựcDATETIME
value ( tài liệu vào STR_TO_DATE ).
Mã mẫu trong PHP
Dưới đây, vui lòng tìm một ví dụ nháp về cách tiếp cận như vậy bằng cách sử dụng các đối tượng PDO:
$db = new PDO('mysql:host=localhost;dbname=my_db;charset=utf8', 'username', 'password');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
// run the query aquring 1 example row with DATETIME data
// converted with MySQL DATE_FORMAT function to its string representation
// in the chosen format (in our case: ISO 8601 / UTC)
$stmt = $db->query("SELECT DATE_FORMAT(dt_column, '%Y-%m-%dT%H:%i:%sZ') AS formatted_dt_col"
." FROM your_table LIMIT 1");
if($stmt !== FALSE) {
$row = $stmt->fetch(PDO::FETCH_ASSOC);
// convert the acquired string representation from DB
// (i.e. '2011-10-02T23:25:42Z' )
// to PHP DateTime object which has all the logic of date-time manipulation:
$dateTimeObject = DateTime::createFromFormat('Y-m-d\TH:i:s\Z', $row['formatted_dt_col']);
// the following should print i.e. 2011-10-02T23:25:42Z
echo $dateTimeObject->format('Y-m-d\TH:i:s\Z');
// now let's write PHP DateTime class object '$dateTimeObject'
// back to the database
$stmtInsertDT = $db->prepare("INSERT INTO your_table(dt_column) "
. " VALUES ( STR_TO_DATE(:par_formatted_dt_column, '%Y-%m-%dT%H:%i:%sZ') )");
$dtAsTextForInsert = $dateTimeObject->format('Y-m-d\TH:i:s\Z');
// convert '$dateTimeObject' to its ISO 8601 / UTC text represantation
// in order to be able to put in in the query using PDO text parameter
$stmtInsertDT->bindParam(':par_formatted_dt_column', $dtAsTextForInsert, PDO::PARAM_STR);
$stmtInsertDT->execute();
// So the real insert query being perform would be i.e.:
/*
INSERT INTO your_table(dt_column)
VALUES ( STR_TO_DATE('2011-10-02T23:25:42Z', '%Y-%m-%dT%H:%i:%sZ') )
*/
}
}
catch(\PDOException $pexc) {
// serve PDOException
}
catch(\Exception $exc) {
// in case of no-PDOException, serve general exception
}
Cách tiếp cận này đã giúp tôi rất nhiều trong việc vận hành các giá trị ngày-giờ giữa cơ sở dữ liệu PHP và MySQL.
Tôi hy vọng nó cũng có thể hữu ích cho bạn.