Diskusní fórum v PHP s využitím databáze – přidávání příspěvků

24. října 2001

V dnešním pokračování se zaměříme na přidávání příspěvků. Představím vám formulář pro přidávání příspěvků (form.php) a soubor new.php, který použijeme při přidávání nových témat a odpovědí zobrazovaných způsobem ‚all‘, tj. všechny najednou.

Formulář pro přidávání příspěvků (form.php)

Formulář bude stejný pro přidávání odpovědí i témat. Celý formulář umístíme pro přehlednost do tabulky. Jako nadpis uvedeme buď ‚Odpovědět na tento příspěvek‘ nebo ‚Nové téma‘.

                <!– TABULKA S FORMULÁŘEM NA ODPOVĚĎ NEBO PŘIDÁNÍ TÉMATU –>
<table width="50%" border="0" cellspacing="0" cellpadding="1" align="center" bgcolor="Black"><tr><td>
<table width="100%" border="0" cellspacing="0" cellpadding="3" align="center" bgcolor="white">
 <tr bgcolor="#4A4A4A"><td colspan="2" class="tableheading">
<?
//jedná se o nové téma nebo odpověď?
if ($id!="")
    echo ‚Odpovědět na tento příspěvek‘;
else
    echo ‚Nové téma‘;
?>
 </td></tr>

Formulář bude obsahovat tyto položky: Jméno, Heslo, Email, Předmět, Text zprávy a jedno zaškrtávací políčko určující, zda chce autor posílat odpovědi na svůj email. Povinné údaje budou Jméno, Předmět a Text zprávy. V předchozím fóru (bez použití databáze) se kontrola zadaných údajů prováděla JavaScriptem. Nyní budeme zadané údaje kontrolovat pouze pomocí PHP. Aby uživatel nemusel v případě chybně odeslaného formuláře (nebyly vyplněny všechny povinné údaje) vyplňovat všechny položky znovu, musíme u vstupních polí Jméno a Email uvést v atributu VALUE předchozí hodnotu odeslaného formuláře. Pokud ještě nebyl formulář odeslán, vložíme tam hodnotu z cookie (v $cookie_author je jméno a v $cookie_email je email). Pokud byste chtěli použít JavaScript, příslušný kód je ve zdrojovém kódu, který si budete moci stáhnout v některém z dalších dílů.

 <tr><td class="table"><b>Vaše jméno:</b> <font color="#FF0000">*</font></td><td>
    <form method="post">
    <input type="text" name="author" size="30" maxlength="50" class="input" style="WIDTH: 250px" value="
<?
if($author!="")
    echo $author;
else
    echo $cookie_author;
?>">
 </td></tr>
 <tr><td class="table">Vaše heslo: *</td><td><input type="password" name="password" size="30" maxlength="20" class="input" style="WIDTH: 250px"></td></tr>
 <tr><td class="table">Váš e-mail:</td><td><input type="text" name="email" size="30" maxlength="50" class="input" style="WIDTH: 250px" value="
<?
if($email!="")
    echo $email;
else
    echo $cookie_email;
?>">
 </td></tr>

V případě, že se jedná o odpověď ($id!=““), vložíme před předmět ‚Re:‘. O proměnné $subject již víme z předchozího článku.

 <tr><td class="table"><b>Předmět:</b> <font color="#FF0000">*</font></td><td><input style="WIDTH: 250px" type="text" name="subject" size="30" maxlength="50" class="input" value="
<?
//pokud se jedná o odpověď, vložíme před předmět "Re:"
if ($id!="") echo "Re: ";
echo $subject;
?>">
 </td></tr>

Aby uživatel v případě chybného odeslání formuláře nemusel vyplňovat text zprávy znovu, vložíme mezi tagy <textarea> a </textarea> kratičký kód <?echo $body?>. Posledním viditelným formulářovým prvkem je zaškrtávací pole ‚reply‘. V případě, že bude zaškrtnuté, hodnota proměnné $reply bude ‚Y‘.

 <tr><td valign="top" class="table"><b>Text zprávy:</b> <font color="#FF0000">*</font></td><td><textarea cols="40" rows="7" name="body" class="input" style="WIDTH: 350px"><?echo $body?></textarea></td></tr>
 <tr><td> </td><td class="table"><input type="checkbox" name="reply" value="Y" checked> Zasílat odpovědi na výše uvedený email</td></tr>
 <tr><td colspan="2" align="center"><input type="submit" name="send" value="Odeslat" class="input"></td></tr>
 <tr><td colspan="2" class="table"><font color="#FF0000">*</font> – povinný údaj<br>* – heslo zadejte pouze pokud máte zaregistrovanou přezdívku</td></tr>
</table></td></tr></table>

Ve formuláři budou i 4 skrytá pole. První s názvem ‚thread‘ bude obsahovat id příspěvku, na který odpovídáme. V dalším skrytém poli ‚id‘ bude id tématu, na které uživatel odpovídá nebo id tématu, pod které patří odpověď, na kterou uživatel odpovídá. Zní to složitě, ale ve skutečnosti je to velmi jednoduché. Pole ‚view‘ bude obsahovat způsob zobrazení příspěvků a poslední pole ‚sent‘ využijeme pro zjišťování toho, zda-li byl formulář již odeslán.

    <input type="hidden" name="thread" value="
<?
if (IsSet($id_answer))
    echo $id_answer;
else
    echo $id;
?>">
    <input type="hidden" name="id" value="<?echo $id?>">
    <input type="hidden" name="view" value="<?echo $view?>">
    <input type="hidden" name="sent" value="">
    </form>
<?if (IsSet($error)) echo ‚<center><font class="error">‘ . $error . ‚</font></center>‘;    //chybová hláška?>
</body></html>

Soubor new.php

Tento soubor použijeme při přidávání nových témat a odpovědí zobrazovaných způsobem ‚all‘, tj. všechny najednou. Na úvod zjistíme, zda byl formulář již odeslán. Pokud ano, zpracujeme odpověď souborem post.php. Při přidávání nového tématu bude šířka tabulky 50%, při přidávání odpovědi 90%. Pokud se jedná o přidávání odpovědi, vybereme z databáze příspěvek, na který se odpovídá a zapíšeme ho tabulky, aby měl uživatel před sebou příspěvek, na který odpovídá. Celá následující část již byla podrobně popsána v minulých dílech.

<?
if(IsSet($sent)) require "post.php";    //byl odeslán formulář?
$width=50;
if (IsSet($id_answer)) $width=90;
require "db.php";        //otevřeme databázi
require "style.php";    //načteme soubor s konfigurací
require "header.php";    //vložíme standardní hlavičku
if(IsSet($id_answer)):    //jedná se o odpověď?
//vybíráme příspěvek, na který se bude odpovídat
$topic = MySQL_Query("SELECT id, author, email, subject, body, date FROM phorum WHERE id = $id_answer") or die($query_error);
$entry = MySQL_Fetch_Array($topic);
$subject = $entry["subject"];
?>
                <!– TABULKA S PŘÍSPĚVKEM, NA KTERÝ SE BUDE ODPOVÍDAT–>
            
<table width="90%" border="0" cellspacing="0" cellpadding="1" align="center" bgcolor="Black"><tr><td>
<table width="100%" border="0" cellspacing="0" cellpadding="3" align="center" bgcolor="white">
 <tr bgcolor="#4A4A4A"><td colspan="2" class="tableheading"><?echo $entry["subject"]?></td></tr>
 <tr><td valign="top" width="80" class="text">
<?
//má autor příspěvku svůj obrázek? pokud ne, použijeme "no.gif"
$link = MySQL_Query("SELECT link FROM users WHERE name = ‚" . $entry["author"] . "’") or die($query_error);
$entry_2 = MySQL_Fetch_Array($link);
if($entry_2["link"]!="")
    echo ‚<img alt="‘ . $entry["author"] . ‚" src="images/‘ . $entry_2["link"] . ‚" align="left">‘;
else
    echo ‚<img alt="no image" src="images/no.gif" align="left">‘;
    
//autor, email, datum, text
echo ‚</td><td valign="top" width="100%" class="text">Autor: ‚;
if ($entry["email"]!="") echo ‚<a href="mailto:‘ . $entry["email"] . ‚">‘;    //zadal autor prispevku svuj email?
echo $entry["author"];
if ($entry["email"]!="") echo ‚</a>‘;
echo ‚<br>Datum: ‚;
echo Date("d. m. Y, H:i:s", $entry["date"]) . “;
echo ‚<br><br>‘ .$entry["body"] . ‚</td></tr>‘;
?>
</table></td></tr></table>
<br>
<?
endif;
require "form.php"; //vložíme formulář
?>

Na závěr vložíme formulář. V příštím dílu vás seznámím s tím, jak zpracovat odeslaný příspěvek.

Mohlo by vás také zajímat

Nejnovější

2 komentářů

  1. Jesse-James

    Říj 20, 2009 v 16:13

    Dobrý den,
    potřeboval bych poradit s přidáváním příspěvků, konkrétně s kódem :
    input type=“hidden“ name=“thread“ value=“
    „>
    <input type="hidden" name="id" value="“>
    <input type="hidden" name="view" value="“>

    <?if (IsSet($error)) echo '‘ . $error . “; //chybová hláška?>

    Pokud použiju tento kód, jakýkoli příspěvek má thread nastaveno na 0, tudíž je zobrazeno jako hl. téma (i když kliknu na odpovědět). Nevím kde je chyba… Pak sem ale zkoušel nastavit místo „hidden“ „text“ a vše najednou fungovalo normálně. Můžete mi někdo poradit, jak to mám udělat aby mi kód fungoval i když tam mám dáno „hidden“ ?

    Odpovědět
  2. Ann chriss

    Srp 2, 2017 v 7:04

    Nice blog. I would like to share it with my friends. I hope you will continue your works like this. Keep up the excellent work. You have a magical talent of holding readers mind. It is something special which cant be given to everyone. Keep it safe :) I think this is engaging and eye-opening material. Thank you so much for caring about your content and your readers.

    Odpovědět

Napsat komentář: Ann chriss Zrušit odpověď na komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *