Palautelomake, jossa on ne 'lähes välttämättömimmät' estot.
Elikä ei voi lähettää:
- Täysin tyhjää viestiä
- Liian pitkää viestiä (oletus 2000 merkkiä pitkä)
- Kahta viestiä peräkkäin
Allaolevan lisäksi luo ipt.txt ja CHMODaa sille oikeudet 666.
kritiikki.php
<?php //Käyttäjän IP-osoite $ip = getenv("REMOTE_ADDR"); // Estää täysin tyhjät viestit if(trim($palaute) == "") die("Ei tyhjiä viestejä!"); // Tarkistetaan, ettei viesti ole liian pitkä if(strlen($palaute) > 2000) die("Viestisi on liian pitkä!"); // Tarkistetaan ettei käyttäjä ole kirjoittamassa toista palautetta heti perään $tiedosto = fopen("ipt2.txt", "r"); $ip2 = trim(fgets($tiedosto)); fclose($tiedosto); if ($ip == $ip2) die("Et voi lähettää kahta viestiä peräkkäin!"); // Muotoillaan viesti lähetystä varten $viesti = "$palaute\r\n\r\n $ip | Vastaus: $vastaus | e-mail: $email"; // Vaihda oma e-mail-osoitteesi alle if(mail("email@osoite.org", "Palautetta", "$viesti", "From: $nimi")){ // Kirjoittajan IP lisätään ipt.txt-tiedostoon $tiedosto = fopen("ipt2.txt", "w"); fwrite($tiedosto, $ip); fclose($tiedosto); // Ohjataan kiitossivulle, jos sellainen on header("Location: index.php?sivu=kiitos"); } ?>
Tämä lomake laitetaan palautesivulle
<form method="post" action="kritiikki.php"> <input type="text" name="nimi" value="nimi" maxlength="25" size="26"><br> <input type="text" name="email" value="e-mail" maxlength="45" size="26"><br> <textarea name="palaute" rows="5" cols="40"></textarea><br> Haluatko vastauksen? <input type="radio" name="vastaus" value="kylla"> Kyllä <input type="radio" name="vastaus" value="ei"> En<br> <input type="submit" name="Lähetä" value="lähetä"> <input type="reset" name="reset" value="tyhjennä"> </form>
Erinomainen! Juuri tällaista tarvitsin! Nyt tiedän, mistä viimeksi kiikasti... ;)
EDIT: Yksi ongelma tuossa on se, että palaute ei tule sähköpostiini.
Asioita jotka tekisin toisin:
1. register_globals ei ole enää oletuksena päällä, joten ei toimi kaikilla alustoilla.
2. En rajoittaisi viestin pituutta. Kerran olen puoli tuntia kirjoittanut e-mailia ja kun painoin lähetä-nappia oli istunto webmailiin päättynyt ja voitte kuvitella niitä kirosanojen määriä :P Jos haluaa merkkien määrän rajoittaa, niin rajoittaa sen sitten johonkin 100 000:n Silloin on jo todennäköistä, että sitä ei ole käsin kirjoitettu palautteeksi.
3. En rajottaisi kahden viestin lähetystä peräkkäin. Jos pelkää jonkun spämmäävän, niin tallentaa siihen ip:n viereen aikaleiman ja estää viestien lähettämisen samasta ip:stä esim. alle minuutin sisään ja ystävällisesti kertoo, että "Odota pieni hetki ennen uutta viestiä" tjsp.
4. Tallettaisin ip-osoitteen vasta kun on varmistunut, että sähköpostin lähetys onnistui:
<?php if(mail("lehti@mail.com", "Palautetta", "$viesti", "From: $nimi")){ //viestin lähetys onnistui //tallennetaan ip tiedostoon } ?>
5. Vaikka die() onkin niin helppokäyttöinen, niin en sen käyttöä suosi. Tuloksena on valkoinen tekstisivu, joka on ruma. Parempi idea olisi pitää lähetyslomake ja php-koodi samalla sivulla. Ja jos käyttäjältä unohtuu jokin kohta tyhjäksi, niin tulostetaan lomakkeen kenttiin jo täytetyt kohdat + errorit. mail()-funktiota kutsuttaisiin vain jos yksikään virhe-ehto ei täyty. Tyyliin:
<?php $error = false; if(viesti_on_tyhjä) $error .= "Ei tyhjiä viestejä!<br />"; if(viesti_liian_pitkä) $error .= "Viestisi on liian pitkä!<br />"; if($error) echo $error; else{ //lähetetään viesti eteenpäin jne. } ?>
Edit: Sanotaan nyt vielä, että _minä_ tekisin näin. Ei tarkoita, että sinun täytyy muokata vinkki semmoiseksi.
if($viesti=="")
muotoon
if(empty($viesti))
Tai sitten ei. empty() luulee myös nollaa tyhjäksi.
Tästä syystä suosittelen käyttämään tuota loogista tyhjään vertailua, koska myöhemmässä vaiheessa saattaa olla ongelma tuon nollan kanssa, eikä sitä välttämättä tajua missä se vika sitten on :)
Ja muutenkin tuo empty() on ihan turha funktio.
Sen sijaan suosittelen myös että viesti ajetaan trim() funktion läpi, jolloin esimerkiksi yksi välilyönti katsotaan tyhjäksi.
Joo, päivitin koodia hieman.
Ja nuo die() funktiothan voi korvata headerilla ja ohjata
käyttäjä error-sivulle, jossa on luettelo mahd. vikaan menneistä asioista.
T.M. kirjoitti:
Tai sitten ei. empty() luulee myös nollaa tyhjäksi.
Tästä syystä suosittelen käyttämään tuota loogista tyhjään vertailua, koska myöhemmässä vaiheessa saattaa olla ongelma tuon nollan kanssa, eikä sitä välttämättä tajua missä se vika sitten on :)
Mutta kuka lähettäisi palautetta jossa olisi vain teksti 0.
T.M. kirjoitti:
Ja muutenkin tuo empty() on ihan turha funktio.
Kerro lisää.
makeuu kirjoitti:
Kerro lisää.
No, esimerkiksi seuraavanlainen ehtolause korvaa empty() funktion käytön:
if(!$seppo){ ... }
Manuskaa tarkastellen en löytänyt mitään hyötyä empty() funktion käytössä.
Oiskos kellään sellasta palautelomaketta, jossa ei käytetä php:tä? Ilmeisesti sivujeni tilan tarjoaja ei tue php:tä, ei onnistu tällanen... Muuten kyl käyttäsin, ja voin käyttääki jos joskus muutan sivuni jonneki muualle.
Jos tarvitset netissä olevan scriptin, käys http://supercgi.muuri.org
Jos tarjoajasi ei tue php:tä, tuskin mitään muutakaan, niin ulkoinen lomake on ainut vaihtoehto.
Mulla toi lähettää kyll ton palautteen sähköpostiin mutta kun on painanu lähetä nappii tulee eteen tällainen teksti:
Warning: fopen(ipt2.txt): failed to open stream: No such file or directory in /home/webbiin/public_html/kritiikki.php on line 12
Warning: fgets(): supplied argument is not a valid stream resource in /home/webbiin/public_html/kritiikki.php on line 13
Warning: fclose(): supplied argument is not a valid stream resource in /home/webbiin/public_html/kritiikki.php on line 14
Warning: fopen(ipt.txt): failed to open stream: Permission denied in /home/webbiin/public_html/kritiikki.php on line 25
Warning: fwrite(): supplied argument is not a valid stream resource in /home/webbiin/public_html/kritiikki.php on line 26
Warning: fclose(): supplied argument is not a valid stream resource in /home/webbiin/public_html/kritiikki.php on line 27
Warning: Cannot modify header information - headers already sent by (output started at /home/webbiin/public_html/kritiikki.php:12) in /home/webbiin/public_html/kritiikki.php on line 30
Mitä pitäis säätää että toimisi kunnolla.
Luo ipt2.txt tiedosto ja CHMODaa sille oikeudet 666.
Ei voi olla, vihdoin ja viimein sain palautelaatikon toimimaan, Hienoa! Nyt pikkusta hienosäätöä ja valmista on.
Miten saisin et eka ku kirjottaa ne tiedot ni sit painaa "tarkista" ni se menee sivulle mis on ne tiedot mitkä äsken pistettii lomakkeisii ja sit sen jälkee ku painaa "rekisteröidy" ni ne tiedot menee mun sähköpostiin JA tiedostoon kayttajat.txt muotoon: nimi|email|vv.kk.pp|salasana <- niinku toi vv.kk.pp on syntymäpäivä, miten teen tästä eteenpäin? http://koti.mbnet.fi/sllz/ohjelmointi/
tohon syötetään tiedot
ja sit samalla toi sending.php lähettäis ja tallentais ne tiedostoon kayttajat.txt
onnistuin tallentamaan ne tiedostoon ja nyt pitis saada skripti mikä lukee tälläsen tiedoston:
"Nimimerkki: pekkapouta | Nimesi: pekuzi | E-Mail: pekka_pouta@mtv8.fi | Syntymäpäivä: 5 2 1944 | Asuinpaikka: Alavieska | MSN-Messenger: pekkapouta_kissanviiket@email.com | IRC-Galleria: pekkapoutaku | Salasana: kuinkanii
"
Se tallentaa ne tiedot tollee per rekisteröinti ja ton nimi on kayttajat.txt
Eli aina rekisteröityneen käyttäjän jälkeen skripti lisää kaks enter painallusts tiedostoon.
Aika loistava. :D
Tämäkin lähettää myös tyhjät viestit.
Ja kakat lähettää. Jos siinä on yksi mikä tahansa merkki, niin se viesti ei ole tyhjä ja silloin se lähettää sen :p
Jostain syystä mulla bugaa tää sillä tavalla, että
vaikka kirjottaa jokaseen kenttää mitä vaan, ni se antaa seuraavalla sivulla virheilmoituksen, että "Ei tyhjiä viestejä!"
Mikä tuos mahtaa olla ?
lähettääkö tuo kaikki muuttujat?
mites tuon saisi vielä tallentamaan tiedostoon?
kizor kirjoitti:
Jostain syystä mulla bugaa tää sillä tavalla, että
vaikka kirjottaa jokaseen kenttää mitä vaan, ni se antaa seuraavalla sivulla virheilmoituksen, että "Ei tyhjiä viestejä!"Mikä tuos mahtaa olla ?
Mulla sama juttu.. en millään kyllä keksi miksi näin. Chmodit löytyy ja kaikki muuten pelaa..
Ikäväkseni täynnä bugeja. Periaatteessa kuitenkin hyvä.
Onpas nostalgista katsoa omaa koodivinkkiä vuodelta 2004 :)
Ei tosiaan mikään moderni taidonnäyte, olin sentään yläasteella tuohon aikaan, heh. Varmasti löytyy Googlettamalla vastaavia toimintorikkaampia palautelomakemalleja, jos tarve on. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.