Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Kommenttijärjestelmä

Sivun loppuun

kayttaja-1634 [05.03.2004 16:43:33]

#

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>.";
}
?>

The Ohjelmoija [05.03.2004 17:47:04]

#

Näyttää ainakin asialliselta.

kayttaja-1634 [05.03.2004 17:49:35]

#

Juu, ja tämä on sitten minun ensimmäinen PHP-tekele, joten joitain "epäkohtia" saattaa gurujen silmään osua. ;-)

Tempfile [07.03.2004 13:22:39]

#

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.

kayttaja-1634 [07.03.2004 13:27:40]

#

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

Turambar [07.03.2004 15:36:34]

#

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ä.

sooda [07.03.2004 16:12:28]

#

ekaksi tekeleeksi on kyllä mahtava... sisennät tosiaan kyllä aika hassusti :P

kayttaja-1634 [07.03.2004 17:25:36]

#

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

SLander [08.03.2004 10:57:08]

#

Ei taida ihan tuolla IP:llä toimia tuo kahden peräkkäisen kommentin esto. Ainaki motukalla 'arvotaan' joka kerta uus IP

Petesku [08.03.2004 13:22:06]

#

Ihan ok käytän omilla sivuillani. Mulla ainakin toimii ihan hyvin.

kayttaja-1634 [08.03.2004 15:14:48]

#

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.

SLander [09.03.2004 13:01:59]

#

Näin on. Mutta mitä jos joku piilottaa IP osotteensa, sekin on mahdollista, hahaa sitten ollaan kusessa.

kayttaja-1634 [09.03.2004 16:45:38]

#

No harva tietääkseni piilottaa IP:nsä. Ja silti esim. johonkin foorumiin on helpompi häiriköidä kuin tuohon. :-P

T.M. [09.03.2004 18:19:16]

#

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.

kayttaja-1634 [10.03.2004 07:31:43]

#

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.

odys [10.03.2004 09:46:23]

#

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...

kayttaja-1634 [10.03.2004 13:27:12]

#

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.

vsbs [10.03.2004 16:56:38]

#

hieno

dera [14.03.2004 00:36:23]

#

Ihan hieno! mutta yks juttu... Ois ehkä parempi jos noi kommentit tulis sillee et uusin ylös (noh se on mun mielipide) :)

peikko [25.03.2004 15:40:33]

#

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?

kayttaja-1634 [25.03.2004 22:25:21]

#

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ä.

peikko [25.03.2004 23:00:02]

#

no kuitenkin vaikka kirjoitan mitä siihen, kuinka paljon tai kuinka vähän tahansa niin se sanoo että ei tyhjiä viestejä

kayttaja-1634 [26.03.2004 14:12:25]

#

Kyllä tuon pitäisi toimia, mutta tässä on hieman fiksattu versio, jos huvittaa kokeilla: http://---/kommentti.zip

Dustbin [27.04.2004 21:33:06]

#

Mullakin ekalla kerralla sanoo et ei tyhjiä viestejä ja tokalla valittaa et ei kahta viestiä peräkkäin.

raezel [30.04.2004 12:41:41]

#

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.

heman [18.07.2004 19:08:25]

#

mitenköhän sais ton toimiimaan silleen että uusin kommentti tulis aina sivulla ensimmäisenä ja alaspäin mentäessä viestit vanhenis.

kayttaja-1634 [18.07.2004 22:56:12]

#

No ei tuota kovin vaikeaa olisi toteuttaa, vain muutama pikku muutos.. ei vain itse oikein jaksa nyt. :D

Dadin [15.08.2004 14:24:56]

#

Juu, samaa mietin, että miten saa uusimman näkymään ylälaidassa... Jos joku neuvoisi... Kun paksusta php-oppaasta on vasta 50 sivua luettu...


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta