Autor Zpráva
Nailen
Profil
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
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
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
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'; 
?>
a pak použiješ jen
<?
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
ú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
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
ú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
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
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
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
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

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0