Návštěvní kniha v PHP s reakcí na příspěvky

 |  PHP: Základy  |  59 521x
_

Také v novém roce bych rád pokračoval s články v oboru. Mám tu ještě nějaké resty u starších textů, které potřebují revizi. Návštěvní kniha v PHP a MySQL s reakcí na příspěvky byla velmi navštěvovaným článkem, a tak je více než vhodné ji malinko předělat. Začaly se mi tu množit dotazy, proč to nyní nefunguje... Knížku jsem totiž psal v době, kdy PHP5 rozhodně nebylo samozřejmostí. Bylo potřeba dodržovat nějakou zpětnou kompatibilitu, která už je ale v tuto chvíli bezpředmětná. Celou miniaplikaci jsem tedy aktualizoval a stejně jako naposledy si i dnes ukážeme, jak ji rozběhnout na vlastním webu. Také si projdeme některé nové funkce a vychytávky, které jsem zachoval, přidal či zrušil.

1. Co všechno návštěvní kniha umí

Než si ukážeme, jak knížku nainstalovat, projdeme si, co všechno vlastně umí. Aplikace se skládá ze dvou skriptů (frontend a backend), instalačního souboru, configu, souboru s funkcemi a tří knihoven. Části kódu jsem se snažil okomentovat tak, aby bylo jasné, k čemu přesně slouží. Co vás tedy zajímá, jsou souboru "guestbook.php", "guestbook-admin.php", "config.php" a případně i "functions.php".

Funkce:

  • jednoúrovňová reakce na příspěvky: žádná složitá strukturovaná diskuse, pouze první úroveň odpovědí
  • základní formátování písma, smajlíci
  • několik vrstev antispamu
  • administrace
  • notifikace na e-mail
  • ošetření dlouhých řetězců

2. Přístup do databáze

Tímto začneme. Po rozbalení zipky, ještě před samotnou instalací musíme nastavit přístupové údaje do databáze. Otevřeme soubor "config.php" a hned na začátku upravíme:

$config['db']['host'] = 'localhost';	// db server
$config['db']['user'] = 'root';		// uzivatel
$config['db']['pass'] = '';		// heslo
$config['db']['name'] = 'mysql';	// jmeno databaze

3. Instalace: vytvoření tabulky v databázi

Tabulku můžeme vytvořit buď manuálně nebo spuštěním skriptu "guestbook-install.php". Na první pohled se možná zarazíte, proč se datum ukládá do varcharu namísto jiného, přijatelnějšího formátu: je to pouze kvůli zpětné kompatibilitě. Tak, aby to stále fungovalo, když si vezmete čistě skripty a přepíšete ty původní.

CREATE TABLE `knizka_2` (
	`id` int(10) unsigned NOT NULL auto_increment,
	`jmeno` varchar(255),
	`text` text,
	`datum` varchar(255),
	`email` varchar(255),
	`web` varchar(255),
	`addr` varchar(255),
	`r` int(11) DEFAULT '0',
	PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

4. Nastavení

Tabulka byla úspěšně vytvořena, nyní se můžeme pustit do rozšířeného nastavení guestbooku a podívat se, co všechno umí. Vrátíme se do souboru "config.php", kde je uvedeno další nastavení.

// vase IP adresa, pro odliseni komentaru (jmeno bude jinou barvou)
$config['guestbook']['myip'] = '127.0.0.1'; 

// po kolika budeme strankovat (reakce nejsou zapocitany)
$config['guestbook']['per_page'] = 10; 

// po kolika budeme strankovat v administraci
$config['guestbook']['per_page_admin'] = 20; 

// heslo do administrace - NEZAPOMENTE ZMENIT
$config['guestbook']['admin_password'] = '123'; 

// IP adresy, z nichz nebude povoleno zanechavat vzkazy
$config['guestbook']['blacklist'] = array(
    '127.0.0.2',
    '127.0.0.3',
);

// dalsi ochrana proti spamu - pokud bude v poli zprava nektere ze zadanych slov, 
// prispevek se neodesle. (piste malymi pismeny)
$config['guestbook']['spamwords'] = 'anatrim website [url] [/url]';

Takto jsou jednotlivé direktivy okomentovány přímo v souboru. Pokud máte pevnou IP adresu, můžete odlišit vlastní příspěvky jinou barvou. Následuje limit stránkování pro frontend i administraci spolu s heslem do administrace. Poslední 2 proměnné jsou pro vlastní ochranu knížky: můžeme zabanovat otravné spammery a definovat seznam slov, které zamezí uložení příspěvku.

Notifikace na e-mail

// budou chodit notifikace na email
$config['notif']['enable'] = true;

// kam budou chodit notifikace, mozno vice oddeleno strednikem
$config['notif']['to'] = 'vas@email.cz';

// odesilatel
$config['notif']['from_name'] = 'Guestbook - nový komentář';

// vzor predmetu
$config['notif']['subject'] = 'Nový komentář od %s';

// vzor pro telo emailu
$config['notif']['body'] = "
	Od: %s
	
	Zpráva: %s 
	
	Odkaz: %s
";

Nová verze knížky vám nyní pošle e-mail s každou novou zprávou. Nastavení je poměrně intuitivní, jediné, co stačí nastavit, je vaše e-mailová adresa. Pokud notifikace nechcete, stačí řádky zakomentovat. Nebo nastavit první proměnnou na false. Nebo prázdný řetězec do adresy. Testování probíhá přes konstrukt !empty, takže blok kódu se pak prostě přeskočí. Pro posílání e-mailu používám vlastní jednoduchou knihovnu, její náhradu za PHPMailera by měl zvládnout každý začátečník.

5. Změny oproti předchozí verzi

Celou knížku jsem dost překopal. Tabulka ale zůstala nezměněna, takže když starý guestbook smažete a nahradíte novým, o uloženou diskusi nepřijdete. Jak už jsem zmiňoval na začátku, hlavní důvod k nové verzi byla zpětná kompatibilita, která v nových verzích PHP už vyhazuje chyby. Co se tedy změnilo dále?

  • Třídy ve stylech jsou trochu rozumněji pojmenované, aby to případně nic nepřebíjelo.
  • Nasazena databázová třída a stránkovací knihovna - přesně ty, o kterých už jsem psal. Odkazy na články najdete znovu níže jako "Související". Až totiž soudruzi z NDR jednoho dne zakážou mysql_ funkce, změna bude pohodlnější.
  • Změnilo se ukládání data, nyní už ve formátu datetime: 2016-01-12. Kvůli zpětné kompatibilitě se ale stále ukládá do sloupce varchar. Každopádně není problém sloupec přetypovat.
  • Diskuse už nepřevádí odkazy, protože toto chování považuji za nevyžádané. Stejně tak už se nezobrazuje email - ten uvidíme pouze v administraci.
  • Chybové hlášky jsou méně "nasírací" :-)
  • Systém reakcí je trochu upraven: už nesměruje na novou url, při reakci na reakci se akorát do příspěvku vloží jméno.
  • JavaScriptové funkce jsou psány na frameworku jQuery.
  • Formátovací značky už se vkládají na pozici vybraného textu (není-li vybraný, pak nakonec).

6. Ukázka a link ke stažení

Návštěvní knihu si můžete vyzkoušet zde: guestbook.php
ZIP archív stáhnout tu: guestbook.zip

Facebook Twitter Google+

Komentáře k článku "Návštěvní kniha v PHP s reakcí na příspěvky"
Zobrazuji pouze posledních 30 komentářů.

Gravatar
Michael 12. 1 2016, 12:39
180/209 Úterý 12. Ledna 2016, 12:39  |  Chrome, Windows 7

Díky moc, jak budu večer doma, hned to odzkouším :-)

Gravatar
Michael 12. 1 2016, 20:08
181/209 Úterý 12. Ledna 2016, 20:08  |  Chrome, Windows 7

Už je v provozu a je to super, děkuji ti moc :-)

Gravatar
Mike 12. 1 2016, 20:31
182/209 Úterý 12. Ledna 2016, 20:31  |  Opera, Windows 8.1

za málo, jsem rád, že to funguje.

každopádně koukám na web, a ten popisek ke kontrolnímu poli bych opravdu neměnil. je to základní ochrana proti robotům a takto to bude chráněné i proti většině uživatelů... (lidé si nemusí všimnout, že č.p. je uvedeno v patičce).

Gravatar
Michael 12. 1 2016, 22:10
183/209 Úterý 12. Ledna 2016, 22:10  |  Chrome, Windows 8.1

pravda, vrátím to :)

Gravatar
David 31. 1 2016, 22:58
184/209 Neděle 31. Ledna 2016, 22:58  |  Firefox, Windows XP

Ahoj, chci se zeptat, zkouším tvou návštěvní knihu, vše funguje v pořádku, jen proložené písmo "i" nefunguje. Poradíš, prosím, jak to zprovoznit? Díky.

Gravatar
Mike 1. 2 2016, 09:15
185/209 Pondělí 1. Února 2016, 09:15  |  Opera, Windows 8.1

ahoj, formátování funguje správně (viz testovací knížka) - tedy tak, jak bylo zamýšleno.

pokud se zkombinuje více formátovacích značek, tak se samozřejmě všechny nepřevedou - to už by byly potřeba zbytečně složité převáděcí funkce, které tam v tuto chvíli nemám.

Gravatar
David 1. 2 2016, 14:28
186/209 Pondělí 1. Února 2016, 14:28  |  Firefox, Windows XP

No, to jsem z toho jelen, protože i v testovací knize vidím slovo "italic" naprosto normálně napsané. Takže chyba bude asi někde na mé straně v mém PC. I tak díky moc za skvělou knihu.

Gravatar
Mike 1. 2 2016, 15:31
187/209 Pondělí 1. Února 2016, 15:31  |  Opera, Windows 8.1

no jo, už vím :-D zůstal mi tam tag <cite> namísto klasického <em>, prohlížeče to vykreslují různě... některé kurzívou, některé ne :-) stačí to upravit ve function.php, řádek 22. během dneška nahraji na server aktualizaci s opravou.

Gravatar
David 1. 2 2016, 17:49
188/209 Pondělí 1. Února 2016, 17:49  |  Chrome, Linux

Diky, opraveno a funguje :-)

Gravatar
Dušan 13. 2 2016, 21:09
189/209 Sobota 13. Února 2016, 21:09  |  Chrome, Windows

Ahoj chtěl jsem zkusit tvou návštěvní knihu, ale nemohu se připojit k databázi, doufám, že jsem nastavil v confing.php správně - podle současné (velmi steré návštěvní knihy) ale stále dostávám chybovou hlášku: 1045: Access denied for user 'zkojicincz'@'localhost' (using password: YES)
Co je špatně?
Díky

Gravatar
Mike 13. 2 2016, 22:39
190/209 Sobota 13. Února 2016, 22:39  |  Opera, Windows 8.1

ahoj, zcela určitě máš přístupové údaje do DB nastavené špatně. buď je špatně user, nebo heslo, nebo user nemá práva vytvořit dané připojení. nemáš například prohozený db_user a db_name? (kdyby to pořád nešlo, ozvu se na mail, ať to neřešíme veřejně).

Gravatar
KOM 14. 3 2016, 12:29
191/209 Pondělí 14. Března 2016, 12:29  |  Chrome, Windows

Ahoj, moc děkuji za tuto knihu, dobrá práce. Mám 2 věci, které potřebuji vyřešit.
1. Diakritiku v mailu (pouze odesílatel), který přijde jako notifikace na nový komentář. Chodí mi to takto: novĂ˝ komentář Všude jinde v mailu je diakritika zřejmě v pořádku.
2. Knihu jsem si přendal do své stránky, kterou includuji jako obsah do stránek, není tedy v původní složce "quesbook". Mám problém s definicí adresy ve <form action=<?php $config['guestbook']['self_url'] ?> a následně pak na 5. řádku a možná i na řádku 26.
Knihu mám ve strance kniha_navstev.php, ktera je ve slozce "obsah". Pokud ve <form> zrusim action a vyremuji radek 5. vse beha. Ale prijde mi lito, nevyuzit vlozeni odkazu na knihu do mailu.

Gravatar
KOM 14. 3 2016, 12:46
192/209 Pondělí 14. Března 2016, 12:46  |  Chrome, Windows

A vlastne bych mel jeste jeden dotaz. Jak zavolat javascript, kdyz jsem si knihu vyndal z puvodniho umisteni? samotne dva JS jsem vlozil do sve slozky: kořen webu/JS

Gravatar
Mike 14. 3 2016, 13:46
193/209 Pondělí 14. Března 2016, 13:46  |  Opera, Windows 8.1

ahoj, není zač :-)

1. tady blbne kódování. máš vše uloženo v utf-8 ? je na stránkách nastavené kódování utf-8 ? jiné kódování není problém, ale musel bys všechny moje soubory přeuložit.

2. normálně bych to tam dal natvrdo, prostě celou adresu, na které se kniha zobrazuje. nebo zkus vyměnit $_SERVER['PHP_SELF'] za $_SERVER['REQUEST_URI'].

3. no pokud máš javascripty v kořenu webu, musí stačit odkaz "js/guestbook.js". případně úplná adresa i s HTTP.

ideální by bylo, kdybych se na výsledek mohl někde podívat, pak mohu poradit konkrétněji.

Gravatar
KOM 14. 3 2016, 23:17
194/209 Pondělí 14. Března 2016, 23:17  |  Chrome, Windows 7

Diky za info. Ano s adresou napevno to beha, ale musim mit zaremovany ten radek č. 5. Neumim totiz do nej vlozit tu adresu natvrdo :(
Adresu javascriptu jsem taky menil, ale docilil jsem jen toho, ze se mi otevrel cely script. Tedy pokud jsem mel spravne nahradit v kodu veskere: javascript:;
Adresa na kouknuti je zde:
http://www.kom72.cz/index.php?stranka=kniha_navstev

Gravatar
Mike 15. 3 2016, 09:01
195/209 Úterý 15. Března 2016, 09:01  |  Opera, Windows 8.1

ahoj, odkazy na JS jsou v pořádku, (když se podívám do kódu, co je tam zakomentované a zkusím dát adresu do prohlížeče) ale asi se ti tam hádají ty 2 různé verze jQuery. tedy ode mě nalinkuj pouze skripty "js/jquery.selection.js" a "js/guestbook.js" a dej to samozřejmě až za jQuery.

pokud to nebude fungovat, dej pryč svou jQuery (1.9) a využij tu mou (1.11) - je to novější verze, tedy lepší. ale pak zase musíš otestovat, jestli všechny ty ostatní věci budou fungovat správně.

a linky href="javascript:;" se nijak nenahrazují - javascripty si to obslouží samy.

k odkazu na sama sebe : zkus toto :
$config['guestbook']['self_url'] = 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
-
jak se liší PHP_SELF a REQUEST_URI můžeš nastudovat na php.net v manuálu. jinak ten form musí mít atribut "action", mohlo by to blbnout. raději natvrdo, než nic.

na blogu jsem uváděl i funkci, která umí automaticky zjistit aktuální url včetně všech parametrů a tak, můžeš se podívat, jen nevím, jestli to nebude už moc náročné. http://mike.treba.cz/zjisteni-url/

Gravatar
KOM 15. 3 2016, 15:01
196/209 Úterý 15. Března 2016, 15:01  |  Chrome, Windows

Ahoj, jsem trouba, měl jsem v hlavičcce to volání JS vyremované, asi jsem něco testoval a zapomněl jsem na to :-)
Ted uz to beha, tedy krome vkladani smajliku, ale ty stejne zrusim, takze mi je to jedno :-D
Mam jeste jeden dotaz. Dala by se kniha upravit tak, abych smel reagovat na prispevky pouze ja? Napada me zpristupnit tlacitko reaguj pouze z admin sekce?

Gravatar
Mike 15. 3 2016, 15:28
197/209 Úterý 15. Března 2016, 15:28  |  Opera, Windows 8.1

mně by zajímalo, kde jsi přišel na slovo "vyremované" :-) v oboru se pohybuji už dlouho, ale vidím to poprvé :-) (používá se více zažitý termín "zakomentovat / zakomentované")

ale zpět k dotazu : nejsnazší je podmínit tlačítko na IP adresu, ať se furt nemusíš přihlašovat kvůli každé odpovědi. (kde 127.0.0.1 je nutné nahradit tvojí skutečnou IP adresou).

<? if($_SERVER['REMOTE_ADDR'] == '127.0.0.1'){?>
odkaz reaguj
<? }?>

a nebo potom podmínka, když jsi přilášený, tlačítko tam bude:

<? if(!empty($_SESSION['is_logged'])){?>
odkaz reaguj
<? }?>

Gravatar
KOM 15. 3 2016, 15:38
198/209 Úterý 15. Března 2016, 15:38  |  Chrome, Windows

jo jenze to jde pouze u pevne IP adresy. a tu ja u UPC nemam...

Gravatar
KOM 15. 3 2016, 15:53
199/209 Úterý 15. Března 2016, 15:53  |  Chrome, Windows

a ten druhy dotaz nevim kam a jak zakomponovat :-(

Gravatar
Mike 15. 3 2016, 16:00
200/209 Úterý 15. Března 2016, 16:00  |  Opera, Windows 8.1

najdi si v souboru guestbook.php ten odkaz "reaguj", je tam 2x. a tou podmínkou ho obalíš. takže vznikne něco jako

<? if(!empty($_SESSION['is_logged'])){?>
<a href="javascript:;" ...>reaguj</a>
<? }?>

a na tom druhém místě stejným způsobem.

Gravatar
KOM 15. 3 2016, 22:31
201/209 Úterý 15. Března 2016, 22:31  |  Chrome, Windows 7

omlouvám se, že to tu zahlcuji :-)
Jeste bych potreboval helpnout s tou admin sekci. Admina jsem vlozil do dalsi stranky:
http://www.kom72.cz/index.php?stranka=kniha_navste-v_admin
a pri editaci ci pokusu o smazani, mne to vyhodi na uvodni stranku.
A jak by fungovalo ta odpoved/reaguj pouze prez mne? Prave pri te editaci?

Gravatar
Mike 16. 3 2016, 10:57
202/209 Středa 16. Března 2016, 10:57  |  Opera, Windows 8.1

v pohodě, reagoval jsem na FB :-)

Gravatar
Kysa 3. 5 2016, 20:35
203/209 Úterý 3. Května 2016, 20:35  |  Opera, Windows

Ahoj, po aktualizaci na ubuntu 16.04 jsem zjistil, že soudruzi z NDR už mysql funkce zakázali. Nemáš v plánu upgrade?
Jinak díky za tvou dobrou práci.

Gravatar
Mike 4. 5 2016, 11:30
204/209 Středa 4. Května 2016, 11:30  |  Opera, Windows 8.1

ahoj, do budoucna to v plánu je, ale v tuto chvíli, kdy na většině hostingů mysql_funkce stále frčí, to zatím upravovat nebudu.

Gravatar
Jiří 24. 5 2016, 00:51
205/209 Úterý 24. Května 2016, 00:51  |  Opera, Windows 7

Jaký kód vložit do html stránky na webu, aby se na ní zobrazovala tato návštěvní kniha?

Gravatar
Mike 24. 5 2016, 09:10
206/209 Úterý 24. Května 2016, 09:10  |  Opera, Windows 8.1

ahoj, návštěvní knihu si musíš stáhnout a vložit na svoje stránky sám - nejde o žádnou službu, která guestbook nabízí, ale o hotovou aplikaci, kterou si můžeš upravit. pokud si vložením nejsi jistý, použil bych iframe.

Gravatar
Charles 24. 7 2017, 18:12
207/209 Pondělí 24. Července 2017, 18:12  |  Firefox, Windows

Ahoj, zhruba rok jsem si užíval na mém webu tuto krásně vymyšlenou návštěvní knihu pro "neprogramátora". :-) Fakt super a moc díky za dobře odvedenou práci. Nyní jsem se však dostal do situace, kdy jsem web zmigroval na PHP7 a návštěvní knihy přestaly fungovat. Jedná se o změnu příkazů "mysql..." na "mysgli...". Ještě náhodou neuvažuješ o nějakém tom upgrade, jak se už ptal Kysa? Díky moc!

Gravatar
Mike 26. 7 2017, 16:36
208/209 Středa 26. Července 2017, 16:36  |  Opera, Windows 8.1

ahoj, ta knížka už je celkově tak trochu zastaralá. nějaký update pravděpodobně proběhne, ale vůbec nemůžu slíbit kdy. PHP7 už je hodně jiné od PHP5, jestě jsem s ním neměl tu čest, takže ono to nebude jen o přepsání nepodporovaných funkcí. no jednoho dne se k tomu určitě donutím :-)

Gravatar
Charles 26. 7 2017, 20:02
209/209 Středa 26. Července 2017, 20:02  |  Firefox, Windows

OK, díky za odpověď. Tak já budu chvíli bádat :-)
https://secure.php.net/manual/en/book.mysqli.php

Celá diskuse

Přidat komentář







Nevím, kolik to je
Parak simati, Muballit mitte, Nergal allatu mellamu mesaru, La tapallah Annuaki, Kettu Puluthu qillatua