Fórum v PHP a MySQL - 5. diel

Posledný diel seriálu Fórum v PHP a MySQL Vám prinesie hotovú "prevozu" schopnú aplikáciu, ktorú je odporúčané si upraviť podľa seba.

Upozornenie

Po malej prestávke som sa vrátil k seriálu o fóre v PHP a MySQL jazyku. V článku chcem upozorniť na to, že bol skritizovaný štýl syntaxe. Konkrétne ide o zápis superglobálnych polí a polí. Príklad môjho kódu: $GLOBALS[kod]. Príklad správneho alebo lepšie povedané odporúčanejšieho kódu je: $GLOBALS['kod'] alebo taktiež je možné použiť aj úvodzovky. Tieto spôsoby sa veľmi neodlišujú ale určite používať kód štýlom $GLOBALS[kod] nieje nefunkčné iba neodporúčané. Teraz by som sa vrátil k primárnej téme seriálu - vývoj diskusného fóra.

Čo bude nové?

Ak sa ma pýtate čo nové pribudne vo fóre tak to bude samozrejme sľub v závere minulého článku - stránkovanie. Ďalší cieľ, ktorý bol plánovaný je anti-spam. V podstate nepôjde o nič zložité iba pridanie jedného riadku k výpisom s databázy. Email sa nebude upravovať pri zápise do databázy ale pri načítaní zmení jeho tvar. Vrátim sa ešte k tomu stránkovaniu. Funkcia stránkovania bude obsahovať jeden paramenter, ktorý bude odčakávať číslo. Číslo bude predstavovať počet zobrazených tém na stránku.

Úprava kódu

Kód by mal byť teraz prepracovanejší hlave funkcia zobraz_temy(). Bude obohatená o stránkovanie. Funkcia už v podstate bola vysvetlená mierne v časti článku Čo bude nové?.
Zdrojový kód bude vyzerať nasledovne:
function zobraz_temy($zacni){

echo "<h2>Fórum</h2>n";

menu(); // volanie funkcie pre menu


$strana   = urlencode($_GET['strana']);

$zobrazit = urlencode($_GET['zobrazit']);




$pocet = mysql_num_rows(mysql_query("SELECT id_temy FROM temy"));

$pocet = ceil($pocet/$zacni);

if($pocet == NULL){


    echo "V databáze sa momentálne nenachádzajú žiadne články!<br />n";

    require_once("layout/bottom.php");

    exit();

}



if(isset($_GET['zobrazit'])){

    if($_GET['zobrazit'] == $zobrazit){


    $zobrazit = ceil($zobrazit);

        if($_GET['strana']){

            if($_GET['strana'] == $strana--){


                $strana = ceil($strana*$zacni);

                   $sql = mysql_query("SELECT id_temy, nadpis, datum FROM temy ORDER BY uprava DESC LIMIT $strana, $zobrazit");

                   while($stlpec = mysql_fetch_object($sql)){


                      $id_temy = $stlpec->id_temy;

                      $nadpis = $stlpec->nadpis;

                      $datum = $stlpec->datum;


                      echo
"<div class="tema">n";

                      echo
"<strong><a href="?id=$id_temy" title="$nadpis">$nadpis</a></strong><br />n";

                      echo
"<small>[ Dátum:$datum ]</small>n";


                      echo
"</div>n";

                  }

              }

         }

    }

} else {

      $sql = mysql_query("SELECT id_temy,nadpis,datum FROM temy ORDER BY uprava DESC LIMIT 0, $zacni");

      while($stlpec = mysql_fetch_object($sql)){


            $id_temy = $stlpec->id_temy;

            $nadpis  = $stlpec->nadpis;

            $datum   = $stlpec->datum;


            echo "<div class="tema">n";

            echo "<strong><a href="?id=$id_temy" title="">$nadpis</a></strong><br />n";

            echo "<small>[ Dátum:$datum ]</small>n";


            echo "</div>n";

      }

   }

   while($cislo != $pocet){

        $cislo++;

        echo "<a href="?strana=$cislo&amp;zobrazit=$zacni" title="$cislo">$cislo</a> n";


   }

}

Funkciu si môžete podrobne preštudovať a zistíte, že celé stránkovanie je založené iba na podmienkach. Samozrejme iba v tomto prípade. Spôsobov ako ho vytvoriť je nespočetne.

Jednu malú úpravu by sme mohli urobiť len tak pre radosť. Bude to pridanie premennej $zacni do súboru config.php. Tento postup je iba odporúčaný a nie vyžadovaný. Ale nech je to teda pokope, tak to dodržíme. Ďalší postup bude upravenie súboru index.php.
Zdrojový kód je nasledovný:

<? #index.php

require_once("config.php");

require_once("functions.php");

include_once("layout/top.php");



if(isset($_GET['id'])){

      if($_GET['id'] == $id)

      {

            zobraz_temu($id);

      }

} elseif(isset($_GET['tema']))

{

      vytvor_temu();

} else

{

      zobraz_temy($zacni);

}



include_once("layout/bottom.php");

mysql_close();

?>



Parameter $zacni je už teraz vložený do funkcie zobraz_temy(). Je to vlastne premenná, ktorá je už dopredu definovaná v konfiguračnom súbore config.php. Ďalšia úprava bude anti-spam. Urobíme ho jednoducho. Stačí ak pri výpise s databázy zmeníte načítaný reťazec.
Príklad:
$email = $zaznam->email;

$email = Str_Replace("@"," (at) ",$email);

Pri každom takomto výpise sa email upraví s tvaru email@domena.tld na tvar email(at)domena.tld. Rovnako si môžete zmeniť aj bodku alebo podobne. Posledná zmena sa týka funkcie zobraz_temu(). Vyhľadajte časť funkcie kde sa zapisuje príspevok do databázy k téme a pridajte tam tento riadok.
mysql_query("UPDATE temy SET uprava=NOW() WHERE id_temy='$id'");
V kódoch fóra sú aj komentáre takže Vám budú nápomocné. Bude tam popis typu "čo robí čo". Odporúčam si naštudovať aj tento článok, ak chcete mať ostrú aplikáciu umiestnenú na internete.

Zdrojové kódy

Celý zdrojový kód diskusného fóra stiahnete tu!

Záver

Toto by bola asi finálna úprava a fórum by Vám malo slúžiť na začiatok dobre. Po čase ho dokážete upraviť aj sami. Verím, že to dokážete už aj teraz. Seriál nadväzoval na základy PHP, ktoré učí seriál PHP pre začiatočníkov do určitých dielov, ktoré boli spomänuté v minulých častiach seriálu.
Alternatívne verzie: Text PDF Voice
Autor: PaBi3 · Kategória: Programovanie · Dátum: 08.09.2005 17:28

Komentáre

#1 Streetboy
00.00.0000 00:00
Ako docielit to, aby sa po odoslani prispevku stranka automaticky obnovila?

#2 admin Web E-mail
00.00.0000 00:00
admin Vytvor si nový súbor, ktorý bude príjmať dáta s formuláru(toho kde odosielaš príspevok). Potom do toho formuláru pridaj nejaký <input type='hidden' name='id_temy' /> aby si mal kam uložiť id témy kam posielaš príspevok. Nový súbor pochopiteľne nebude vypisovať do prehlidača žiadny kód a tak budeš môcť zaslať header.Aby som bol presnejší header bude vyzerať taktoheader('Location:index.php?id='.$id_temy.'');Nejako takto to porieš a bude to spravené podľa tvojich predstáv.

#3 Streetboy
00.00.0000 00:00
Ten novy subor, to ma byt *.php alebo nieco ine? Pochopisl som to takto: vytvorim subor (este, ale neviem aky), <input type... vlozim doformulara a header (!loc... vlozim do toho noveho suboru alebo do functions.php?

#4 admin Web E-mail
00.00.0000 00:00
admin A čo iné ako .php by to akože malo byť? [shy]
To je jedno aký môže sa volať aj spracovanie.php. Ale v súbore functions.php(funkcia zobraz_temu()) musíš zmeniť všetky action-y formuláru z $_SERVER['PHP_SELF'] na spracovanie.php.

le inak si to pochopil dobre. Header vložíš do toho nového súboru, pretože tam sa nebude vypisovať žiadny HTML kód do prehliadača.

Neviem či ešte ovládaš header-y a podobné veci, keď sa ma pýtaš akú koncovku má mať súbor [laugh], tak odporúčam prečítať PHP manuál alebo pár článkov na internete o tejto funkcií.

Ešte dodám, že v tom súbore sa bude príspevok ukladať do databázy. Čiže značná zmena by musela postihnúť aj súbor functions.php.

#5 cviko E-mail
04.05.2006 17:32
forum je nahodene funguje len mi nejde otvorit temu,kde je zadrhel? [frown]

#6 admin Web E-mail
04.05.2006 23:01
admin Asi som veľa pil, keď som to písal [laugh].
Skús pre index.php kód:<? #index.php
require_once("config.php");
require_once("functions.php");
include_once("layout/top.php");

if(isset($_GET['id'])){
zobraz_temu($_GET['id']);
} elseif(isset($_GET['tema']))
{
vytvor_temu();
} else
{
zobraz_temy($zacni);
}

include_once("layout/bottom.php");
mysql_close();
?>

#7 cviko E-mail
05.05.2006 21:19
dikes uz to fici [tongue]

#8 cviko E-mail
09.05.2006 14:47
ako sa daju vymazavat temy?

#9 admin Web E-mail
11.05.2006 07:05
admin Cez phpMyAdmin [idea].

#10 cviko E-mail
11.05.2006 14:43
to viem[wink]len ma zaujimalo ci nemas daku funkciu uz co by sa tam dala dat a priamo zo stranky by sa to dalo mazat

#11 admin Web E-mail
11.05.2006 15:23
admin Nie nič také som tam nedával. To fórum malo byť iba príklad ako ho urobiť...

#12 Ivo
06.08.2006 17:29
Ahoj, skusal som rozbehat tvoje forum (som php lama) a pise mi to "Server má problémy. Skúste to neskôr prosím.!". A to ako na localhoste tak na servery. Kde bude chyba? Dik

#13 admin Web E-mail
06.08.2006 21:11
admin Máš zle nastavené pripojenie do databázy alebo zlý názov databázy. Skontroluj si to [idea].

#14 Comper E-mail
20.06.2007 18:24
Dobry den, musim uznat vyborna stranka tato tu, vela som sa toho priucil. Aj toto forum je dobre navrhnute, pekne mi to funguje aspon teda zaklad musim si to trosku upravit, ale nefunguje mi znakova sada, na zaciatok otvarania databazy dam mysql_query("SET NAMES latin2"); ale furt nic, miesto makcenov otazniky a tak neviete kde je problem?

#15 Kata B. E-mail
20.08.2008 01:09
ako mozeme cez COUNT() zobrazit aktualny pocet odpovied danej temy ?

#16 tomas E-mail
12.08.2009 15:43
Zdravim, mam taky problem ucil som sa podal navodu Vasho vytvarat forum, zial aj ked nakopirujem vas kompletny balicek so zdrojakmi tak mi po najdeni na localhost/index.php ostane lie prazdna biela obrazovka v prehliadaci. Ked pustim rucne functions nieco tam je, ale css-ko nic nereaguje a stranka vyzera takto http://leteckaposta.sk/288906783581
prosim o pomoc. dakujem

#17 mely
17.12.2009 14:59
[16] tomas,
cawko, jednoducha pomoc, asi nemas dafaultne zapnute rozpoznanie <? kod ?> staci ak vsetky zaciatky prepises na <?php a uz to pojde :)

#18 a13 Web
23.12.2009 13:17
Skoda ze tento web uz nejako zamrzol :( boli tu celkom kvalitne clanky hlavne s dobrym seom lebo vzdy ked som nieco hladal tak top 3 odkazy boli vzdy sem. Este snad pred 3ma rokmi som zacal sa trochu zaujimat o php hned som prestal a teraz zase a zase to tu citam rad nejake navody :)

#19 admin Web E-mail
23.12.2009 20:06
admin Neboj sa, ešte sa rozmrazí ;-)

#20 Rexxar
07.01.2010 02:36
Preco pouzivas funkciu mysql_fetch_object?
Nebolo by efektivnejsie pouzit mysql_fetch_assoc? Nekritizujem, len sa pytam.

#21 Ondro
21.01.2016 13:06
Zdravim, tie zdrojaky nejde stiahnut, ak by nahodou niekde boli, uploadnes ich?

Osobné údaje
Captcha
Odpíšte text z obrázku. Rozlišujú sa malé a veľké písmená.
Obsah
Možnosti