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: Načtení dat, pouze jednou

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

Aktivity
Avatar
adder
Člen
Avatar
adder:1.9.2015 20:24

Zdravím,
v menším projektu využívám šablonovací systém latte, kde jako startovní soubor pro načtení mám start.php. V něm načítám data z databáze do proměnné $osoby. Můj problém spočívá v tom, že chci načíst jen jednou, při vstupu na web. Teď vždy přepíši proměnou $osoby (kvůli require('star­t.php'); ) a je vždycky prázdná.

Napadá mě využití Singletonu. Ale zde je problém, že trochu kostrbatě třídu Osoby používám ještě pro tvorbu jednou dalšího objektu.

$osoby = new Osoby(); // bude vždy prázdné (isEmpty()) pokud na každé stránce vytvořím tuhle proměnou znovu

if($osoby->isEmpty) {
        // ... načtení dat
}

Jde to zajistit jiným způsobem? Děkuji moc

Odpovědět
1.9.2015 20:24
I’m going to lay this brick as perfectly as a brick can be laid.
Avatar
Odpovídá na adder
Martin Konečný (pavelco1998):1.9.2015 20:34

Zdar,
jen moc nechápu to, že tu proměnnou přepíšeš. Když jí nastavíš hodnotu v souboru start.php, kde tu proměnnou znova nastavuješ?

Nahoru Odpovědět
1.9.2015 20:34
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
adder
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
adder:1.9.2015 20:38

Vlastně já ji nepřepisuji. Jen jsem myslel, že když vkládám start.php, tak se vždy znova vytvoří proměnná, takže bude prázdná a budu opět načítat data.

Nahoru Odpovědět
1.9.2015 20:38
I’m going to lay this brick as perfectly as a brick can be laid.
Avatar
Odpovídá na adder
Patrik Valkovič:1.9.2015 20:45

http://php.net/…ire-once.php
Tohle ti načte soubor pouze jednou. moc nechápu, jakým způsobem to myslíš. Při každém požadavku od klienta musíš znovu vytvářet Osoby, takže nevím jakým způsobem myslíš, že ji přepisuješ.
Eventuelně můžeš použít isset($osoby) jako podmínku, jestli vytvářet osoby nové. Pokud již proměnná s takovým názvem existuje, tak funkce vrátí true.

Nahoru Odpovědět
1.9.2015 20:45
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Odpovídá na Patrik Valkovič
Uživatel sítě :1.9.2015 20:49

Myslím si, že mu jde o něco podobné na způsob keše. Nechce to vypisovat vždy/číst data z db když znovu načteš stránku.

adder: Chápu-li to správně, tak si při načtení vytvoř dočasný soubor, tam přepiš data, které chceš vypsat a po nějaké době (hodinka, den) smaž a potom si jej vytvoř znovu.

Editováno 1.9.2015 20:51
Nahoru Odpovědět
1.9.2015 20:49
Chybami se člověk učí, běžte se učit jinam!
Avatar
adder
Člen
Avatar
Odpovídá na Patrik Valkovič
adder:1.9.2015 20:58

Problém je v tom, že když dám následující kód, tak se to dostane to větve 'načtení databáze' i přesto, že už jsem je na jiné stránce načítal.

if(!isset($cars))
    $cars = new Cars();

if($cars->isEmpty()) {
        // ... načtení dat
}

Mara: Ano. něco na ten způsob. A nejde to jen uchovávat v proměnné?

Nahoru Odpovědět
1.9.2015 20:58
I’m going to lay this brick as perfectly as a brick can be laid.
Avatar
Odpovídá na adder
Uživatel sítě :1.9.2015 21:06

Co třeba sešna (session, ty se vlastně také uchovávají dočasně na serveru), jaká je velikost dat, odhadem?

Nahoru Odpovědět
1.9.2015 21:06
Chybami se člověk učí, běžte se učit jinam!
Avatar
Odpovídá na adder
Patrik Valkovič:1.9.2015 21:07

Ne, do proměnné uchovávat informace nemůžeš, protože při dotazu se zachytí požadavek a po jeho splnění se zase vše dá zpět do původního stavu (zjednodušeně řečeno). Pokud data, které z databáze načítáš, dále nijak neupravuješ (že bys nad nimi dělal nějakou časově náročnou operaci) a není výstup individuální pro každého uživatele (tedy že všichni uživatelé uvidí to stejné, nebo prakticky to stejné), zůstal bych u databáze. Nějaký cachovací systém bych tam nedával, ona ta databáze dokáže být v některých případech i rychlejší, než kdybys data byť jen jednoduše četl ze souboru.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
1.9.2015 21:07
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
adder
Člen
Avatar
Odpovídá na Uživatel sítě
adder:1.9.2015 21:14

To jsem zkoušel, ale přijde mi to prasácký a ani mi to nešlo. Je to externí XML soubor a nynější, který používám má 164kB, ale může se lišit (data do souboru jsou generována jiným zdrojem).

Nahoru Odpovědět
1.9.2015 21:14
I’m going to lay this brick as perfectly as a brick can be laid.
Avatar
adder
Člen
Avatar
Odpovídá na Patrik Valkovič
adder:1.9.2015 21:18

Jde jen o to, že jsem to nechtěl pořád načítat celé. Když mám např. stránku kontakt, kde nepotřebuji vůbec načítat databázi, tak to zpomaluje (alespoň se mi to zdá). Nebo další stránky, kde chci jen 4 objekty z databáze.

Nahoru Odpovědět
1.9.2015 21:18
I’m going to lay this brick as perfectly as a brick can be laid.
Avatar
Uživatel sítě :1.9.2015 21:23

adder Hmm, tak to bude špatný návrh třídy kde provádíš výpis. Resp. proč děláš výpis tam kde ho nepotřebuješ?

Nahoru Odpovědět
1.9.2015 21:23
Chybami se člověk učí, běžte se učit jinam!
Avatar
adder
Člen
Avatar
Odpovídá na Uživatel sítě
adder:1.9.2015 21:33

Výpis provádím až v šabloně. Nebo jak to myslíš?

Nahoru Odpovědět
1.9.2015 21:33
I’m going to lay this brick as perfectly as a brick can be laid.
Avatar
Odpovídá na adder
Uživatel sítě :1.9.2015 22:02

Tak proč to načítáš na stránce kde máš kontakt, když to tam nepotřebuješ?

Nahoru Odpovědět
1.9.2015 22:02
Chybami se člověk učí, běžte se učit jinam!
Avatar
adder
Člen
Avatar
adder:9.9.2015 17:15

Díky za pomoc. :)

Nahoru Odpovědět
9.9.2015 17:15
I’m going to lay this brick as perfectly as a brick can be laid.
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 14 zpráv z 14.