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

 |  PHP: Základy  |  64 728x
_

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
David 1. 2 2016, 17:49
188/217 Pondělí 1. Února 2016, 17:49  |  Chrome, Linux

Diky, opraveno a funguje :-)

Gravatar
Dušan 13. 2 2016, 21:09
189/217 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/217 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/217 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/217 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/217 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/217 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/217 Ú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/217 Ú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/217 Ú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/217 Ú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/217 Ú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/217 Ú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/217 Ú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/217 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/217 Ú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/217 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/217 Ú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/217 Ú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/217 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/217 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/217 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

Gravatar
Ján 1. 7 2019, 13:51
210/217 Pondělí 1. Července 2019, 13:51  |  Opera, Windows 7

Nie je mi jasné súbory css, images.. majú zostať v priečinkoch?

Gravatar
Ján 1. 7 2019, 14:00
211/217 Pondělí 1. Července 2019, 14:00  |  Opera, Windows 7

Takže urobil som všetko podla návodu aspoň si myslím, vytvoril som tabulku, nahral súbory na web presne tak ako som ich stiahol guestbook.php som nastavil ako inštaličný súbor a vyhodilo mi toto: Luke Skywalker a Fox Mulder * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License * @2014-07-08 * @version 2.3.5 **//** * ~ changelog from 2.0 (od 1.0 dropped) * 2.0.0 - je to cele uplne jinak. select nyni vraci objekt, pridany placeholdery atp, trida na sql dotazy, trida na db error... * - trida neni zpetne kompatibilni, nasazeni ovsem zustava * 2.0.1 - fixed some kind of bug s doplnovanim [name] kdyz je prazdny [title] * 2.2.0 - odstraneno nahrazovani 'now()' za now() u insertu a updatu * - celkove upravena metoda update * 2.2.1 - pridan parametr metode Query::assocList * 2.3.0 - pridano logovani u kazde metody update, delete a insert * 2.3.1 - viditelnost db:$prefix nastavena na public * 2.3.2 - metode Query::row() pridan parametr stejny jako u Query::fetch() * 2.3.3 - fixed bug Db::insert aby umela i ne-intove klice * 2.3.4 - jen drobna uspora mista (zadne zmeny) * 2.3.5 - updatovano logovani - je tam ted cely SQL dotaz - aby to slo z tama jen vykopirovat a aktualizovat jinde * - do tabulky logu pridan sloupec `whole_query` * - @2011-08-28 * 2.3.6 - pridani metod na nastaveni logovacich tabulek **//** * pro pokrocily vypis mysql_error a zasilani notifikacnich emailu nutny error_handler s tridou SimpleMailer / nepovinne **//** * ----------------------------------------------------------------------------- // instance: $db = new Db(); // pripojeni k databazi || $db = new Db('db'); // povinne globalni promenne: $config['db']['host'] // db server $config['db']['user'] // uzivatel $config['db']['pass'] // heslo $config['db']['name'] // jmeno databaze // nepovinne globalni promenne //$config['db']['prefix'] // prefix bez podtrzitka //$config['db']['charset'] // sql dotaz pro set names, vychozi utf8 //$config['db']['title_replace'] // nahrada tit

Gravatar
Ján 1. 7 2019, 14:08
212/217 Pondělí 1. Července 2019, 14:08  |  Opera, Windows 7

Je možné že robím chybu niekde pri inštalácii questbooku, s novým php sa však iba zoznamujem. neviem či je tento questbook ešte aktuálny alebo nepodlieha licencii neviem sa pohnúť ďalej, vďaka za vysvetlenie.

Gravatar
Mike 1. 7 2019, 17:14
213/217 Pondělí 1. Července 2019, 17:14  |  Opera, Windows 8.1

@Ján : ahoj, licenci určitě žádné nepodléhá, ta je free, tedy můžeš s tím dělat cokoli potřebuješ.

problém možná bude, že knížka už je trochu zastaralá, jestli máš PHP 7, pravděpodobně to nepojede. (nemám otestováno).

jinak nechápu tuhle větu "guestbook.php som nastavil ako inštaličný súbor" jak nastavil? jak instalační?

jediná instalace je soubor "guestbook-install.php", což jenom vytvoří tabulku v databázi. a pokud jsi na PHP 7, tak už tady to nejspíš selže.

Gravatar
Ján 2. 7 2019, 16:07
214/217 Úterý 2. Července 2019, 16:07  |  Opera, Windows 7

Ano mám PHP 7, guestbook.php som myslel ako ten ktorý spúšta tabulku ale pozriem sa na to ešte raz a napíšem.

Gravatar
Ján 2. 7 2019, 16:27
215/217 Úterý 2. Července 2019, 16:27  |  Opera, Windows 7

Ano nešlo to už pri vytvorení tabulky tu je výpis:
Chyba

SQL dotaz:

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

MySQL hlási: Dokumentácia
#1044 - Zakázaný prístup pre užívateľa: 'skpoznanie'@'localhost' k databázi 'information_schema'

Gravatar
Ján 2. 7 2019, 17:19
216/217 Úterý 2. Července 2019, 17:19  |  Opera, Windows 7

To čo som našiel na internete ohľadom knihy návštev je už nepoužiteľné pre novú verziu PHP7, nenašiel som nič vhodné čo by sa dalo použiť. Neviete o dákom dobrom návode s podporou php7? Ďakujem

Gravatar
Mike 3. 7 2019, 18:42
217/217 Středa 3. Července 2019, 18:42  |  Opera, Windows 8.1

tak ta zmiňovaná chyba nesouvisí s PHP7, ale se špatně nastaveným přístupem do databáze v configu.php

jinak do information_schema to určitě nepatří, je potřeba zvolit (nebo vytvořit) jinou databázi.

každopádně tohle stejně problém s ne-kompatibilitou nevyřeší. takže se bojím, že víc neporadím, žádná hotová řešení pro PHP7 neznám...

Celá diskuse

Přidat komentář







Nevím, kolik to je
Elden stiger upp mot skyn, Dräpta krigare i dyn, Se Muspels flammor sprider sig, I allt som en gång var