Diskuze: PHP PDO vkládání data

PHP PHP PHP PDO vkládání data American English version English version

Avatar
Pavel
Redaktor
Avatar
Pavel:

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:

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  +1 18.4.2015 14:07
try {...} catch (Exception ignored) { echo " ¯\_(ツ)_/¯ "; }
Avatar
Dominik Klapuch:
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):

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
Nesnáším {}, proto se jim vyhýbám.
Avatar
shaman
Člen
Avatar
Odpovídá na Pavel
shaman:

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  +2 18.4.2015 14:22
try {...} catch (Exception ignored) { echo " ¯\_(ツ)_/¯ "; }
Avatar
Pavel
Redaktor
Avatar
Pavel:

@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):

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
Avatar
Odpovídá na Pavel
Dominik Klapuch:

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í
+1 bodů
Řešení problému
Nahoru Odpovědět  +2 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.