Autor | Zpráva | ||
---|---|---|---|
Nailen Profil |
#1 · Zasláno: 2. 5. 2016, 15:11:21
Dobrý den,
potřeboval bych poradit jak správně vypisovat data ve funkcích. Mám stránku, kde text vypisuji pomocí print ("..."); nebo echo "";
Některé texty načítám z databáze. Data z databáze načítám ve funkcích. Pokud funkce načítá jednu konkrétní hodnotu z databáze a vrací ji jako parametr funkce, tak je vše v po řádku a text (hodnota) se mi vypíše na správném místě textu, kde funkci volám. Pokud funkce načítá více hodnot z databáze a postupně je vypisuji přímo ve funkci povelem print (); tak se mi data vypisují úplně na začátku stránky. Jak toto mohu ovlivnit?
Děkuji za radu. |
||
Manny Profil |
#2 · Zasláno: 2. 5. 2016, 15:18:12
Nailen:
Funkce by neměla nic vypisovat. Výstup funkce ukládat do proměnné a tu vypsat teprve, až je to potřeba. |
||
juriad Profil |
#3 · Zasláno: 2. 5. 2016, 15:18:43
Nailen:
Funkce, které komunikují s databází by nikdy neměly nic vypisovat; je jedno, zda je to jedna hodnota nebo víc hodnot. Vždyť taková funkce nemůže vůbec vědět, jak budeš chtít výsledek formátovat. Když si vezmeš i takový pitomý datum, tak ho můžeš chtít vypsat v desítkách různích lokalizacích, můžeš jej chtít vypsat relativně, můžeš chtít vypsat různé části datumu, můžeš jej chtít použít pro výpočet něčeho dalšího. |
||
Taps Profil |
#4 · Zasláno: 2. 5. 2016, 15:18:48
Nailen:
„Pokud funkce načítá více hodnot z databáze a postupně je vypisuji přímo ve funkci povelem print (); tak se mi data vypisují úplně na začátku stránky. Jak toto mohu ovlivnit?“
tak údaje spojuji do proměnné a na konci je vypiš. Něco ve smyslu <? $data.= 'Věta '; $data.='Věta 2'; ?> <? print $data; ?> |
||
úsměv Profil |
Jak už řekl Manny...
co takhle místo function funkce{ $promena = /*dotaz do databaze*/ echo "$promena" } todle: $textNaVypsani = ahoj global $textNaVypsani function funkce{ $promena = /*dotaz do databaze*/ $textNaVypsani = $promena } echo "$textNaVypsani" problém odstaněn a navíc až budeš chtít někde pozit funkce() bez vypsani, nebudes muset tuto funkci obalovat <!-- --> PS: Za tim funkce samozřejmě musí být (). Kdykoliv budeš mít chuť použít echo ve funkci, pouzi $textNaVypsani, pokud jsi to uz pouzil (v te same funkci) tak k tomu to co potrebujes jednoduse pricti. kdyby tě otravovalo psat echo "$..." tak si na to udelej funci fnce() nebo q() (treba), ktera to vypise za tebe. A mimo to v mem prikladu chybi ';' na kazdem kroku. Provedl bych editaci, ale nemuzu se prihlasit. |
||
xROAL Profil |
#6 · Zasláno: 2. 5. 2016, 16:08:24
úsměv:
Globálne premenné tiež nie sú najlepšie riešenie. Ideálne je výsledok funkcie vrátiť: function funkce(){ $data = ziskajDataZDB(); return $data; } $textNaVypsani = funkce(); echo $textNaVypsani; |
||
úsměv Profil |
xROAL: (schrnuto: má pravdu.)
Ano, globalni proměne neni dobre pouzivat, ale tady to snad nevadi... Kazdopadně nema smysl se o tom hadat. Nevím přesně za jakych okolnosti, s globalnima funkcema by (jako se vsim) mohly být problémy. Return $data je asi jistějši. s globalnima funkcema... jasně ze to melo byt "s globalnima promenejma". |
||
Nailen Profil |
#8 · Zasláno: 2. 5. 2016, 18:30:49
Děkuji všem za rady a za vyjasnění.
Použil jsem ty tečky co psal Taps (úplně jsem na tuto možnost zapomněl) a return jak píší ostatní. Ještě jednou děkuji. |
||
juriad Profil |
#9 · Zasláno: 2. 5. 2016, 18:42:57
úsměv:
Snad nikdy není použití globálnich proměnných správné řešení. A v tomto případě, kdy se jimi snažíš simulovat návratovou hodnotu, je to vyloženě na škodu. Tvoji radu shledávám přímo závadnou. Taps: Vracet z funkce, která komunikuje s databází jakkoli formátovaný výstup je špatně. K tomu má docházet až co nejpozději, na prezentační vrstvě. Navíc tvůj kód používá nedefinovanou proměnnou $data. |
||
Nailen Profil |
#10 · Zasláno: 2. 5. 2016, 19:06:56
juriad:
jak to myslíte s tím formátováním, že je to špatně? Mám v databázi text, k němu název obrázku a vzhledem k tomu, že těchto obrázků a textů je 15, tak jsem chtěl použít funkci, která vygeneruje kód, který text s cestou a názvem k obrázku vygeneruje a vypíše vše hromadně. Jak jinak by jste to dělal bez funkce? Přímo do kódu každé stránky psal pořád dokola dotaz na databázi, while a formátování? To mi přijde zbytečně složité a zbytečné množství kódu navíc. Možná že se ale pletu a neznám tu správnou cestu. Díky |
||
Keeehi Profil |
#11 · Zasláno: 2. 5. 2016, 19:11:01
Nailen:
Myslím že juriad to myslel tak že bys to měl rozdělit do více funkcí. Zvlášť funkce na výběr dat a zvlášť funkce která vezme data na vstupu a vrátí naformátováná data. |
||
juriad Profil |
Budeš mít funkce:
// podle kriterií vyhledá v databázi články function getClanky($kriteria) { // mysql ... // while ... // nějaké ty hrátky s poli return $clanky; } // pomocná funkce pro zisk jediného článku podle ID function getClanek($id) { $clanky = getClanky(['id' => $id]); return count($clanky) == 1? $clanky[0] : NULL; } Pak budeš mít několik funkcí na jejich formátování a výpis function showClanekForListing($clanek) { // vypíše nadpis, první odstavec, první obrázek a odkaz na detail } function showClanekForDetail($clanek) { // vypíše nadpis, autora, datum, celý text; dovnitř textu třeba doplní reklamu // vypíše také galerii všech obrázků a seznam komentářů } Pak můžeš mít funkci, která je zkombinuje: function showListing($category = NULL) { foreach(getClanky(['category' => $category]) as $clanek) { showClanekForListing($clanek); } } Z těchto funkci si to pak poskládáš celou aplikaci: // stránka kategorie článků: showListing($category); // stránka s článkem: $clanek = getClanek($id); if ($clanek === NULL) { header("HTTP/1.0 404 Not Found"); showMessage('Článek s id=$id nebyl nalezen'); showListing(); exit(); } else { showClanekForDetail($clanek); } Každou část můžeš nekonečně vylepšit. Třeba můžeš do showListing přidat podporu pro stránkování. |
||
Nailen Profil |
#13 · Zasláno: 3. 5. 2016, 12:41:28
juriad:
Děkuji za vysvětlení. Bylo by to paráda, kdybych měl vaše znalosti. Takto to vypadá jednoduše, ale nemohu o sobě říct, že bych byl programátor, tak nevím jestli se v tom neztratím. Každopádně děkuji za rady. |
||
úsměv Profil |
#14 · Zasláno: 3. 5. 2016, 20:30:25 · Upravil/a: Moderátor (editace znemožněna) 4. 5. 2016, 22:32:47
juridad:
O tom ze pouziti globalnich funkci v mem prikladu je samo o sobe spatne bych se (mozna) hádal (což vzhledem k tomu že nemám tolik zkušeností...), ale v porovnání s return je to ubohost. Vzhledem k tomu že moji radu shledávaš přímo závadnou, bych to klidně napsal jako ten šedý moderátorský komentář pod příspěkem. kotva #5 |
||
Časová prodleva: 9 let
|
0