Nette\DateTime nevrazi pri selectu co by melo (co bych chtel)

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Stig
Člen | 29
+
0
-

Pri selectu dat z tabulky kde je sloupec typu „datetime“ roven „0000–00–00 00:00:00“ mi Nette\DateTime vyplivne zajimavej cas „-0001–11–30 00:00:00“ coz se mi nelibi. Tabulky, sloupce, databaze vse je v utf8. S Dibi funguje OK. A vsechno ostatni – diakritika.. OK. Pri nenulovym datu je vysledek taky OK.

Pouzivam posledni Nette s Nette\Database.

Jediny cim jsi nejsem jistej je charset v configu pri pripojeni:

default:
      dsn: 'mysql:host=localhost;dbname=x;charset=utf-8'
      user: x
      password: x

jinak uz opravdu nevim co s tim. Nevi nekdo?

diks

//nette database - NENI ok.

$a = $this->context->database->table("admin")->select("last_login")->where(array("id_admin" => 2))->fetch()->toArray();
dump($a);

array(1) {
   last_login => Nette\DateTime(3) {
      date => "-0001-11-30 00:00:00" (20)
      timezone_type => 3
      timezone => "Europe/Prague" (13)
   }
}


//klasika je OK

$con = mysqli_connect("localhost","x","x","x");
$result = mysqli_query($con, "SELECT last_login FROM admin where id_admin = 2");
dump($result->fetch_row());

array(1) [
   0 => "0000-00-00 00:00:00" (19)
]
thm
Člen | 147
+
0
-

Toto je PHPčkem, nedávno jsem na to taky narazil. Řeším to tak, že v databázi používám buď datum nebo null.

Stig
Člen | 29
+
0
-

ok, jasny null to vyresi. diky

David Grudl
Nette Core | 8233
+
0
-

Teoreticky by se místo DateTime(‚0000–00–00 00:00:00‘) mohlo vyhazovat NULL.

llook
Člen | 407
+
0
-

Datum nultého nultý roku nula neexistuje. Správné chování by podle mě byla výjimka nebo přinejhorším ten NULL (nebo FALSE, aby se odlišilo od skutečného NULL).

Současné chování je ale hodně PHP-way…

Climber007
Člen | 105
+
0
-

Jak to vypadá z úpravou, kde by měly hodnoty ‚0000–00–00 00:00:00‘ z DB reprezentovat NULL v PHP? Ten záporný nesmysl, který to momentálně vyhazuje není nic příjemného :-)

h4kuna
Backer | 740
+
0
-

Udělej si trigger při uložení do db aby převedl ‚0000–00–00 00:00:00‘ na NULL

SET NEW.last_login := NULLIF(NEW.last_login, '0000-00-00 00:00:00');

Pak ti Nette bude vracet NULL.

Nebo se koukni na tuto proceduru která má zavislost na is_numeric a pak to můžeš používat kdekoliv v db.

CALL null_default(NEW.last_login);

Editoval h4kuna (17. 9. 2013 13:40)