Teen php+MySql mössöllä pienen uutisskriptin/blogin.
Mietin vaan, että mikä olisi paras/helpoin tapa listata uutisia sivuille ja tietysti admin-alueella, jotta uutisia voi muokata.
Kenttinä olisi vaan "nimi", "uutisen otsikko" ja "uutinen".
Pitänee käyttää "order by..." komentoa jotta se listaa uutiset. Haluan tietysti että uutiset listaantuu tuoreusjärjestyksessä.
Olisiko "order by pvm" ja lisään "pvm" kentän uutisten kirjoittajalle täytettäväksi ja tietokantaan.
Vai osaisiko se skripti oikeella ohjelmoinnilla pistää automaattisesti tietokannan muistiin päiväyksen koska uutinen on kirjoitettu (entä jos samana päivänä usea uutinen?) ja se osaisi automaattisesti "order by date/timestamp" tulostaa tuoreusjärjestyksessä.
Tuttava ehdotti "timestamp" -kenttää tietokantaan, mutta ei kertonut enempää. =)
Selasin muita viestiketjuja missä oli vähän samantapaisia kysymyksiä, mutta oli pakko oma laittaa, kun kyseinen asia ei vielä auennut minulle. :)
PHP:n time()-funktio palauttaa nykyisen aikaleiman (sekunteja hetkestä 1.1.1970). Itse tallentaisin tämän tuollaiseen "timestamp"-kenttään, jolloin ORDER BY timestamp järjestelisi siten että uusin on ensimmäisenä.
Tuota timestamppia voi sitten hyödyntää myös kun tulostat varsinaisen päivämäärän, katso date().
Heikki: MySQL:n aikaleima ("timestamp"-kenttä) on muotoa yyyy-mm-dd- hh:mm:ss
, joten sinne ei voi tallentaa ainakaan suoraan tuota unix-aikaleimaa. Tosin sekin onnistuu FROM_UNIXTIME()-funktiolla, mutta se on turhaa, jos voidaan käyttää NOW()-funktiotakin. Tosin voi olla että ymmärsin väärinkin ja tarkoitit "timestamp"-kentällä vain sarakkeen nimeä, etkä siis tyyppiä.
Eli itse laittaisin sinne kyllä tuon timestamp-tyyppisen kentän (tai vaihtoehtoisesti datetime), johon uutisen lisäyksen yhteydessä kirjoitat arvoksi NOW().
Jos laitat tauluun kaksi timestamp-kenttää, niin ensimmäinen niistä päivittyy automaattisesti muokkausen/lisäyksen yhteydessä:
CREATE TABLE IF NOT EXISTS uutiset( `id` int( 6 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , `nimi` varchar( 255 ) default NULL , `otsikko` varchar( 255 ) default NULL , `uutinen` text NOT NULL , `muokattu` timestamp( 14 ) NOT NULL , `lisatty` timestamp( 14 ) NOT NULL )
`lisatty`-kenttään täytyy kuitenkin kirjoittaa tuo päivämäärä lisäyksen yhteydessä.
Ja sitten hakeminen lisäämisjärjestykessä:
SELECT otsikko, uutinen FROM uutiset ORDER BY lisatty
Kiitos Heikki ja ajv. Jos yrittäisin ajv:n neuvoilla eteenpäin. Sori, mutta osa oli vähän hepreaa minulle.
Vaikka uutista muokkaa niin se kellonaika saisi olla aivan sama. Muokkausta tarvitsee ainoastaan, jos typoja pitää julkaisun jälkeen heti korjata. Eli tarvitsen vain yhden timestamp kentän?
Eli tuo ID:kin on pakko laittaa, jotta jokainen uutinen saa oman "arvonsa" ja listaus osaa ne järjestyksessä tulostaa. Entä jos menee tietokannasta joskus poistamaan kokonaan jonkun uutisen niin se ID jää kuitenkin voimaan (?) ja sivuille se tulostaisi pelkkää tyhjää sen uutisen kohdalle joka on poistettu suoraan tietokannasta. Nojoo, tätä ongelmaa voi myöhemmin pohtia, jos se edes ongelma.
Mutta nyt jäi se epäselväksi, siis käyttäjän ei tarvitse itse uutista kirjoittaesssa kirjoittaa päivämäärää mihinkään vaan tietokannassa oleva "timestamp" kenttä tekee sen automaattisesti!?
Mutta pitäähän se "timestamp" koodata jotenkin php-koodin sekaan kun admin painaa "tallenna uutinen" vai oliko nyt kyse tuosta "now" funktiosta...
>`lisatty`-kenttään täytyy kuitenkin kirjoittaa tuo päivämäärä lisäyksen yhteydessä.
Eli tuossa tapauksessa käyttäjän pitää lomakkeeseen merkata itse aina päiväys koska uutinen kirjoitettu?
Oli miten oli niin haluaisin, että päiväys (ja aika) tulostuu näin:
"15.31 10.02.2006"
Joo, käyttäjän ei tarvitse uutista kirjottaessaan kertoa päivämäärää. Lisäys ylläolevaan tauluun menisi kutakuinkin näin:
INSERT INTO uutiset ( nimi, otsikko, uutinen, lisatty ) VALUES ( 'kalle', 'Tänään paistaa aurinko...', '...ja tähän itse uutinen', NOW() )
Ja siis et varmaankaan tarvitse kahta timestamp-kenttää sinne. Id toimii tuossa esimerkin mukaisessa taulussa avaimena, eli se on uniikki juokseva numero josta ei tarvitse välittää. Sen avulla voit kohdistaa haun/poiston/päivityksen varmasti siihen yhteen riviin:
DELETE FROM uutiset WHERE id = 5
Ja tuo siis ihan konkreettisesti poistaa tuon rivin tietokannsta ja se ei sen jälkeen enää minnekkään tulostu vaikka haluaisitkin... :) Ja luonnollisesti myöskään seuraavan rivin ID-kentäksi ei tule numeroa 5 vaan se jatkaa juoksemistaan välittämättä poistosta mitään.
Niin ja vielä tuo hakeminenkin sitten samaan syssyyn :) Eli:
SELECT DATE_FORMAT(lisatty, '%d.%m.%Y %h:%i:%s') AS aika FROM uutiset
DATE_FORMAT() syntaksi:
http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#id3037985
Siis tuota "NOW()" juttua en tajua.
CREATE TABLE `Uutiset` ( `id` INT NOT NULL AUTO_INCREMENT , `nimi` VARCHAR( 255 ) , `otsikko` VARCHAR( 255 ) , `uutinen` TEXT NOT NULL , `lisatty` TIMESTAMP( 14 ) NOT NULL , PRIMARY KEY ( `id` ) );
Tuo oikein?
Tän heitin aika lonkalta, eli mikä vikana:
$sql_lauseke = "insert into Uutiset (nimi,otsikko,uutinen,lisatty) values ('$nimi','$otsikko','$uutinen'NOW()) "; if (!$kysely = mysql_query($sql_lauseke,$dbh)) { $sivunotsikko = "Uutisen tallennus onnistui! "; $teksti = "Virhe: " . mysql_error(); } else { $sivunotsikko = "Tallennus onnistui "; $teksti = "Tiedot tallennettu tietokantaan<p>"; $teksti .= "Nimi: " . $nimi . "<br>"; $teksti .= "Otsikko: " . $otsikko . "<br>"; $teksti .= "Uutinen: " . $uutinen . "<br>"; $teksti .= "Lisätty: " . $lisatty . "<br>"; }
Kooditageilla saa värityksenkin tuohon.
Sulla puuttuu tuolta ennen NOW():ta pilkku. Taulu näyttäisi olevan ok.
Heh. Ajattelin, että se on päin honkia, mutta vain pilkku puuttui.
Se vaan ei näytä/tulosta tallennuksen jälkeen tuota aika.
Tosin otan ehkä tuon
$teksti .= "Lisätty: " .$lisatty . "<br>";
pois. Niin ei tarvitse sitä murehtia.
Se nyt merkitsee tietokantaan päiväyksen yhteen putkeen: "20060208153221"
Mutta se tulostanee sen aivan oikein sitten sivustolla kun laitan:
SELECT otsikko, uutinen FROM uutiset ORDER BY lisatty; SELECT DATE_FORMAT(lisatty, '%d.%m.%Y %h:%i:%s') AS aika FROM uutiset;
Siis miten tarkalleen, en keksi kuin alun:
<?php if (!$kysely = mysql_query("SELECT otsikko, uutinen, nimi, DATE_FORMAT(lisatty, '%d.%m.%Y %h:%i:%s') AS aika FROM uutiset ORDER BY lisatty",$dbh)) ?>
ja
ajv kirjoitti:
Heikki: MySQL:n aikaleima ("timestamp"-kenttä) on muotoa
yyyy-mm-dd- hh:mm:ss
, joten sinne ei voi tallentaa ainakaan suoraan tuota unix-aikaleimaa.
Juu en ole myslin kanssa mikään guru enkä oikein sen aikaleimoista tiedä (olen kyllä kuullut tuosta myslin omasta aikaleimatyypistä). Lähinnä vastauksellani hain (epäselvästi) takaa sitä, että aikaleima tallennettaisiin ihan kokonaislukuna.
Tuo "oikea" tapa on kyllä varmaan parempi.
No ei tuo sinunkaan ehdotamasi tapa nyt "väärä" ole. Mutta käytettäessä tietokannan omia tyyppejä, voidaan käyttää myös tietokannan omia työkaluja tuon ajan käpistelyyn ja MySQL sisältää varsin monipuoliset funktiot ajan käsittelyyn. Eli siis varsinainen hyöty ei siis tule esiin näin yksinkertaisessa systeemissä.
Jaahas... Oon tässä lopputyötä kirjotellu, mutta näköjään on tänne tullu paljon enemmän tekstiä kun tohon mihin sitä tekstiä pitäs oikeesti saada... :)
Nyt se tallentaa tiedot oikein kantaan, mutta ei tulosta uutisia ollenkaan sivuille. Aina näkyy vain "Uutisten listaaminen epäonnistui". Mikäs viiva/pilkku väärin? =)
Näin tein:
<?php //Tietokantayhteyden luonti sensuroitu if (!$kysely = mysql_query("SELECT otsikko, uutinen, nimi, DATE_FORMAT(lisatty, '%d.%m.%Y %h:%i:%s') AS aika FROM uutiset ORDER BY lisatty",$dbh)) { print "<li>Uutisten listaaminen epäonnistui."; } else { while($row = mysql_fetch_assoc($kysely)) { print "<li>" . $row['otsikko']; //WHILE hakee kysely-muuttujasta rivin kerrallaan käsittelyyn } } ?>
ps. Mulla tässä on aikaa opetella näitä, joten tee rauhassa sitä päättötyötäsi myös ;)
Johtuiskohan siitä, että toi sun taulun nimi on kirjotettu isolla alkukirjaimella, mutta kyselyssä käytät pientä alkukirjainta...?
Uskomatonta etten osaa itse noita huomata, kiitos.
print "<tr><td><b>" . $row['otsikko']; print "</b><p>" . $row['uutinen']; print "<p>Kirjoitti: " . $row['nimi']; print " Aika: " . $row['aika']; print "</td></tr>";
Lisäsin vielä noin (wau, ihan itse!) niin sain ne kaikki tulostumaan juuri haluamallani tavalla. Suuri kiitos avustasi ajv! Nyt keskityn vielä koodin muokkaamiseen ja siistimiseen. Laitan sitten tänne linkit koodiini niin voinet sitten vielä katsastaa sen läpi ja neuvoa jos jotkut asiat saisi yksinkertaisemmin tehtyä.
Ja voisihan tuohon ehkä vielä kommentointi mahdollisuuden laittaa. Tai ainakin admin-alueelle pitäisi laittaa uutisten muokkaus mahdollisuus.
Muuten homma luistaa, mutta miksi uutisiin tulostuu tuo aika esim. 01:17:47 vaikka kello on 01:27:47? Eli se tulostaa kymmenen minuuttia etuaikaa.
Saako tuota kellonaikaa eurooppalaiseen muotoon 13.xx.xx jne... ?
Ja sellainen vika vielä, että se tulostaa tuoreimman uutisen alimmaiseksi. Eli uutiset tulostuu nyt väärässä järjestyksessä.
laskeva:
ORDER BY lisatty DESC
nouseva (oletus):
ORDER BY lisatty ASC
Kiitos Lebe80!
Vielä tuota kellonaikaa ihmettelen.
Entä miten voin määritellä sen, että montako uutista tulostuu yhdelle sivulle?
Antti80 kirjoitti:
Entä miten voin määritellä sen, että montako uutista tulostuu yhdelle sivulle?
Haetaan viisi ensimmäistä uutista:
SELECT otsikko, uutinen FROM uutiset ORDER BY lisatty LIMIT 5
Juu ja tuohon päivämäärän muotoiluun löytyy ratkaisu tuolta DATE_FORMAT():n syntaksista, jonne tuossa jo aikaisemmin heitin linkin.
Mitäs mitäs... Tuo ankkuri edellisestä linkistä ei enää toimi. Aivan 110% varmasti toimi vielä eilen tuolla #id3037985. No tässä uusi osoite:
http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#id2949444
>SELECT otsikko, uutinen FROM uutiset ORDER BY lisatty
LIMIT 5
Kiitos. Minne se sitten tunkee loput uutiset? =)
Tai ajattelin tehdä linkin "vanhemmat uutiset", jota klikkaamalla aukeaa popup-ikkuna. Pääsivulle voin siis laittaa tuon "limit 5", mutta miten saan loput uutiset tulostumaan "vanhemmat uutiset" -sivulle?
Kiitos ajv. Tutkin antamaasi linkkiä...
laitat sinne vaan
SELECT otsikko, uutinen FROM uutiset ORDER BY lisatty
ja tulostat sit samanlailla kun etusivulla. jos siis en kysymystä ihan väärin ymmärtäny. ja jos halut vaan vanhemmat uutiset nii alotat sen silmukan riviltä 5.
Ok. Eli siis silmukka pitäisi alkaa kuutosesta (jos etusivulla on uutiset 1-5) "vanhemmat uutiset" -sivulla. Mutta millä "käskyllä" se aloittaa tulostamaan vasta kuudennella uutisella?
sane nyt selitti hieman potaskaa... :) Tietokantaa käytettäessä se ne halutut rivit rajataan jo siellä tietokannan puolella. Eli siis sieltä tietokannasta haetaan ne rivit 6 -> jolloin PHP:ssä ei tarvitse huolehtia mistään muusta, kuin että se kyselyllä saatu tieto tulostetaan.
Eli kysely muotoon
SELECT otsikko, uutinen FROM uutiset ORDER BY lisatty LIMIT 6, 50
Eli LIMIT aloitusrivi, kuinka monta riviä haetaan
Yllä oleva kysely hakee kannasta rivit 6-55.
Ja tulostus ihan samalaisella loopilla, kuin tuolla aikaisemminkin.
Ai niin ja ne kooditagit löytyy ohjeista.
Kiitos. Hyvin etenee. :)
"mysql_fetch_assoc". Mitä tuo assoc suomeksi tarkoittaa? Miksi ehdotit sen nimen omaa sen käyttöä? *yritän oppia*
Sain ajankin oikealla tavalla tulostumaan, mutta miksi se tulostaa kellonajan 10 minuuttia etuajassa??
Sitten pitäisi vielä adminille laittaa uutisten muokkaus mahdollisuus. Vanhasta koulutehtävästä sain vähän pohjaa, että ID:n perusteella se voisi kaivaa uutisen tiedot ja niitä voisi sen perusteella muokata. Alla oleva koodi tulostaa kaiken oikein, mutta ei anna millekään uutiselle ID:tä. Onko se ihan päin honkia vai mikä tässä mättää:
<?php //Tietokantayhteyden luonti sensuroitu if (!$haeuutiset = mysql_query("select id, nimi, otsikko, uutinen from Uutiset order by lisatty DESC ",$dbh)) {print "<li>Haku epäonnistui"; }else {while($row = mysql_fetch_assoc($haeuutiset)) { print "<tr><td class=uutissolu><b>" . $row['otsikko']; print "</b><p>" . $row['uutinen']; print "<p class=pieniteksti>Kirjoitti: " . $row['nimi']; print "</p>" . $row[1]; print " <a href=\"uutistenmuokkaus.php?id="; print $row[0] . "\">MUOKKAA UUTISEN TIETOJA</a>"; print "</td></tr>"; }} ?>
veikkaisin typoa, debuggaa vielä vaikka "select * from Uutiset order by lisatty DESC", jotta saa kaikki taulun solujen nimet selville.
while loopin sisälle koodi:
echo '<pre>'; print_r($row); echo '</pre>';
Tuon tiedon kaivamiseen tuolta tietokanta tauhkasta on erilaisia funktioita. Ulkomuistista tulee ainakin mysql_fetch_row(), mysql_fetch_array(), mysql_fetch_object() ja mysql_fetch_assoc(). Itse suosin tuota fetch_assoc,-tapaa joka siis viittaa assosiatiiviseen tulosjoukkoon, jolloin ne tulokset löytyy sieltä - tässä tapauksessa $row-taulukosta - niin että sen haetun kentän nimi toimii $row-taulukon indeksinä.
Menihän nyt varmasti yli hilseen... ? :) Rautalanka-esimerkki:
<?php $result = mysql_query("SELECT foo FROM bar"); $row = mysql_fetch_row($result); echo $row[0]; // ei hajuakaan mihin kenttään tämä viittaa, täytyy kaivaa se kysely käsiin ja katsoa mikä siinä kyselyssä on ensimmäisenä haettavana tietona $row = mysql_fetch_array($result) echo $row[0]; echo $row['foo']; //tässä toimii kummatkin, mutta toinen on aina turha -> huono $row = mysql_fetch_object($result); echo $row->foo; // jos tykkää olioista $row = mysql_fetch_assoc($result); echo $row['foo']; // mielestäni selkein ?>h
Tuo eri kellonaika viittaa mielestäni vain siihen, että palvelimen kello edistää.
Ok, kiitos.
EDIT:
Otinkin pois koodini. Taisin löytää ratkaisun ongelmaani :)
Sain ihan itse monet ongelmat ratkottua.
Muuten kaikki toimii, mutta admin-alueella
ei uutisten muokkaus onnistu, eli ei päivitä/poista muutoksia tietokantaan.
Tulee:
"Tietokantavirhe: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3"
Osa koodista pohjautuu vanhaan koulutehtävään niin siksi
tässä voi olla jotain kummallisia koodauksia/ristiriitoja. :)
Listaa kaikki uutiset putkeen:
<?php //Tietokantayhteyden luonti sensuroitu if (!$haeuutiset = mysql_query("select id, nimi, otsikko, uutinen from Uutiset order by lisatty DESC ",$dbh)) { print "Haku epäonnistui!"; } else { while($row = mysql_fetch_assoc($haeuutiset)) { print "<tr><td class=uutissolu><b>" . $row['otsikko']; print "</b><p>" . $row['uutinen']; print "<p class=pieniteksti>Kirjoitti: " . $row['nimi']; print "</p>"; print "<a href=\"uutistenmuokkaus.php?id="; print $row[id] . "\">MUOKKAA UUTISEN TIETOJA</a>"; print "</td></tr>"; } } ?>
Tällä voit yhtä uutista muokata:
(Tässä olen merkinnyt row/rivit 1,2 ja 3. Miksi ne ei toimi jos ne olisi "nimi", "otsikko" ja "uutinen" kuten edellisessä tiedostossa??)
<?php //Tietokantayhteyden luonti sensuroitu if (!$haeuutiset = mysql_query("select id, nimi, otsikko, uutinen from Uutiset where id=$id ",$dbh)) { print "Sovelluksessa on virhe."; exit; } else { $row = mysql_fetch_row($haeuutiset); } ?> <h2>Uutisten muokkauslomake</h2> <form method="post" action="uutistenmuokkauspaivitetty.php"> <input type="hidden" name="id" value="<?php print $row[id]; ?>"> Nimi: <br> <input type=text name="nimi" size="50" maglength="255" value="<?php print $row[1]; ?>"><br> Uutisen otsikko: <br> <input type=text name="otsikko" size="50" maglength="255" value="<?php print $row[2]; ?>"><br> Uutinen: <br> <textarea name="uutinen" cols="80" rows="12"><?php print $row[3]; ?></textarea><p> <input type=submit name="toiminto" value="Tallenna"> <input type=submit name="toiminto" value="Poista"> </form>
Päivittää edellisen muokkauksen:
<?php //Tietokantayhteyden luonti sensuroitu if ($toiminto == "Tallenna") { $sql_lauseke = "update Uutiset set nimi='$nimi',otsikko='$otsikko', uutinen='$uutinen' where id=$id "; if (!$haeuutiset = mysql_query($sql_lauseke,$dbh)) { $sivunotsikko = "Tietojen muuttaminen epäonnistui! "; $uutisteksti = "Tietokantavirhe: " . mysql_error(); } else { $sivunotsikko = "Uutinen muokattu. "; $uutisteksti = "Päivitys onnistui!"; } } else if ($toiminto == "Poista") { $sql_lauseke = "delete from Uutiset where id=$id"; if (!$haeuutiset = mysql_query($sql_lauseke,$dbh)) { $sivunotsikko = "Poisto epäonnistui! "; $uutisteksti = "Tietokantavirhe: " . mysql_error(); } else { $sivunotsikko = "Uutinen poistettu tietokannasta."; $uutisteksti = "Poisto onnistui!"; } } ?>
Tuossa keskimmäisessä listauksessa on jotain hämärää:
$row = mysql_fetch_row($haeuutiset); ... <input type="hidden" name="id" value="<?php print $row[id]; ?>">
Ja jos et sitä itse huomaa niin lueppa tuo ajv:n viesti uudelleen.
Ok, näin itsekin ajattelin. Kun juuri noissa kohdissa aloin soveltamaan. En vain nyt sitten tajunnut tuota ajv:n "foo" ja "bar" juttua!?
Pitää mennä haukkaa happea välillä...
Nyt sain toimimaan. Kommenttienne perusteella olisin voinut helpomminkin/paremmin koodin tehdä. Täytyy katsoa, jos jaksan jonnekin koodit laittaa niin voitte kenties kommentoida ja opastaa vielä...
Mites se 10 minuutin etuaika. Pitäisikö minun koodata jotenkin että lisää aikaan 10 min vai pitäiskö kotisivujen palvelimentarjoajalta pyytää säätämän palvelin oikeeseen aikaan?
Jos nyt välttämättä haluat:
SELECT DATE_FORMAT(lisatty + INTERVAL 10 MINUTE, '%d.%m.%Y %h:%i:%s') AS aika FROM...
Aika purkka-ratkaisu ja itse en kyllä hirveämmin välittäisi, jos aika on jäljessä 10 minuuttia. Se on kuitenkin aika turhaa informaatiota tuo millä minuutilla uutinen on kirjoitettu.
Kiitos.
Kun uutisia muokkaa niin se tallentaa kyseiselle uutisille uuden ajan ja listaa sen uuden ajan mukaan. Miten saisin muokkaukset tehtyä niin, että aika ei muutu?
Muuta timestamp-kenttä datetime-tyyppiseksi.
Kiitos ja kumarrus taas. :)
Nyt pätkii ja pahasti. Miten saa koodattua niin että lomakkeen kenttä on pakko täyttää jollain tiedolla?
(Ei julkaise uutista jos jokin tieto puuttuu)
Voiko helposti koodata jotain estoa ettei "tallenna" nappia voi painaa kuin esim. yhden kerran minuutissa?
Antti80 kirjoitti:
Nyt pätkii ja pahasti. Miten saa koodattua niin että lomakkeen kenttä on pakko täyttää jollain tiedolla?
(Ei julkaise uutista jos jokin tieto puuttuu)
Tarkista, onko $_POST['kentännimi'] tyhjä vai ei, jos on tyhjä, niin formia ei lähetetä. (Jos methodina on GET, muuta POST GETiksi)
Antti80 kirjoitti:
Voiko helposti koodata jotain estoa ettei "tallenna" nappia voi painaa kuin esim. yhden kerran minuutissa?
Ok, pitänee tutkia noita.
Nyt minua vaan ihmetyttää kun itse olen käyttänyt esim. näin:
print "<br>" . $row['viesti']; print "<p class=pieniteksti>Kirjoitti: " . $row['nimi']; print " Aika: " . $row['aika'];
Niin kun aina puhutaan joko $_POST tai GET...
Eli olenko tuon oman koodin tehnyt liian vaikeasti.
Löysin hyviä suomenkielisiä php-oppaita joten pitänee niitä lukea.
Hyvää tietoturva-asiaa lomakkeista löysin myös täältä:
http://myy.helia.fi/~jaami/php/lomake.html
Aihe on jo aika vanha, joten et voi enää vastata siihen.