PHP/MySQL : Gestabókin (1/2) Í dag ætlum við að búa til gestabók sem að gestirnir okkar geta skrifað í. Það eru til einhverjir vefir þar sem hægt er að fá sér gestabók, en henni fylgir þá yfirleitt að hún er á ensku, hýst annars staðar í öðru útliti en vefurinn þinn, og að auki oft með auglýsingum í.

Þessi gestabók er byggð á gestabók sem ég bjó til fyrir betri helminginn minn, þið getið séð bókina í ‘action’ á <a href="http://sigurros.betra.is/gestabok“>sigurros.betra.is/gestabok</a>. Eins og sjá má er sú gestabók mun heimilislegri en það sem að býðst annars staðar.

Í seinni hlutanum búum við svo til svona umsjónarsvæði, þar sem að við getum eytt út færslum í bókinni, t.d. ef að einhver ýtir óvart á Senda takkann tvisvar, eða einhver skrifar eitthvað í bókina sem við viljum ekki hafa þar.

Þessi gestabók byggir á PHP4 og MySQL, hægt er að nota aðra gagnagrunna að sjálfsögðu.

Fyrst ætla ég að kynna til sögurnar síðurnar okkar, ég ætla að lista upp allar skrárna sem ég nota:

=Gestabókin sjálf=
/gestabok/index.php
/gestabok/gestabok.php
/includes/connect.php
/includes/functions.php
/includes/functions.gestabok.php

=Umsjónarkerfið=
/admin/index.php
/admin/gestabok.php
/admin/includes/fotur.php
/admin/includes/functions.gestabok.php
/admin/includes/functions.php
/admin/includes/haus.php
/admin/includes/includes.php
/admin/includes/verify.php

=Stílsniðið=
/stilsnid.css

Fyrir þau ykkar sem sýnist þetta vera allt of viðamikið fyrir eina litla gestabók, og allt of stórt, þá ætla ég hér með að hugga ykkur með tveim staðreyndum:
1. Sumar þessara skráa eru ekki nema 3-10 línur hver
2. Þetta er minn stíll, þið getið þess vegna sameinað margar af þessum skrám í eina eða tvær ef ykkur finnst það þægilegra

Skipulagið miðast líka við það að við munum bæta við fleiri fítusum í vefinn okkar seinna meir, þannig að við séum ekki bara með gestabók, heldur líka fréttir og hvaðeina sem við viljum. Þetta skipulag á /include skrám og /admin svæði auðveldar okkur það. Maður á alltaf að reyna að gera hlutina þannig að auðvelt sé að bæta við og breyta, þess vegna nota ég þetta skipulag, og þess vegna nota ég svona margar include skrár. Stílsniðið nota ég svo til að geta breytt útlitinu á einum stað. Ég mun líklega gera grein um stílsnið bráðlega.

Þið eigið að geta afritað allan textann sem er á milli ======sida.php===== og ====loka sida.php==== og sett í skrá sem heitir nafninu. Þetta geri ég vegna þess að ég nenni ekki að láta textann minn breyta um lit, þið getið líka afritað allan þennan texta í .php skrá, og þá ætti litakóðinn að lita þetta fyrir ykkur.

Skoðum skrárnar fyrir gestabókina okkar:

========/gestabok/index.php========
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Gestabók&lt;/title&gt;
&lt;link rel=stylesheet href=”/stilsnid.css“ type=”text/css“&gt;
&lt;meta http-equiv=”Content-Type“ content=”text/html; charset=iso-8859-1“&gt;
&lt;/head&gt;
&lt;body bgcolor=”#FF9900“ marginwidth=0 marginheight=5 leftmargin=0 topmargin=5&gt;
&lt;?
include ”../includes/connect.php“;
include ”../includes/functions.php“;
include ”../includes/functions.gestabok.php“;

$pagetitle = ”Gestabók“;
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
?&gt;
&lt;TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 align=”center“&gt;
&lt;TR&gt;
&lt;?
if ($action == ”add“ || !$action) { add_gestabok(); }
if ($action == ”new“) { New_Gestabok($g_dags, $g_nafn, $g_netfang, $g_veffang, $g_efni, $g_texti); lesa_gestabok(); }
if ($action == ”lesa“) { lesa_gestabok(); }
?&gt;
&lt;/TR&gt;
&lt;/TABLE&gt;
&lt;/body&gt;
&lt;/html&gt;
=====loka index.php======

Raunar er meiri HTML kóði í síðunni, en þar sem hann er bara útlitið þurfum við ekkert að kíkja á hann, enda geri ég ráð fyrir því að þið viljið hafa ykkar eigið útlit á gestabókinni. Ég vek samt athygli á því að þessi index.php síða mín er að nota IFRAME, eða Inline Frame HTML táknið, það þýðir að innan í síðunni er að finna ramma, innihald hans kemur úr annari síðu, sem að er gestabok.php

========/gestabok/gestabok.php========
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Gestabók X&lt;/title&gt;
&lt;link rel=stylesheet href=”/stilsnid.css“ type=”text/css“&gt;
&lt;meta http-equiv=”Content-Type“ content=”text/html; charset=iso-8859-1“&gt;
&lt;/head&gt;
&lt;body bgcolor=”#9E9E80“ marginwidth=1 marginheight=0 leftmargin=1 topmargin=0&gt;
&lt;?
include ”../includes/connect.php“;
include ”../includes/functions.php“;
include ”../includes/functions.gestabok.php“;
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
get_gestabok($nr);
?&gt;
&lt;/body&gt;
&lt;/html&gt;
======loka gestabok.php======

Þetta er raunar allur kóðinn í þessari skrá, ekkert útlit hér nema bakgrunnurinn.

Eins og þið sjáið er þessi kóði voðalega lítill og léttur, í dag erum við nefnilega að prufa að nota hlutbundna forritun (OOP = Object Orientated Programming). PHP styður hlutbundna forritun að vissu marki, en telst samt ekki sem OOP mál. Fyrir þau sem eru alveg búnir að týna mér, andið djúpt og haldið áfram að lesa, þá sjáið þið hvað þetta getur verið sniðugt.

Nú vek ég athygli ykkar nefnilega á include setningunum mínum, þær eru þrjár talsins, það er vegna þess að ég er mjög duglegur að skilja að kóðann minn eftir því hvað hann gerir, aðrir gætu komist af með færri skrár ef þeir kysu það. Vaninn hefur stundum verið sá að kalla include skrár skra.inc, í stað skra.php. Það er mjög slæm venja raunar, þar sem að vefþjónninn birtir .inc skrár sem venjulegar textaskrár, þá getur einhver í raun lesið kóðann ykkar, sem að er slæmt ef að þið eruð með t.d. notandanafn og lykilorð. Ef að þið kallið include skrárnar ykkar líka .php eins og ég geri, þá skilar vefþjónninn því sem að þið látið php skrána skila, þannig að notandanafnið og lykilorðið sést ekki.

Nú lítum við á MySQL kóðann, við erum með tvær töflur, en í þessum hluta lítum við á aðra þeirra:

CREATE TABLE gestabok_t (
gestabok_id tinyint(4) NOT NULL auto_increment,
g_dags date DEFAULT ‘0000-00-00’ NOT NULL,
g_nafn varchar(60) NOT NULL,
g_netfang varchar(120),
g_veffang varchar(120),
g_efni varchar(50) NOT NULL,
g_texti text,
PRIMARY KEY (gestabok_id),
UNIQUE gestabok_id (gestabok_id)
);

Fyrir þá sem hafa áhyggjur af hinni töflunni, þá lítum við á hana í hluta 2, í umsjónarkerfinu okkar.

Eins og sjá má á þessari töflu þá ætlum við að geyma nafn, netfang, veffang, titil og texta gestanna okkar. Hér getið þið fækkað eða fjölgað eftir því hvað ykkur líst á, að sjálfsögðu.

Nú lítum við á þessar 3 include skrár sem að við sáum þarna uppi. Fyrir þá sem ekki hafa séð include áður, þá erum við í rauninni að segja PHP síðunni okkar að bæta innihaldi þeirra við í sig, þannig að ef að við erum að nota sama kóðann á fleirri en einni síðu, er sniðugast að setja hann í svona include skrá (sem er raunar venjuleg PHP skrá), ef að við þurfum að breyta kóðanum okkar breytum við honum í þessari einu skrá, í stað þess að þurfa að breyta nákvæmlega sama kóðanum í mörgum skrám, það er bara óþarfi.

========/includes/connect.php========
&lt;?
mysql_connect(”localhost“, ”notandi“,”lykilord“);
mysql_select_db (gestabok);
?&gt;
=====loka connect.php======

Allir þekkja þetta, við erum bara að senda nafn og lykilorð, og veljum gagnagrunninn okkar. Þar sem þetta er notað á öllum PHP síðunum okkar er gáfulegast að hafa þetta í include skrá, þá þurfum við ekki að hafa þennan kóða í hverri síðu.

========/includes/functions.php========
&lt;?
function new_date($old_date) {
list($a, $b, $c) = split(”-“, $old_date);
$nice_date = ”$c.$b.$a“;
return $nice_date;
}
?&gt;
====loka functions.php=====

Ekki mikið í þessari skrá, bara ein aðgerð sem að tekur MySQL dagsetninguna okkar á forminu 2001-06-21 og skilar henni frá sér sem 21.06.2001 . Á PHP korkinum er að finna viðbætur við þessa skrá, ef að þið mynduð vilja láta þetta skila t.d. 21. júní 2001 í staðinn. <a href=”http://www.hugi.is/vefsidugerd/korkar.php?sMonitor=viewpost&iPostID=181602&iBoardID=109&iStart=30“>Skoðið þær umræður hér</a>

Þar sem ég gæti t.d. notað þetta function (aðgerð) í fréttakerfinu mínu, þá hef ég þetta í sér skrá, þá geta tvö eða fleiri kerfi notað hana saman.

========/includes/functions.gestabok.php========
&lt;?
/****** GESTABÓK ***************************/

function New_Gestabok($g_dags, $g_nafn, $g_netfang, $g_veffang, $g_efni, $g_texti)
{
$query = ”INSERT INTO gestabok_t (g_dags, g_nafn, g_netfang, g_veffang, g_efni, g_texti) VALUES ('$g_dags', ‘$g_nafn’, ‘$g_netfang’, ‘$g_veffang’, ‘$g_efni’, ‘$g_texti’)“;
$result = mysql_db_query(”gestabok“, $query);
if(!$result){
return mysql_error();
echo mysql_error();
} else {
return 1;
}
}

/*#################*/

function get_gestabok ($nr)
{
if ($nr == ”all“) {
$query = ”SELECT * FROM gestabok_t ORDER BY g_dags DESC, gestabok_id DESC“;
} else {
$query = ”SELECT * FROM gestabok_t ORDER BY g_dags DESC, gestabok_id DESC LIMIT $nr“;
}
$result = mysql_db_query(”gestabok“, $query);
if ($row = mysql_fetch_array($result)) {
echo ”&lt;div class='gestabok_faerslur'&gt;";
do {
$dags = $row["g_dags"];
$nafn = $row["g_nafn"];
$netfang= $row["g_netfang"];
$veffang = $row["g_veffang"];
$efni = $row["g_efni"];
$texti = $row["g_texti"];

$dags = new_date($dags);
if ($nr == “all”) {
echo “$dags&lt;br&gt;”;
}
// NAFN OG NETFANG
if ($veffang != “” && $veffang != "http://“) {
echo ”&lt;a href='$veffang' target='_new'&gt;“;
}
echo ”&lt;u&gt;$nafn&lt;/u&gt;“;
if ($veffang != ”“ && $veffang != ”http://“) {
echo ”&lt;/a&gt;“;
}
// TITILL EF EINHVER
if ($efni != ”“) {
echo ” - &lt;u&gt;$efni&lt;/u&gt;“;
}
echo ”&lt;br&gt;“;
echo ”$texti“;
echo ”&lt;br&gt;&lt;br&gt;“;
} while($row = mysql_fetch_array($result));
}
mysql_free_result($result);
}

/*#################*/

function add_gestabok ()
{
echo ”
&lt;!– svæði vinstra megin –&gt;
&lt;TD BGCOLOR='#9E9E80' valign='top' WIDTH=245 HEIGHT=311 class='gestabokStort'&gt;
&lt;center&gt;Síðustu 3 skrifuðu:&lt;/center&gt;
&lt;iframe src='gestabok.php?nr=3' width='240' height='150' border='0' frameborder='0'&gt;&lt;/iframe&gt;
&lt;div align=right&gt;&lt;a href='?action=lesa' class='gestabokMinna'&gt;Skoða alla gestabókina&lt;/a&gt;&lt;/div&gt;
&lt;img src='images/formula.gif' width='133' height='110'&gt;
&lt;/TD&gt;
&lt;!– svæði vinstra lokar –&gt;

&lt;TD&gt;&nbsp;&lt;/TD&gt;

&lt;!– svæði hægra megin –&gt;
&lt;TD BGCOLOR='#9E9E80' valign='top' WIDTH=245 HEIGHT=311 class='gestabokStort'&gt;
&lt;center&gt;Skrifaðu í gestabókina&lt;/center&gt;
&lt;table border='0' cellpadding='1' cellspacing='1' width='230'&gt;
&lt;form name='addlink' action='index.php' method='post'&gt;
&lt;INPUT TYPE='hidden' NAME='action' value='new'&gt;
“;
$today = date(”Y-m-d“);
echo ”&lt;INPUT TYPE='hidden' NAME='g_dags' value='$today'&gt;
&lt;tr&gt;&lt;td class='gestabok'&gt;&lt;b&gt;Nafn&lt;/b&gt;&lt;/td&gt;
&lt;td class='gestabok'&gt;&lt;INPUT TYPE='text' size='25' maxlength='60' NAME='g_nafn'&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td class='gestabok'&gt;&lt;b&gt;Netfang&lt;/b&gt;&lt;/td&gt;
&lt;td class='gestabok'&gt;&lt;INPUT TYPE='text' size='25' maxlength='120' NAME='g_netfang'&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td class='gestabok'&gt;&lt;b&gt;Veffang&lt;/b&gt;&lt;/td&gt;
&lt;td class='gestabok'&gt;&lt;INPUT TYPE='text' size='25' maxlength='120' NAME='g_veffang' VALUE='http://'&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td class='gestabok'&gt;&lt;b&gt;Efni&lt;/b&gt;&lt;/td&gt;
&lt;td class='gestabok'&gt;&lt;INPUT TYPE='text' size='25' maxlength='50' NAME='g_efni'&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td class='gestabok' colspan='2'&gt;&lt;TEXTAREA NAME='g_texti' ROWS='7' COLS='36'&gt;&lt;/TEXTAREA&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td colspan='2' align='right'&gt;&lt;input type='Submit' value='Bæta við'&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/form&gt;&lt;/table&gt;
&lt;/TD&gt;
&lt;!– svæði hægra lokar –&gt;
“;
}

/*#################*/

function lesa_gestabok ()
{
echo ”
&lt;!– svæði vinstra megin –&gt;
&lt;TD colspan=3 BGCOLOR='#9E9E80' BACKGROUND='images/gestabok-finale_07.gif' valign='top' WIDTH=510 HEIGHT=311 class='gestabokStort'&gt;
&lt;center&gt;Gestabókin mín&lt;/center&gt;
&lt;iframe src='gestabok.php?nr=all' width='500' height='260' border='0' frameborder='0'&gt;&lt;/iframe&gt;
&lt;div align=right&gt;&lt;a href='index.php' class='gestabokMinna'&gt;Forsíða gestabókar&lt;/a&gt;&lt;/div&gt;
&lt;/TD&gt;
&lt;!– svæði hægra lokar –&gt;
“;
}
/*#################*/
?&gt;
====loka functions.gestabok.php====

Jaá! Þarna er allur kóðinn minn. Ef að þið berið saman nöfnin á þessum functions, við index.php og gestabok.php síðurnar mínar, sjáið þið að í functions.gestabok.php er ég að útfæra þau, á meðan að index.php og gestabok.php eru að kalla á þau (ná í það sem að þessi function skila frá sér).

Nettar útskýringar á því hvað þessar functions gera:

function New_Gestabok($g_dags, $g_nafn, $g_netfang, $g_veffang, $g_efni, $g_texti)
Þessi einfaldlega setur í gagnagrunninn minn það sem gesturinn minn skrifaði í forminu mínu.

function get_gestabok ($nr)
Þessi nær í færslur úr gestabókinni minni, $nr er fjöldi færslna sem við ætlum að ná í, ef að við ætlum að ná í allar færslur höfum við get_gestabok(all), annars get_gestabok(3) t.d. til að ná í 3 nýjustu færslurnar.

function add_gestabok ()
Þetta er forsíða gestabókarinnar, þetta function prentar út fullt af HTML kóða, þar á meðal innsláttarformið okkar sem að gestirnir fylla út. Þarna erum við líka með IFRAME sem að nær í 3 síðustu færslurnar. &lt;iframe src='gestabok.php?nr=3' width='240' height='150' border='0' frameborder='0'&gt;&lt;/iframe&gt; Ef að við viljum ná í færri eða fleiri breytum við ?nr=3 í t.d. ?nr=5

function lesa_gestabok ()
Þetta er annar iframe, í þetta sinn erum við að kalla á allar færslur gestabókarinnar. Ef að við erum komin með margar færslur viljum við kannski fara að geta skipt þessu upp í fleiri síður, ég ætla ekki að gera það hérna. Ég vil bara benda ykkur á að þið getið bætt við annari breytu í get_gestabok, t.d. get_gestabok($nr, $offset). Offest mynduð þið svo nota í Select skipuninni.

Svo ætla ég að birta núna stílsniðið mitt:
====stilsnid.css======
/* GESTABÓK */
TD.gestabokStort {
font-family: Comic Sans MS;
font-size: 14px;
font-weight: bold;
text-align: center;
}

a.gestabokMinna {
font-family: Comic Sans MS;
font-size: 12px;
font-weight: none;
color: #FFFFFF;
}

TD.gestabok {
font-family: Comic Sans MS;
font-size: 12px;
font-weight: none;
}
div.gestabok_faerslur {
font-family: Comic Sans MS;
font-size: 10px;
}

div.gestabok_haus {
font-family: Comic Sans MS;
font-size: 16px;
}
===loka stilsnid.css===

Núna þegar við erum búin að skoða functions.gestabok.php, þá sjáum við kannski betur hvað er að gerast í index.php, kíkjum á bút úr henni aftur:
&lt;?
if ($action == ”add“ || !$action) { add_gestabok(); }
if ($action == ”new“) { New_Gestabok($g_dags, $g_nafn, $g_netfang, $g_veffang, $g_efni, $g_texti); lesa_gestabok(); }
if ($action == ”lesa“) { lesa_gestabok(); }
?&gt;

Efsta if setningin athugar hvort að við erum að sækja index.php án færibreytu, eða með færibreytunni add, ef að sú er raunin þá köllum við á add_gestabok functionið, sem að skrifar út síðu með innsláttarformi og IFRAME með 3 nýjustu færslunum. Þegar að einhver ýtir á senda takkann, þá fær index.php send öll gögnin úr innsláttarforminu.

Næsta if setning athugar hvort að það fær $action == ”new", það fáum við úr innsláttarforminu, því þar erum við með &lt;input type=hidden name=action value=new&gt;. Þetta þýðir að einhver hefur verið að skrifa í gestabókina okkar, fyrst köllum við því á New_Gestabok sem að dælir breytunum inn í MySQL, svo köllum við á að lesa_gestabok, þannig að um leið og einhver ýtir á Senda, þá fara gögnin hans inn í gagnagrunninn, og hann getur skoðað gestabókina alla, og sér það sem hann skrifaði efst í henni.

Síðasta if setningin athugar hvort að við ætlum bara að lesa gestabókina, en ekki pósta í hana. Þetta gerum við með því að hafa tengilinn &lt;a href='?action=lesa' class='gestabokMinna'&gt;Skoða alla gestabókina&lt;/a&gt; (þessi lína er í add_gestabok() functioninu). Hann opnar því index.php með kallbreytunni action sem hefur innihaldið lesa.

Ef að þið viljið breyta því hvernig færslurnar birtast í gestabókinni, þá breytið þið því í lesa_gestabok().

Þá er fyrri hluti búinn, endilega póstið athugasemdir og spurningar. Ég vil taka það fram að þó að ég sé að nota einhvers konar hlutbundnar aðferðir við þetta, að þá er þetta ekki akkúrat réttasta aðferðin, þetta er bara sú aðferð sem mér finnst þægilegust. Ég hefði getað búið til klasann gestabok, og haft functionirnar í honum, en það er orðið soldið advanced. Ef þú kannt að fikta í klösum þarftu ekki að lesa þessa grein :), þessar aðferðir mínar ættu hins vegar að leyfa óvönum PHP-urum að fikra sig hægt og rólega í áttina að flóknari hlutum.

Og munið svo að stela ekki gestabókinni á http://sigurros.betra.is/gestabok í heilu lagi, það er dónalegt (og betri helmingurinn yrði fúll), og allir ættu að hanna sína hluti sjálfir :)
Summum ius summa inuria