Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: PHP: Palautelomake

Sivun loppuun

kayttaja-1634 [22.10.2004 16:15:20]

#

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>

Hico-Hatiac [22.10.2004 22:50:33]

#

Erinomainen! Juuri tällaista tarvitsin! Nyt tiedän, mistä viimeksi kiikasti... ;)

EDIT: Yksi ongelma tuossa on se, että palaute ei tule sähköpostiini.

ajv [23.10.2004 00:09:54]

#

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.

makeuu [24.10.2004 10:51:48]

#

if($viesti=="")

muotoon

if(empty($viesti))

T.M. [24.10.2004 18:16:15]

#

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.

kayttaja-1634 [24.10.2004 19:46:17]

#

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.

makeuu [25.10.2004 19:20:22]

#

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

T.M. [26.10.2004 01:31:57]

#

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

Tietojenkäsittelijäkö [26.10.2004 13:36:51]

#

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.

Graphic [26.10.2004 13:57:47]

#

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.

Accu [27.01.2005 14:34:29]

#

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.

kayttaja-1634 [27.01.2005 18:54:03]

#

Luo ipt2.txt tiedosto ja CHMODaa sille oikeudet 666.

QeQQu [19.03.2006 00:54:33]

#

Ei voi olla, vihdoin ja viimein sain palautelaatikon toimimaan, Hienoa! Nyt pikkusta hienosäätöä ja valmista on.

stere [30.06.2006 11:35:11]

#

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/register_better.php
tohon syötetään tiedot
ja sit samalla toi sending.php lähettäis ja tallentais ne tiedostoon kayttajat.txt

stere [30.06.2006 12:29:39]

#

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.

Teamnate [02.07.2006 05:28:31]

#

Aika loistava. :D

Jarzka [25.07.2006 21:00:32]

#

Tämäkin lähettää myös tyhjät viestit.

kayttaja-1634 [25.07.2006 22:02:08]

#

Ja kakat lähettää. Jos siinä on yksi mikä tahansa merkki, niin se viesti ei ole tyhjä ja silloin se lähettää sen :p

kizor [21.11.2006 18:51:32]

#

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 ?

CranBerry666 [05.05.2008 10:57:25]

#

lähettääkö tuo kaikki muuttujat?
mites tuon saisi vielä tallentamaan tiedostoon?

Mechax [08.10.2009 14:20:10]

#

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

Wee [16.03.2010 16:56:34]

#

Ikäväkseni täynnä bugeja. Periaatteessa kuitenkin hyvä.

kayttaja-1634 [16.03.2010 21:54:26]

#

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


Sivun alkuun

Vastaus

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

Tietoa sivustosta