tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

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