Oznámení
Divné chování při formátování datumu
před 10 lety
- bas
- Člen | 3
Zdravím,
na výpis dat z DB používám takovouto konstrukci:
$result = $this->db->select('*')->from('user_profile')
->where('user_user_id= %i', $this->getUserId($email))->execute();
$result->setType('birthday', dibi::FIELD_DATETIME, 'j.n.Y');
return $result->fetch();
Vše funguje tak jak má, ale pokud v DB tabulce není ve sloupečku birthday nastavena hodnota, tak získám nesmyslný výsledek „birthday“ ⇒ string(11) „30.11.-0001“ . Pokud tam nějaká hodnota je, tak vše funguje dobře.
Ještě jen pro doplnění, toto chování způsobuje $result->setType(‚birthday‘, dibi::FIELD_DATETIME, ‚j.n.Y‘);
Má otázka zní zda používám špatně $result->setType() nebo je chyba jinde?
Díky
před 10 lety
- deric
- Člen | 93
Nevím jestli jsem správně pochopil problém, nicméně mám pocit, že problém spočívá v ukládání dat do DB (předpokládám, že datum načteš do nějakého formuláře a pak jej uložíš). Tedy to, co potřebuješ, je zpětná konverze na formát DB.
Pokud je problém v tomto, můžu ti poslat můj (poměrně ošklivý) bugfix :)
Editoval deric (15. 11. 2009 18:07)
před 10 lety
- bas
- Člen | 3
Díky za reakci,
asi jsem to popsal nesrozumitelně.
Potřebuji formátovat datum na sloupečku „birthday“. To provádím přes $result->setType(‚birthday‘, dibi::FIELD_DATETIME, ‚j.n.Y‘);.
Vše funguje jak má, ale pokud birthday je nulová hodnota, tak při použití dibi formátování mi fetch() vrátí pole kde je „birthday“ ⇒ string(11) „30.11.-0001“..což je nesmysl.
Co by měl fetch() vrátit pokud zrovna datum nebude v DB uvedený a daný sloupek si chci formátovat přes setType ?
předpokládám nějaký FALSE nebo "" … ?
před 10 lety
- deric
- Člen | 93
děláš to správně, toto je asi bug php/mysql (nevypadá to na feature).
DibiResult.php
line cca 638
$value = new DateTime($value);
return $value ? $value->format($format) : NULL;
php 5.2.10.dfsg.1–2ubuntu6.1:
Creating DateTime with "0000-00-00 00:00:00"
formated as j.n.Y => "30.11.-0001"
formated as U => "-62169987600"
mysql vrací null datum jako string, takže mě napadá jenom řešení typu
//if mysql
if(($value === '0000-00-00 00:00:00' || $value === '0000-00-00')) {
return NULL;
}
v php 5.3 je možné použít funkci:
http://php.net/…m-format.php
a při použití
date($format, strtotime($value));
dostaneš 1.1.1970, což taky není nejšťastnější, ale pořád lepší než hodnota od DateTime
Editoval deric (15. 11. 2009 20:08)
před 10 lety
- bas
- Člen | 3
Díky za pomoc
před 10 lety
- David Grudl
- Nette Core | 6806
Možná by pomohlo nahradit
if ($value == NULL) { // intentionally ==
za
if ((int) $value === 0) { // '', NULL, FALSE, '0000-00-00', ...
před 10 lety
- deric
- Člen | 93
jo, to vypadá mnohem lépe. ještě to zítra odzkouším. díky