Flokkar: Allir, Almennt, Kvikmyndir, PHP, Nörd, Tón- og leiklist

Deila á Facebook
Gestabók í PHP og MySQL
Skrifað af Arnór Heiðar þann 28. nóvember 2005 - 18:30
athugasemdir skrifaðar - toppur / botn
Fjöldi lestra: 4828
Lítil gestabók í PHP og MySQL.

Kynning og forsendur

Í þessum tutorial lærið þið undirstöðu atriði í php/mysql og í leiðinni búið þið til ykkar eigin gestabók. Þið lærið að meðhöndla form-gögn, mismunandi aðferðir við að nota include fæla, einnig lærið þið smá í sql. Ég geng út frá því að lesendur kunni HTML (ekki nóg að kunna á frontpage) og geti búið til sína eigin síðu frá byrjun. Ég er ekki að kenna hvernig á að forrita í ákveðnu umhverfi, td. Dreamweaver MX eða einhverju álíka, heldur er ég að kenna almenn grunn-atriði í php.

Ég geri ráð fyrir því að lesendur hafi nú þegar lesið MySQL tutorialinn minn og skilji þar með grunnatriði í gagnagrunnum, sérstaklega MySQL. Einnig verðið þið lesendur að hafa lesið Byrjenda PHP tutorialinn hans Gaua, og PHP verður að virka hjá ykkur. Þið þurfið semsagt að vera með MySQL gagnagrunn og viðeigandi notendanafn og lykilorð fyrir þann grunn.

Undirbúningsvinna

Ávalt, áður en maður byrjar á nýrri síðu eða scripti, þarf maður að gera smá undirbúings vinnu. Setja niður á blað hvað maður ætlar að gera, hvernig, hvernig þetta á að virka fyrir notandann og hugsanleg vandamál. Í þessum tutorial ætlum við að búa til gestabók, og nú skulum við undirbúa okkur dálítið.

Gagnagrunnurinn

Fyrst af öllu er að skipuleggja gagnagrunninn. Þetta er ekki flókinn gagnagrunnur og við þurfum einungis eina töflu. Það sem gestabókin á að geyma er auðvitað skilaboð sem notandi sendir inn, svo auðvitað e-mail hjá honum og nafn. En til að vita í hvaða röð færslurnar koma, þe. síðustu færslurnar ættu að koma síðast, þá þurfum við að hafa dagsetningu og tímasetningu á þeim líka.

Við þurfum líka eitthvað til að einkenna hverja færslu, þe. finna 'primary key'. Primary key þarf að vera auðkennandi fyrir hverja færslu. Sem dæmi væri email, dagsetning, tími Mjög góður primary key. En yfirleitt er þægilegra að vinna bara með eina tölu sem einkennir færslu og er það oftast notað á heimasíðum, svo auðveldara sé að vinna með gögnin. Það er líka auðveldara, fyrir byrjendur, að vinna með eins-dálka primary key. Þessvegna skulum við bæta við einum dálk í viðbót sem við höfum sem raðnúmer færslu í gagnagrunninum.

gestabok MySQL taflan:

CREATE TABLE gestabok (
  numer INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  email VARCHAR(150),
  nafn varchar(48),
  skilabod TEXT,
  dagsetning DATE,
  timasetning TIME,
  PRIMARY KEY (numer)
);

Ef það er eitthvað sem þið eruð óörugg með við þennan kóða, eftir að hafa lesið MySQL greinina mína, þá ætti það að vera í skilgreiningunni á 'numer'. Þarna er textinn 'AUTO_INCREMENT'. Hann þýðir, að ef ekkert gildi er gefið fyrir númer, eða þá að hann fær 'NULL', þá setur hann inn sjálfkrafa tölu, sem fer hækkandi frá núll, eftir því hvað það eru margar færslur í töflunni.

Hitt sem þið gætuð verið óörugg með eru dagsetning og timasetning reitirnir. Þeir eru skilgreindir sem 'DATE' og 'TIME' tegundir. Þetta eru spes gagnategundir í mysql sem eru sérstaklega notaðar til að geyma tímasetningu. Sem betur fer, þegar við erum að skoða þessar breytur, þá virka þær eins og venjulegur textastrengur, sem þarf að fylgja mjög ströngum reglum um hvernig hann skuli vera.

Þennan sql kóða þurfum við síðan að keyra með því viðmóti sem við notum, sama hvort það er í gegnum console eða eitthvert gagnagrunnumsjónarkerfi eins og phpMyAdmin. Eftir það ætti gagnagrunnurinn okkar að vera tilbúinn.

Uppbygging/Virkni

Nú þurfum við að ákveða hvernig virkni síðunnar á að vera eða, með öðrum orðum, hvernig hún er uppbyggð.

Við skulum vinna þetta útfrá því að nota skjalanöfn. Við útbúum fimm skjöl:

"gestabok.php" - hér fer kóði gestabókarinnar sem við gerum
"head.php" - þetta er efri hlutinn á skjalinu
"foot.php" - og svo botninn
"connection.php" - gagnagrunnstengingin
"submit.php" - kóðinn til að setja inn í gestabókina

Skilgreinum þrjár þessara skráa:

head.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Gestabókin mín</title>
</head>
<body>
<h3>Þetta er gestabókin mín</h3>

foot.php
</body>
</html>

connection.php
<?php

/* til að tengjast mysql gagnagrunns-host notum við mysql_connect() fallið.
það tekur við breytum um hvaða host við viljum tengjast (yfirleitt localhost)
og notendanafni og lykilorði (breytið þessu í eigið): */
mysql_connect('localhost','username','password');

mysql_select_db('nafn_a_gagnagrunni');

?>


Þá eru allar skrár tilbúnar nema gestabok.php, hún á eftir að breytast. Við setjum hana bara þarna svo við sjáum hvernig þetta virkar. Héðan í frá mun ég einungis tala um gestabok.php og þið munið einungis þurfa að breyta henni.

Ok. Nú skulum við fara að gera eitthvað af viti. Við vorum búin að búa til töfluna, en engin gögn eru komin í hana, svo það stoðar lítið að birta upplýsingar úr henni, svo við skulum einbeita okkur strax að erfiðri partinum, að bæta inn í gestabókina.

Að setja gögn í töflu

Til að hægt sé að senda eitthvað á annað borð yfir í script, sama hvort það er texti, númer, fæll eða hvað sem er, þá þurfum við að útbúa form (ísl: eyðublað :D). Form eru notuð í þessum eina tilgangi. Svona textabox þar sem þið skrifið inn texta, td. á hugi.is eða bara á þessari síðu, og takkar ofl, eru allt bara hlutir á formi.

Nú ætlum við til dæmis að senda inn upplýsingar í gestabókina, þá þurfa að vera reitir á síðunni fyrir texta og nafn og e-mail sendanda. Þið gætuð hugsað með ykkur að nú sé ég að gleyma dagsetningunni og tímanum, en við skulum bara láta gagnagrunninn sjá um það fyrir okkur, eins og þið sjáið seinna. En nú skulum við byrja á að sjá hvernig gestabok.php lítur út með forminu inní því. Til að auðvelda okkur vinnu, þá skrifum við formið bara í html, með því að láta php hætta að parsa áður en formið kemur:

gestabok.php
<?php
include('head.php');
?>
    <h3>Skrifaðu endilega í hana</h3><br/><br/>

    <form action="gestabok.php" method="post">
    Nafn:<br/>
    <input type="text" name="nafn"/><br/><br/>
    E-Mail:<br/>
    <input type="text" name="email"/><br/><br/>
    Skilaboð:<br/>
    <textarea name="skilabod" cols="50" rows="4"></textarea><br/><br/>
    <input type="submit" name="insert" value="OK, látum það flakka"/>
    </form>
<?php
include('foot.php');
?>


Þarna höfum við útbúið form til að senda inn allar þær upplýsingar sem við þurfum frá notandanum með POST aðferðinni.

Ofur-breytur

Þegar við tökum við upplýsingum úr formi, þá koma gögnin til okkar gegnum forskilgreindar fylkis-breytur sem er talað um sem "super globals" - við skulum kalla þær á íslensku: "ofur-breytur". Þær breytur sem PHP skilgreinir sem ofur-breytur eru: $_SERVER, $_GET, $_POST, $_REQUEST, $_FILES, $_COOKIE, $_SESSION, $_ENV og (hrollur) $GLOBALS.

Ég ætla ekki að fara út í það hvað er geymt í öllum þessum breytum (þið getið flett því upp í php manualnum), en ég ætla að minnast aðeins á $_GET og $_POST. Í $_GET eru skilgreindar allar þær breytur sem koma í gegnum get-fyrirspurn á vefþjóninn, þe. það sem er skilgreint í url-inu sem síðan er sótt með. Þannig að ef við skrifum: prufa.is/foo.php?bar=222, þá kemur breytan bar í $_GET fylkið sem $_GET['bar'] og þannig getið þið nálgast breytuna. $_POST virkar allveg nákvæmlega eins nema að breytan er ekki sett í url-ið, heldur er hún *hálfpartinn* falin.

Í forminu sem við skilgreindum fyrir ofan eru breyturnar inní $_POST array-inu. Nafnið á breytunum fer eftir "name" property-inu í <input> og <textarea> tögunum. Jæja...

Athugasemd um öryggi:

Ávalt, þegar við tökum við upplýsingum frá notendum, þurfum við að passa okkur á að gefa ekki óprúttnum notendum möguleika á setja inn gögn sem innihalda óæskilegan kóða. Þetta á sérstaklega við um þá sql strengi sem við útbúum. Við getum engan veginn stjórnað því sem fer fram á notanda-hliðinni, einungis því sem fer fram á vefþjóninum, því það er auðvelt að falsa form. Orðið Validation er almennt notað yfir það að tryggja að það sem notandinn sendir inn, sé "í lagi".

Að "validate"-a upplýsingarnar

Við skulum útbúa fall sem við köllum gbValidate() sem sér um allt validation fyrir okkur og setja það efst í submit.php.

<?php

require_once 'connection.php';

function
gbValidate()
{
    if ( !isset(
$_POST['nafn']) || !isset($_POST['email']) || !isset($_POST['skilabod']) ) {
        die (
'not set');
    }

    if (!
preg_match('/.*@.*..*/', $_POST['email']) || preg_match('/(<|>)/', $_POST['email']) ) {
        die (
'e-mail');
    }

   
$_POST['nafn'] = strip_tags($_POST['nafn']);
   
$_POST['skilabod'] = strip_tags($_POST['skilabod']);

   
$_POST['nafn'] = addslashes($_POST['nafn']);
   
$_POST['skilabod'] = addslashes($_POST['skilabod']);

    if ( (
strlen($_POST['nafn']) > 48) || (strlen($_POST['email']) > 150) ) {
        die(
'of langt');
    }

    return
true;

}
?>


Nú skulum við yfirfara aðeins:
1. isset() er fall sem athugar hvort búið sé að skilgreina breytu. Ef formi var póstað (fölsku semsagt) sem ekki innhélt einhverjar af nauðsynlegum upplýsingum, þá er eitthvað mjög skrítið í gangi.
2. Við þurfum ekki að hafa áhyggjur af þessu, of langt umræðuefni fyrir þessa grein. Við þurfum bara að vita að hún athugar bara hvort rétt uppbygging sé á e-mail-inu og athugar í leiðinni hvort það innihaldi nokkur html tög
3. strip_tags() tekur út öll html tög í texta. Tekur líka við öðrum parameter sem er þau tög sem við viljum leyfa (við viljum ekki leyfa neitt html)
4. Ef við reynum að setja texta, sem inniheldur gæsalappir, í streng í sql setningu (þar sem strengurinn í setningunni afmarkast af gæsalöppum), þá fer sql-ið alveg í klessu. Það viljum við auðvitað ekki.
5. Við skilgreindum gagnagrunninn þannig að 'nafn' má ekki vera meira en 48 stafir og e-mail mátti ekki vera meira en 150, svo við þurfum að passa þetta, annars klippist á strenginn.

Þá er bara að útbúa kóðan sem setur upplýsingarnar inn í gagnagrunninn (þetta fer líka í submit.php):

<?php

if (isset($_POST['insert'])) {

    if (
gbValidate()) {

       
$sql = 'INSERT INTO gestabok '.
               
'(nafn,email,skilabod,dagsetning,timasetning) '.
               
'values '.
               
'("'. $_POST['nafn'] .'",'.
               
'"'. $_POST['email'] .'",'.
               
'"'. $_POST['skilabod'] .'",'.
               
'NOW(),NOW())';

       
/* þeagr við ætlum að keyra einhvern sql kóða notum við mysql_query().
        Það fall skilar false/true ef við erum að gera insert/update/delete
        skipun */
       
if (mysql_query($sql)) {
           
header('Location: gestabok.php');
        } else {
            die (
'Gekk ekki upp, mysql-error: '. mysql_error());
        }

    } else {
        die (
'Ekki voru allar upplýsingar í lagi. Athugaðu, hvort
              e-mail-ið sé í lagi, nafnið/e-mail-ið sé of langt,
              osfrv.'
);
    }
} else {
    die (
'Engu var submit-að');
}
?>


Að birta gestabókina

Loksins, nú getum við séð hvað notendur setja inn. Nú þurfum við að nota mysql_query() aftur, en núna erum við að sækja gögn með 'select' skipun, þannig að við fáum ekki bara true/false út um hvort það hafi tekist, heldur fáum við til baka svokallað result resource. Til að sækja svo gögnin úr því resource-i, notum við aðrar skipanir en gefum upp þetta resource sem mysql_query() gefur okkur.

Fallið sem við notum til að lesa úr resource-inu heitir mysql_fetch_array() og skilar það 'associative-array' með einni línu (row) af þeim upplýsingum sem við báðum um (skilar líka númeruðu array, en ekkert spá í því).

Vindum okkur þá í kóðann. Þetta er allur gestabok.php kóðinn (save-ið þetta bara sem gestabok.php):

gestabok.php
<?php
include 'head.php';
require_once
'connection.php';

$res = mysql_query('SELECT * FROM gestabok ORDER BY dagsetning, timasetning');

if (!
$res) echo 'mysql error: '. mysql_error();

if (
mysql_num_rows($res) < 1) {

    echo
'Því miður, engar færslur í gagnagrunni';

} else {

    while (
$row = mysql_fetch_array($res)) {
        echo
'<b>Nafn:</b> '. $row['nafn'] .'<br />';
        echo
'<a href="mailto:'. $row['email'] .'">'. $row['email'] .'</a><br />';
        echo
$row['skilabod'] .'<br /><br />';
    }

}
?>

    <h3>Skrifaðu endilega í hana</h3><br/><br/>

    <form action="submit.php" method="post">
    Nafn:<br/>
    <input type="text" name="nafn"/><br/><br/>
    E-Mail:<br/>
    <input type="text" name="email"/><br/><br/>
    Skilaboð:<br/>
    <textarea name="skilabod" cols="50" rows="4"></textarea><br/><br/>
    <input type="submit" name="insert" value="OK, látum það flakka"/>
    </form>

<?php
include 'foot.php';
?>


Lokaorð

Þá ætti þetta að vera komið. Þessi skínandi fína, nýja og glæsilega gestabók. Ég vona að þessi tutoriall hafi gagnast mörgum, en auðvitað er ég ekkert fullkominn og veit ekki hvernig þið hugsið, þannig að ef þið lendið i vandræðum, viljið commenta á eitthvað eða e-ð, endilega látið mig vita, hér á síðunni eða í tölvupósti.

Good luck!




Athugasemdir ():