| 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: 10 let
|
|||
0