Dátumy v PHP a MySQL

Často vídam veľa ľudí vo fórach alebo inde (dokonca na ICQ), ktorí nemajú jasno v práci s dátumami ukladanými v MySQL a ich používaním v PHP. Poďme sa pozrieť na niekoľko možností, ktoré sa nám otvárajú v súvislosti s dátumami.

PHP používa unixové časové známky (timestamps) pre všetku jeho funkcionalitu spojenú s dátumami. Obsahuje tiež rôzne metódy a funkcie pre konvertovanie týchto časových známok do oveľa krajších textových formátov, ktoré zrovna potrebujete pre vašu webovú aplikáciu. Časová známka je jednoducho povedané typu unsigned integer (bez znamienka, celé čísla). Je to vlastne počet sekúnd, ktoré ubehli od polnoci 1. januára 1970 (GMT (Greenwich Mean Time) – svetový čas).

MySQL má tri dátové typy stĺpcov, ktoré slúžia na ukladanie dátumov. Sú to DATETIME, DATE a TIMESTAMP. DATETIME stĺpce skladujú dátum a čas ako textový reťazec (string) vo formáte YYYY-MM-DD HH:MM:SS (napr. 2009-4-17 20:36:11). DATE stĺpce sú vlastne skoro ako DATETIME, len vynechajú čas. Formát je teda YYYY-MM-DD (napr. 2009-4-17). Zostáva typ TIMESTAMP, no pozor – tento typ nie je ako unix timestamp používaný v PHP. Je to jednoducho DATETIME, ktorý sa dokáže automaticky aktualizovať na aktuálny čas, keď je nejakým spôsobom ovplyvnený záznam (napr. SQL UPDATE). Je to síce veľmi jednoduchá definícia, ale nie je nutné zaťažovať vás detailami. Presnejšie, od verzie MySQL 4.1 je TIMESTAMP formát to isté, čo DATETIME formát.

Okej. Momentálne zvládate nejakú základnú teóriu okolo dátumov v MySQL. Avšak problém je, ako pracovať s týmito veľmi odlišnými formátmi dátumov – PHP timestamp integer a MySQL DATETIME string. Pozrime sa na tri použiteľné riešenia problému…

  1. Prvé možné riešenie je skladovať dátumy v DATETIME poliach a používať funkciu date() a strtotime() na konverziu medzi PHP timestamps a MySQL DATETIME formátom. Možné metódy sú napríklad…
    1. $mysqldate = date( ‘Y-m-d H:i:s’, $phpdate );
    2. $phpdate = strtotime($mysqldate);
  2. Naša druhá možnosť je nechať pracovať MySQL. Má totiž funkcie, ktoré môžeme použiť na konverziu dát na mieste, v ktorom pristupujeme k databáze. UNIX_TIMESTAMP konvertuje DATETIME do PHP timestamp a FROM_UNIXTIME konvertuje z PHP timestamp do DATETIME. Tieto metódy sa použijú priamo v SQL query, teda dátumy pridáme a aktualizujeme pomocou queries ako tieto:
    1. $query = "UPDATE table SET
    2.    datetimefield = FROM_UNIXTIME($phpdate)
    3.    WHERE…";
    4. $query = "SELECT UNIX_TIMESTAMP(datetimefield)
    5.    FROM table WHERE…";
  3. Posledná možnosť je jednoducho použiť už spomínaný PHP timestamp formát úplne všade. Keďže PHP timestamp je typu unsigned integer, môžme použiť stĺpec typu unsigned integer aj v MySQL na uloženie tohto nášho PHP timestampu. Tento spôsob je bez akejkoľvek konverzie, jednoducho pracujeme s PHP timestamp, ktorú ukladáme a spätne ťaháme z databázy. Majte ale na pamäti, že pri používaní stĺpca unsigned integer na ukladanie vašich dátumov strácate veľa funkcionality, ktorú obsahuje MySQL, pretože MySQL nebude vedieť, že vaše dátumy sú dátumy. Stále môžete triediť záznamy vo vašich dátumových poliach, lebo php timestamps po čase pravidelne inkrementujú, ale ak chcete používať akékoľvek dátumové alebo časové funkcie MySQL, budete musieť použiť FROM_UNIXTIME na získanie MySQL DATETIME. Avšak ak používate databázu iba na skladovanie informácií o dátume a všetku manipuláciu s nimi preberá PHP, nie je problém.

Tak, dostali sme sa pred rozhodnutie, ktorý spôsob, ktorú možnosť si vybrať. Ak nepotrebujete manipulovať s dátumami priamo v MySQL (sql queries), nie je o čom – posledná možnosť je pre vás priam ideálna. Je simple-to-use a ďalšia výhoda spočíva v tom, že šetrí miesto (tabuľka nemá veľkú veľkosť) a tým pádom čítanie/zapisovanie dát z/do tabuľky je o to rýchlejšie.

Nevýhoda tkvie v tom, že niektoré queries (požiadavky na db) môžu byť komplikovanejšie, lebo váš dátum nie je v stĺpci špeciálneho typu určeného pre prácu s dátumami (napr. ak chcete vybrať všetkých užívateľov, ktorí sa registrovali na vašom webe za dnešok). V tomto prípade je lepšie využiť možnosti 1 a 2. Ktoré z týchto možností použijete závisí na tom, či preferujete skôr prácu s MySQL alebo sa vám viac páči spracovanie dát v PHP. Osobne sa prichýlim k možnosti č. 2, ale pri výbere nemôžeme povedať, že táto voľba je zlá a tamtá správna. Záleží od situácie a od subjektívneho faktora :) – čo vám lepšie sadne.

Páčilo sa? Daj o článku vedieť svetu!

  • Jagg.cz
  • Linkuj.cz
  • Digg
  • del.icio.us
  • Facebook
  • Twitter
  • Technorati
  • LinkedIn
  • MySpace
  • email
  • Print
  • PDF
  • Add to favorites
  • pošli na vybrali.sme.sk

Ďalšie zaujímavé články


Kategória: PHP, MySQL | 1,226 zobrazení Author: Michal Tomanóczy