Diskuze: Načtení dat, pouze jednou

PHP PHP Načtení dat, pouze jednou American English version English version

Avatar
adder
Člen
Avatar
adder:

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

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
Avatar
adder
Člen
Avatar
Odpovídá na Martin Konečný (pavelco1998)
adder:

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
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na adder
patrik.valkovic:

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
Marek Z.
Redaktor
Avatar
Odpovídá na patrik.valkovic
Marek Z.:

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 1.9.2015 20:49
Chybami se člověk učí, běžte se učit jinam!
Avatar
adder
Člen
Avatar
Odpovídá na patrik.valkovic
adder:

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
Marek Z.
Redaktor
Avatar
Odpovídá na adder
Marek Z.:

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
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na adder
patrik.valkovic:

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

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.valkovic
adder:

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
Marek Z.
Redaktor
Avatar
Marek Z.:

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 Marek Z.
adder:

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
Marek Z.
Redaktor
Avatar
Odpovídá na adder
Marek Z.:

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

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

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.