(Til þess að geta nýtt sér þessa grein verður að vera búið að lesa fyrri greinina, <a href="http://www.hugi.is/vefsidugerd/bigboxes.php?box_id=29774&action=cp_grein&cp_grein_id=304“>PHP/MySQL : Gestabókin (1/2)</a>.)

Þá er fólk búið að vera að skrifa í gestabókina okkar á fullu, og einhverjir hafa sýnt smá klaufsku og ýtt óvart á ”Senda“ takkann oftar en einu sinni, þannig að þeir eru margfaldir í gestabókinni okkar.

Við gætum lagað þetta með því að fara í mysql-console og eyða röðum út þar, við hins vegar ætlum að hafa þetta aðeins notendavænna fyrir okkur og búa til smá vefviðmót á gestabókina okkar, sem leyfir okkur að eyða út færslum hvar svo sem við erum stödd, því að ekki er alltaf hægt að komast inn í mysql-console alls staðar frá.

Núna er það sumsé ADMIN hlutinn (umsjónarkerfið) sem að við tökum fyrir, byrjum á MySQL töflunni fyrir Admin svæðið:

CREATE TABLE admin_t (
admin_id int(4) NOT NULL auto_increment,
username varchar(30) NOT NULL,
password varchar(30) NOT NULL,
user_level tinyint(4) DEFAULT ‘0’ NOT NULL,
UNIQUE admin_id (admin_id, username)
);

Og ég ætla að setja inn einn admin, sem erum við:

INSERT INTO admin_t VALUES ( ‘1’, ‘notandi’, ‘lykilord’, ‘1’);

Eins og þið sjáið er passwordið geymt sem venjulegir stafir bara, það þarf ekki flóknari hlut hjá okkur þar sem við erum ekki að reka verslun (eins og er að minnsta kosti :p ).

Admin svæðið okkar er nefnilega byggt með það í huga frá upphafi að við séum ekki bara með gestabók, heldur að við getum bætt við fleiri fítusum seinna. Þar sem að það gæti krafist þess að það væru 2 eða fleiri umsjónarmenn ætlum við að láta umsjónarmennina vera með user_level, þar inn í skilgreinum við hve mikinn aðgang umsjónaraðilinn hefur, í þessu tilfelli ætla ég að hafa user_level=1 sem mesta aðgang, user_level 4 gæti þá t.d. breytt bara tenglum í tenglahluta og svo frv. Þetta getum við geymt þar til seinna að spöglera í.

====/admin/index.php=====
&lt;?
include ”includes/includes.php“;
$pagetitle = ”Admin“;
include ”includes/haus.php“;
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
?&gt;
&lt;br&gt;
&lt;center&gt;
&lt;b&gt;Þetta er admin svæðið mitt&lt;/b&gt;
&lt;/center&gt;
&lt;?
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
include ”includes/fotur.php“;
?&gt;
====loka /admin/index.php====

Ekki mikið hérna, bara 3 include og smá texti á síðunni okkar.

====/admin/gestabok.php====
&lt;?
include ”includes/includes.php“;
$pagetitle = ”Gestabók“;
include ”includes/haus.php“;
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
?&gt;

&lt;?
if ($user_level &lt; ”5“)
{
if ($action == ”“ || $action == ”show“) { get_gestabok(); }

if ($action == ”warn“) { warn_gestabok($gestabok_id); }
if ($action == ”delete“) { Delete_Gestabok($gestabok_id); get_gestabok(); }
} else {
echo ”&lt;center&gt;Þú hefur ekki leyfi til að skoða þennan hluta&lt;/center&gt;“;
}
?&gt;
&lt;?
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
include ”includes/fotur.php“;
?&gt;
====loka /admin/gestabok.php====

Hérna sjáum við að við erum að nota $user_level til að athuga hvort að viðkomandi hafi næg réttindi (verður að vera undir 5). Eins og alltaf þá er þetta bara hvernig þið viljið gera þettta, en að nota þennan kóða mun virka (notandinn okkar er með user_level=1 í þessu öllu).
Úr hluta 1 könnumst við núna aðeins við það hvað er að gerast hérna, við erum að kalla á föll í þessari síðu, og hvaða fall, fer eftir því hvernig við náðum í síðuna. Skoðum það betur á eftir.

====/admin/includes/includes.php====
&lt;?
include ”includes/verify.php“;
include ”../includes/connect.php“;
include ”includes/functions.php“;
?&gt;
====loka /admin/includes/includes.php====

Þið munið að við vorum með 3 include setningar í hluta 1, hérna er ég búinn að draga saman þessar include setningar í eina skrá, og includa hana svo, þessa aðferð mætti þess vegna nota í hluta 1, ef þið treystið ykkur í það núna. connect.php þarna er connect.php sem að við skoðuðum í síðasta hluta, ein connect skrá þannig að breyta þarf bara á einum stað.

====/admin/includes/verify.php=====
&lt;?
////////////////////////// USED FOR AUTHENTICATION ////////////////////////
function authenticate_user(){
Header(”WWW-Authenticate: Basic realm=\“Vefsvaedid.mitt\”“);
Header(”HTTP/1.0 401 Unauthorized“);
echo ”&lt;HTML&gt;&lt;BODY text=#000000 vLink=#006600 aLink=#cc3300 link=#0033ff bgColor=#FFFFFF leftMargin='0' topMargin='1' marginheight='1' marginwidth='0'&gt;\n
&lt;center&gt;&lt;br&gt;&lt;br&gt;\n
&lt;font face='Verdana' size=4&gt;&lt;b&gt;Notendanafn og/eða lykilorð er &lt;font color='#CC3300'&gt;vitlaust&lt;/font&gt;&lt;/b&gt;&lt;/font&gt;&lt;br&gt;\n
&lt;font face='Verdana' size=2&gt;Hafðu samband við &lt;a href='mailto:netfangid@mitt.is'&gt;netfangid@mitt.is&lt;/a&gt;&lt;/font&gt;\n
&lt;/center&gt;&lt;/body&gt;&lt;/HTML&gt;
“;
exit;
}

if(!isset($PHP_AUTH_USER)) {
authenticate_user();
} else {
include ”../includes/connect.php“;
$sql = ”SELECT * FROM admin_t WHERE username='$PHP_AUTH_USER' && password='$PHP_AUTH_PW'“;
$r = mysql_query($sql);
if(@mysql_num_rows($r) &lt; 1){
authenticate_user();
}
}
////////////////////////// USED FOR AUTHENTICATION ////////////////////////
?&gt;
====loka /admin/includes/verify====

Til þess að hver sem er geti ekki fiktað í umsjónartólinu okkar látum við þessa skrá koma fram í öllum /admin síðunum okkar (í gegnum include.php). Það sem þetta gerir er að spyrja MySQL hvort að sá sem að var að logga sig inn (þið fáið upp svona skjá sem vill fá notandanafn og lykilorð), hafi gefið upp rétt notandanafn og lykilorð. Hérna myndum við því setja inn það sem kom fram uppi
notandanafn: notandi
lykilord: lykilord

Þessi skrá sumsé tengist gagnagrunni, athugar hvort að login var rétt, ef rétt þá birtist síðan bara eins og venjulega, ef þetta var vitlaust þá fáum við upp villuskilaboð. Aðeins þarf að logga sig inn einu sinni í hvert sinn, eftir það man vafrinn nafn og lykilorð þangað til að slökkt er á honum. Hérna hefðum við getað notað .htaccess skrár (á Apache) til þess að læsa síðunum, en ekki allir vefþjónar leyfa okkur það. Því notum við þessa aðferð hjá okkur þar sem að hún ætti að virka óháð þeim sem hýsir vefinn okkar.

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

include ”includes/functions.gestabok.php“;
?&gt;
====loka /admin/includes/functions.php====

Hérna sjáum við að /admin/includes/functions.php er í rauninni eins og /includes/functions.php, hefði þess vegna getað sleppt þessu og includað bara beint þeirri skrá, eina sem er aukalega hérna er að við includum líka /admin/includes/functions.gestabok.php.

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

function Delete_Gestabok ($gestabok_id)
{
$query = ”DELETE FROM gestabok_t WHERE gestabok_id='$gestabok_id' LIMIT 1“;
$result = mysql_db_query(”gestabok“, $query);
if(!$result){
return mysql_error();
} else {
return 1;
}
echo $query;
}

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

function warn_gestabok ($gestabok_id)
{
$query = ”SELECT * FROM gestabok_t WHERE gestabok_id='$gestabok_id'“;
$result = mysql_db_query(”gestabok“, $query);
if ($row = mysql_fetch_array($result)) {
$gestabok_id = mysql_result($result,0,”gestabok_id“);
$g_dags = mysql_result($result,0,”g_dags“);
$g_nafn = mysql_result($result,0,”g_nafn“);
$g_netfang = mysql_result($result,0,”g_netfang“);
$g_veffang = mysql_result($result,0,”g_veffang“);
$g_efni = mysql_result($result,0,”g_efni“);
$g_texti = mysql_result($result,0,”g_texti“);
} else {
echo ”Villa við að ná í upplýsingar :(“;
}

echo ”&lt;center&gt;&lt;table border='0' cellpadding='2' cellspacing='1' width='500'&gt;“;
echo ”&lt;tr&gt;&lt;td colspan='2' align='center' class='adminbar'&gt;Eyða úr gestabók&lt;/td&gt;&lt;/tr&gt;“;
echo ”&lt;tr&gt;&lt;td colspan='2' align='center' class='adminwarn'&gt;Viltu alveg örugglega eyða þessu úr gestabókinni?&lt;/td&gt;&lt;/tr&gt;“;
echo ”&lt;tr&gt;&lt;td colspan='2' align='center' class='text'&gt;&lt;b&gt;
&lt;a href='gestabok.php?action=delete&gestabok_id=$gestabok_id'&gt;JÁ&lt;/a&gt; &nbsp; &nbsp;
&lt;a href='gestabok.php?action=show'&gt;NEI&lt;/a&gt;
&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;“;
echo ”&lt;form name='dellink' action='gestabok.php?action=change' method='post'&gt;“;
echo ”&lt;INPUT TYPE='hidden' NAME='gestabok_id' value='$gestabok_id'&gt;“;
echo ”&lt;INPUT TYPE='hidden' NAME='action' value='delete'&gt;“;
echo ”
&lt;tr&gt;&lt;td class='formtext' bgcolor='#999999'&gt;Nafn&lt;/td&gt;
&lt;td class='text' bgcolor='#999999'&gt;$g_nafn&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td class='formtext' bgcolor='#999999'&gt;Titill&lt;/td&gt;
&lt;td class='text' bgcolor='#999999'&gt;$g_efni&lt;/td&gt;&lt;/tr&gt;

&lt;tr&gt;&lt;td class='text' colspan='2' bgcolor='#999999'&gt;$g_texti&lt;/td&gt;&lt;/tr&gt;
“;

echo ”&lt;/form&gt;&lt;/table&gt;&lt;/center&gt;“;

mysql_free_result($result);
}

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

function get_gestabok ()
{
$query = ”SELECT * FROM gestabok_t ORDER BY g_dags DESC, gestabok_id DESC“;
$result = mysql_db_query(”gestabok“, $query);
if ($row = mysql_fetch_array($result)) {
echo ”&lt;center&gt;&lt;table border='0' cellpadding='2' cellspacing='1' width='600'&gt;“;
echo ”&lt;tr&gt;&lt;td colspan='4' align='middle' class='adminbar'&gt;Gestabók&lt;/td&gt;&lt;/tr&gt;“;
do {
echo ”&lt;tr&gt;&lt;td class='text' width='80'&gt;";
$dags = $row["g_dags"];
$dags = new_date($dags);
echo “$dags&lt;/td&gt;”;
echo “&lt;td class='text'&gt;”;
echo “&lt;a href='mailto:”;
print $row["g_netfang"];
echo “'&gt;”;
print $row["g_nafn"];
echo “&lt;/a&gt;”;
echo “&lt;/td&gt;”;
echo “&lt;td class='text'&gt;”;
print $row["g_efni"];
echo “&lt;/td&gt;”;
echo “&lt;td class='adminwarn' width='50'&gt;&lt;a href='/admin/gestabok.php?action=warn&gestabok_id=”;
print $row["gestabok_id"];
echo “'&gt;Eyða&lt;/a&gt;&lt;/td&gt;”;
echo “&lt;/tr&gt;\n”;
} while($row = mysql_fetch_array($result));
echo “&lt;/table&gt;&lt;/center&gt;”;
}
mysql_free_result($result);
}

/*#################*/
?&gt;
====loka /admin/includes/functions.gestabok.php====

Þeir sem að skoðuðu Gestabókin (1/2) sjá hérna svipaða hluti og síðast, þessar function hegða sér svipað nema hvað að í stað þess að bæta við í gestabókina erum við að eyða út úr henni. Ætla að hlaupa rétt yfir hvað hvert og eitt function gerir:

function get_gestabok ()
Hérna náum við í allar færslur gestabókarinnar, en birtum aftast tengil sem leyfir okkur að eyða viðkomandi færslu.

function warn_gestabok ($gestabok_id)
Hérna náum við í færsluna sem að var valin til eyðslu, birtum hana og spyrjum, “viltu alveg örugglega eyða þessari færslu?”. Þetta er svona varúðarráðstöfun, hentugt þegar að maður ýtir óvart á vitlausan tengil á fyrri síðunni.

function Delete_Gestabok($gestabok_id)
Hérna eyðum við út færslunni sem að við völdum og vorum búin að samþykkja að við ætluðum að eyða, með því að ýta á Já í fyrri síðunni.

====/admin/includes/haus.php====
&lt;?
$resultRights = mysql_db_query(“gestabok”,“SELECT * FROM admin_t WHERE username='$PHP_AUTH_USER' && password='$PHP_AUTH_PW'”);
$admin_id = mysql_result($resultRights,0,“admin_id”);
$user_level = mysql_result($resultRights,0,“user_level”);
?&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Gestabók Admin - &lt;? echo “$pagetitle”; ?&gt;&lt;/title&gt;
&lt;LINK REL=stylesheet HREF=“../stilsnid.css” TYPE=“text/css”&gt;
&lt;/head&gt;
&lt;body bgcolor=“#ffffff” marginwidth=“0” marginheight=“0” leftmargin=“0” topmargin=“0”&gt;

&lt;!– ################# USER ################# –&gt;
&lt;DIV ID=“user” STYLE=“position:absolute; left:10px; top:5px; width:250px; height:10px; z-index:1”&gt;
&lt;FONT FACE=“Verdana” color=“#FFFFCC” size=1&gt;Innskráð/ur sem: &lt;b&gt;&lt;? echo $PHP_AUTH_USER; ?&gt;&lt;/b&gt; &lt;/FONT&gt;&lt;/div&gt;
&lt;!– ################# /USER ################ –&gt;

&lt;!– ################# HAUS ################# –&gt;
&lt;table width=“100%” border=“0” bgcolor=“#990000” cellpadding=“5” cellspacing=“0”&gt;
&lt;tr&gt;
&lt;td valign=top bgcolor=“#336633” align=middle&gt;&lt;font face=“Trebuchet MS, Verdana, Arial” size=6&gt;&lt;b&gt;Vefurinn minn&lt;/b&gt;&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top align=middle&gt;&lt;font face=“Verdana” size=“1” color=“#FFFFFF”&gt;&lt;a href=“/admin/index.php” class=“top”&gt;ADMIN&lt;/a&gt; | &lt;a href=“/admin/gestabok.php” class=“top”&gt;Gestabók&lt;/a&gt;&lt;/font&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;center&gt;
&lt;table border=0 width=“500”&gt;&lt;tr&gt;&lt;td class=text&gt;
&lt;!– ################# /HAUS ################# –&gt;
====loka /admin/includes/haus.php====

====/admin/includes/fotur.php====
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/center&gt;

&lt;/body&gt;
&lt;/html&gt;
====loka /admin/includes/fotur.php====

Þessar tvær include skrár eru svo bara hausinn og fóturinn á Admin síðunum okkar, getum bætt tenglum við í hausnum t.d. þegar að við bætum við fleiri hlutum eins og fréttum (búa nýjar til, breyta), dagbók og fleira.

Núna ætti gestabókin að virka, sem og umsjónarkerfið okkar. Fyrir þá sem að horfa á þetta virka allt hjá sér en vita ekki af hverju það virkar, þá er málið fyrir þá að fikta sig aðeins áfram og lesa <a href="http://www.php.net/">PHP.net</a> þar sem að þeir geta fengið útskýringar á öllum þeim PHP skipunum sem við höfum notað, t.d. HEADER(), mysql_fetch_array() og öðrum viðlíka.

Ef þið hafið einhverjar spurningar, þá er málið bara að spyrja, ég mun reyna að útskýra eins og ég get þau atriði sem eru að vefjast fyrir ykkur. Er PHP ekki annars æði!
Summum ius summa inuria