NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: PHP PDO vkládání data

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Pavel
Tvůrce
Avatar
Pavel:18.4.2015 13:44

Ahoj,
zkouším PDO wrapper a nějak se mi nedaří vkládat do DB datum ve formátu 'datetime'.
příklad:
DB::insert("log", array('cas' => 'NOW()',
'ip' => $_SERVER['REMO­TE_ADDR']));

ip se zapíše, ale datum mám jen ve formátu 0000-00-00 00:00:00
(v db ulozeno jako typ: datetime)

Díky

 
Odpovědět
18.4.2015 13:44
Avatar
shaman
Člen
Avatar
Odpovídá na Pavel
shaman:18.4.2015 14:07

ten NOW() by nemal byt asi v uvodzovkach

Edit: NOW je nativny prikaz pre SQL. Ak chces PHP oddobu ta ten 'NOW()' zmen na

date("Y-m-d H:i:s")

Moze sa to hodit v pripade ze by SQL server a server kde bezi PHP mali ine casove pasma.

Editováno 18.4.2015 14:10
Nahoru Odpovědět
18.4.2015 14:07
try {...} catch (Exception ignored) { echo " ¯\_(ツ)_/¯ "; }
Avatar
Dominik Klapuch:18.4.2015 14:09
current(new Datetime);

Vložíš aktuální datum do DB.

Nahoru Odpovědět
18.4.2015 14:09
Kód a data patří k sobě.
Avatar
Odpovídá na shaman
Michal Žůrek - misaz:18.4.2015 14:10

ono to nepůjde ani bez uvozovek, protože pak to bude hledat PHP funkci now, která neexistuje. Buď si to musíš naimplementovat do wrapperu nebo ten čas tam nevkládat s pomocí databáze, ale s pomocí PHP takhle.

DB::insert("log", array(
   'cas' => date("Y-m-d H:i:s"),
   'ip' => $_SERVER['REMOTE_ADDR']
));

Btw. databáze by snad měla umět nastavit aktuální timestamp jako výchozí hodnotu, což by vyřešilo problém ještě efektivněji.

 
Nahoru Odpovědět
18.4.2015 14:10
Avatar
shaman
Člen
Avatar
Odpovídá na Pavel
shaman:18.4.2015 14:22

Vidim ze robis logger, takze teoreticky tie udaje budes len vkladat a nie editovat. Tym padom by si mohol tabulku log upravit, tak ze bude datetime nastavovat automaticky a ty sa o cas nemusis starat vobec. Priklad:

CREATE TABLE log
(
id int UNSIGNED NOT NULL,
cas datetime NOT NULL DEFAULT NOW(),
ip varchar(20) NOT NULL,
log text NULL,
PRIMARY KEY (id)
)
Nahoru Odpovědět
18.4.2015 14:22
try {...} catch (Exception ignored) { echo " ¯\_(ツ)_/¯ "; }
Avatar
Pavel
Tvůrce
Avatar
Pavel:18.4.2015 15:13

@shaman - musí být v uvozovkách, jelikož pak by to byl příkaz (viz Michal Žůrek),

@Facedown - funguje, ale jak si na to přišel? dá se s tím ještě něco dělat, nastavovat a jinak pracovat s date příp. s časem?

@Michal Žůrek - do wrapperu ne, toto byl jen příklad, a s datem v DB člověk pracuje častěji (přičíta přímo v DB, DB vystup s převodem, porovnání a pod.), tak by to nemělo smysl.

Myslel jsem spíš něco jako s pomocí nějakého operandu:
'%aNOW()' nebo pod.

Díky všem

 
Nahoru Odpovědět
18.4.2015 15:13
Avatar
Odpovídá na Pavel
Martin Konečný (pavelco1998):18.4.2015 15:17

Např. databázový wrapper v Nette přijímá objekt třídy DateTime a naopak ho i vrací, když vybíráš sloupec datového typu DATE(/TIME apod.). Takže např.

$date = $db->table("table")->select("date")->fetch()->date;

// $date je nyní objekt třídy DateTime
$now = new DateTime();
$diff = $now->diff($date);


// nebo naopak při insertu
$db->table("tabulka")->insert(array(
  "col" => "value",
  "date" => new DateTime()
));

Myslím, že je to velmi užitečná pomůcka, když ti to wrapper převede automaticky.

Editováno 18.4.2015 15:17
Nahoru Odpovědět
18.4.2015 15:17
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na Pavel
Dominik Klapuch:18.4.2015 16:03

Nevím, co by jsi s tím chtěl ještě dělat. Pokud si DateTime uložíš někam do proměnné, můžeš s ní pracovat, stačí se kouknout na dokumentaci.
Na způsob jsem přišel tak, že když si přes var_dump vypíšeš hodnotu new Datetime, dostaneš takový výstup (nebo alespoň hodně podobný):

object(DateTime)[1]
  public 'date' => string '2015-04-18 16:02:28.000000' (length=26)
  public 'timezone_type' => int 3
  public 'timezone' => string 'Europe/Berlin' (length=13)

Při zavolání current získáš tedy obsah proměnné date, při zavolání next a poté opět current, získáš hodnotu timezone_type.

Jak bylo psáno výše, Nette používá něco podobného.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
18.4.2015 16:03
Kód a data patří k sobě.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.