Tässä on toimiva kommenttijärjestelmä.
Järejestelmä muistuttaa aika lailla tätä Ohjelmointiputkan omaa.
Kommenttijärjestelmässä on seuraavanlaiset estot/rajoittimet:
- Kommentin pituuden rajoitin
- HTML-tagien esto
- Kahden peräkkäisen kommentin kirjoittamisen esto
- Tyhjien viestien esto
- Liian pitkien yksittäisten sanojen rajoitin (pätkii merkkijonon)
Luo ipt.txt ja kommentti1.txt, uploadaa ne palvelimelle ja CHMOD:aa niille oikeudet 666.
Muista muuttaa tarvittavat linkit, värikoodit ym. vastaamaan omia sivujasi, sekä muuttaa adminarean salasana.
Toimiva kokeiluversio: http://---/kommentti/?sivu=etusivu
etusivu.php
<html> <head> <title>Doom, It's Doom I Say!</title> </head> <body> <font size="+1"><u>Kommentit</u></font> <p> <?php include ("kommentti1.txt"); ?> <br> <hr noshade> <form action="kommenttifilu.php" method="post"> <input type="text" name="nimi" value="nimi" maxlength="25" size="26"><br> <input type="text" name="email" value="e-mail" maxlength="47" size="26"><br> Kommentti:<br> <textarea name="kommentti" rows="5" cols="62"></textarea><br> <input type="submit" name="laheta" value="kommentoi" size="26"> <input type="reset" name="tyhjenna" value="tyhjennä" size="26"> </form> <a href="adminarea.php" style="font-size: 10px">admin</a> </body> </html>
kommenttifilu.php
<?php // Haetaan käyttäjän IP $ip = $_SERVER['REMOTE_ADDR']; // Karsii pois kaikki HTML-tagit $email = stripslashes(htmlspecialchars($email)); $kommentti = stripslashes(htmlspecialchars($kommentti)); $nimi = stripslashes(htmlspecialchars($nimi)); // Rajoittaa kirjoitetun kommentin tiettyyn merkkimäärään, joka on määritelty alla if(strlen($kommentti) > 820) die("Viestisi on liian pitkä! <a href='index.php?sivu=etusivu'>Etusivulle</a>."); // Tarkistetaan ettei käyttäjä ole kirjoittamassa toista kommenttia heti perään $tiedosto = fopen("ipt.txt", "r"); $ip2 = trim(fgets($tiedosto)); fclose($tiedosto); if ($ip == $ip2) { echo "Et voi kirjoittaa kahta kommenttia peräkkäin! <a href='index.php?sivu=etusivu'>Etusivulle</a>"; } else { // Kirjoittajan IP lisätään ipt.txt-tiedostoon $tiedosto = fopen("ipt.txt", "w"); fwrite($tiedosto, $ip); fclose($tiedosto); // Tulostaa kommenttiin ajan $aika = date("d.m.y H:i:s"); // Estää täysin tyhjät viestit if($kommentti == "") { echo "Ei tyhjiä viestejä! <a href='index.php?sivu=etusivu'>Etusivulle</a>."; } else { // Pätkii kommentin ylipitkät lauseet pienemmiksi $text = "$kommentti"; $uusikommentti = wordwrap($text, 70, "\n", 1); // Kasaa kommentin tablen sisään $viesti = "<table width='100%' cellspacing='0' cellpadding='0'> <tr><td bgcolor='#C5E181' width='50%' style='border-bottom: 1px solid black; border-left: 1px solid black; border-top: 1px solid black;'> <a href='MAILTO:$email'> $nimi</a> </td><td bgcolor='#C5E181' align='right' width='50%' style='border-bottom: 1px solid black; border-right: 1px solid black; border-top: 1px solid black;'> [$aika] </td></tr> <tr><td width='80%'>$uusikommentti</td></tr> </table><br>"; } // Jos viestin kasaus onnistuu, se kirjoitetaan kommenttitiedostoon if($viesti) { $fp = fopen("kommentti1.txt", "a"); fwrite($fp, "$viesti\n"); fclose($fp); // Kommentin lisäämisen jälkeen ohjataan käyttäjä jollekin sivulle header ("Location: index.php?sivu=etusivu"); } } // Kommenttijärjestelmä by: --- ?>
adminarea.php
<html> <head></head> <body> <table align="center" width="120"> <tr><td> <font size="+2" face="verdana">Adminarea</font> <form action="admin.php" method="post"> Salasana:<br> <input type="password" name="salasana" value="salasana" style="border: 1px solid #88B34A; font-size: 11px; font-style: verdana; color: #648135; background: #C5E181;"><br> <input type="submit" name="laheta" value="tyhjennä kommentit"style="border: 1px solid #88B34A; font-size: 11px; font-style: verdana; color: #648135; background: #C5E181;"> </form> </td></tr> </table> </body> </html>
admin.php
<?php // Tarkistetaan vastaako annettu salasana asetettua salasanaa if($salasana == "sinunsalasana") { $fp = fopen("kommentti1.txt","w"); fputs($f0p, ""); fclose($f0p); header ("Location: index.php?sivu=etusivu"); } // Jos salasana oli väärin, tulostuu ruudulle alla oleva teksti else { print "Väärä salasana! <a href='index.php?sivu=etusivu'>Etusivulle</a>."; } ?>
Näyttää ainakin asialliselta.
Juu, ja tämä on sitten minun ensimmäinen PHP-tekele, joten joitain "epäkohtia" saattaa gurujen silmään osua. ;-)
Minun silmiini sattui koodin hieman epämääräinen sisentely, vaikkei tuossa suuremmin vikaa muuten ollut. Tosin mielestäni on parempi jättää viestien muotoilu sivun oman CSS:n varaan, eikä tulostaa tyylimäärittelyä joka viestiin.
Joo, tuo nyt vain sattuu olemaan juuri sama, kuin mitä käytän omilla sivuillani. Tyylimäärittelyt on kyllä helppo poistaa tuosta tai muuten muuttaa niitä. Sisentelyyn en oikein kiinnittänyt mitääh huomiota, oli vain pääasia, että saan itse koodista selvää nääs. ;-D
Kyllähän tuo on ihan hyvä tekele ensimmäiseksi php-skriptiksi ja on pikaisella silmäyksellä kohtalaisen hyvin toteutettu. Mutta pitikö tämä laittaa putkaan? Eiköhän näitä ole jo muutama täällä.
ekaksi tekeleeksi on kyllä mahtava... sisennät tosiaan kyllä aika hassusti :P
Joo.. sisennän hassusti, tiedän. :-P
Turambar: Kyllä kait tämä kannattaisi jättää.
Olihan täällä toki n.5 kappaletta muita kommenttivirityksiä, mutta niihin oli helppo floodia, ne sai just like that sekaisin ja monista puuttui nämä olennaisimmat estot häirikköjen varalta...
Mutjoo, enhän mä siitä päätä :P
Ei taida ihan tuolla IP:llä toimia tuo kahden peräkkäisen kommentin esto. Ainaki motukalla 'arvotaan' joka kerta uus IP
Ihan ok käytän omilla sivuillani. Mulla ainakin toimii ihan hyvin.
SLander: on totta, että motukalla saadaan aina uusi IP-osoite kun mennään nettiin. Saatu IP pysyy kuitenkin koko sen ajan, mitä ollaan yhdellä kertaa netissä. Eli spämmätäkseen pitäisi motukalla aina yhdistää uudestaan nettiin, mikä vie tunnetusti jonkin aikaa, jos nyt siis useampaa kommenttia haluaisi peräkkäin kirjoittaa. Muutenkaan kommenteista ei saa kovin pitkiä, koska tuossa on merkkijonon pituuden rajoitin.
Muutin muuten tuon merkkijonojen pituuden rajoittimen katkaisukohdan 70:n merkkiin, kun se aiemmin oli 99. Huomasin, että ylipitkiä merkkijonoja kirjoitettaessa 99 oli liian suuri arvo ja taulukko venyi hieman, eli kannattaa korjata omaansakin.
Näin on. Mutta mitä jos joku piilottaa IP osotteensa, sekin on mahdollista, hahaa sitten ollaan kusessa.
No harva tietääkseni piilottaa IP:nsä. Ja silti esim. johonkin foorumiin on helpompi häiriköidä kuin tuohon. :-P
Aika tyhmää estää kahden perättäisen viestin lähettäminen, ainakin minua ärsyttäisi.
Estä mielummin saman viestin lähettäminen peräkkäin.
No on siitä kyllä selvästi enemmän hyötyä kuin haittaa. :-)
Ja eiköhän tuon IP-viritelmän voi poistaa aika helposti ja vaihtaa juuri tuollaiseen estoon kuin kuvailit, jos joku välttämättä haluaa.
Tuota näissä sivuohjauksissa
header ("Location: index.php?sivu=etusivu");
kannattaa laittaa koko osoite, esim. http://www.sivut.fi/?sivu=etusivu. Sillä huomasin joskus, että tietyt selaimet eivät osaa redirectata ilman koko osoitetta, taisi olla peräti IE listalla ei-osaavat, vai olikos se Opera. Jokatapauksessa...
Voipi olla..
Mutta ainakin minä testasin tuota muutamalla eri selaimella ja hyvin toimi kaikissa. Kannattaa ehkä silti tehdä juuri noin, että laittaa sen koko osoitteen.
hieno
Ihan hieno! mutta yks juttu... Ois ehkä parempi jos noi kommentit tulis sillee et uusin ylös (noh se on mun mielipide) :)
Munkin mielestä ois ehkä kätevämpää että uusin viesti tulisi ylös... Eikä tuo mulla toimi... aina kun yritän laittaa viestin se sanoo ettei tyhjiä viestejä. oiskohan vinkkiää tuohon probleemaan?
En nyt oikein tiedä, olisiko se tällaisessa kommenttisysteemissä hyvä, että se uusin viesti tulee ylös. Eihän tässä putkan kommentointisysteemissäkään uusin viesti tule ylös. Se vain on luontevaa.
Ja kyllä tuon skriptin pitäisi toimia, nimittäin tämä koodi on suoraan tuosta toimivasta kokeiluversiosta. Jos jokin mättää, on itse tehnyt jotain väärin. Tuo "ei tyhjiä viestejä"-huomautus tulee vain silloin, kun etusivu.php:n kommentti-textarea on täysin tyhjä.
no kuitenkin vaikka kirjoitan mitä siihen, kuinka paljon tai kuinka vähän tahansa niin se sanoo että ei tyhjiä viestejä
Kyllä tuon pitäisi toimia, mutta tässä on hieman fiksattu versio, jos huvittaa kokeilla: http://---/kommentti.zip
Mullakin ekalla kerralla sanoo et ei tyhjiä viestejä ja tokalla valittaa et ei kahta viestiä peräkkäin.
Tusota html tagien poistosta voisn huomauttaa, että jos tuo pitää tulostaa näytölle joskus tuo kommentti niin se ajaa kyseisen scriptin taikka tagin jos on käytetty tuota htmlspecialchars . Itse käyttäisin tässä yhteydessä strip_tags($muuttuja) muotoa.
mitenköhän sais ton toimiimaan silleen että uusin kommentti tulis aina sivulla ensimmäisenä ja alaspäin mentäessä viestit vanhenis.
No ei tuota kovin vaikeaa olisi toteuttaa, vain muutama pikku muutos.. ei vain itse oikein jaksa nyt. :D
Juu, samaa mietin, että miten saa uusimman näkymään ylälaidassa... Jos joku neuvoisi... Kun paksusta php-oppaasta on vasta 50 sivua luettu...
Aihe on jo aika vanha, joten et voi enää vastata siihen.