Yritäin tehdä semmoista palautelomaketta, mutta nyt tuli jälleen ongelma eteen. Palaute ei nähkääs lähde. Ei muuten olisi mitään kysymistä, muttakun palautteen lähtö vaikuttaa johtuvan mitä ihmeellisemmästä syystä. Tiedoston "palautelomake.php" sisältö on tämän-näköinen:
<html> <title>Palautelomake</title> <body> <font face="Verdana" size=2> Tämän palautelomakkeen avulla voit lähettää palautetta sivujen omistajalle. <form method="post" action="laheta.php"> Nimesi: <input type="text" name="nimi"><br> Sähköpostisi: <input type="text" name="email"><p> Viesti:<br> <textarea name="viesti" rows="25" cols="30"></textarea> <input type="submit" value="Lähetä"> </form> </font> </body> </html>
Tuolla koodilla palaute ei suostu lähtemään osoitteeseen. MUTTA: Alla olevalla koodilla palaute lähtee, mutta ilman sisältöä:
<html> <title>Palautelomake</title> <body> <font face="Verdana" size=2> Tämän palautelomakkeen avulla voit lähettää palautetta sivujen omistajalle. Nimesi: <input type="text" name="nimi"><br> Sähköpostisi: <input type="text" name="email"><p> Viesti:<br> <textarea name="viesti" rows="25" cols="30"></textarea> <form action="laheta.php"> <input type="submit" value="Lähetä"> </form> </font> </body> </html>
Miksi palaute siis lähtee alimmaisen koodin kautta, muttei ylimmäisen??
Alemmassa koodissa ei ole järkeä. Formissa itsessään ei ole muuta kuin lähetä-nappi, jolloin muuta sisältöä ei luonnollisesti välitetä laheta.php:lle.
Se, että ylemmällä koodilla palaute ei lähde, johtuu todennäköisesti laheta.php:ssa olevasta virheestä. Sen koodista voisi olla apua ongelman ratkaisussa.
Tässä on sen laheta.php-tiedoston sisältö:
<?php // Tekijä: Emil Tuomi <http://koti.mbnet.fi/cpf> // Säilytä tekijän nimi! // Tarkistetaan ettei mikään suojausmenetelmä petä if (isset($plomake)) { echo "Odota vähintään 2-minuuttia viestien lähetysten välillä."; exit; } if (strlen($viesti) > 10000) { echo "Kirjoitteleppas vähän lyhempää viestiä. 10000-merkkiä on suurin mahdollinen pituus."; exit; } // Luodaan evästettä typerien floodaus-viestien takia setcookie("plomake", "Palautelomakkeen aikajakso", time() + 60 * 2); // Selvitetään käyttäjän hosti $iposoite = $_SERVER['REMOTE_ADDR']; $host = gethostbyaddr($iposoite); // Muotoillaan viestiä hienommaksi $palaute = "$viesti\n\n\n$host\nVastaus: $vastaus\nSähköposti: $email"; // Lähetetään palaute alla määritettyyn osoitteeseen $laheta = mail("emtuomi@hotmail.com", "$aihe", "$palaute"); if($laheta) { header("Location: kiitos.php"); } else { header("Location: virhe.php"); } ?>
Tuo koodi on muutenkin aika paljon kesken.
EDIT: Huppista! Tuosta puuttui aihe-kenttä. Mutta ei se toimi sittenkään.
Jos IP-osoite selviää $_SERVER-taulukon avulla, niin register_globals on poissa päältä, kuten suositus kuuluu. Joudut viittaamaan lomakekenttiin nimillä $_POST['viesti'], $_POST['nimi'] ja $_POST['email']. Eväste löytyy muuttujasta $_COOKIE['plomake'].
Mail-kutsusi sisältää tietoturva-aukon, tällaisenaan koodia voi käyttää spämmin välittämiseen. Estäminen onnistuu seuraavasti:
mail("emtuomi@hotmail.com", "$aihe", "\r\n\r\n$palaute");
Näin estetään ylimääräisten headereiden laittaminen.
EDIT: Saanen myös huomauttaa, että kahden minuutin floodisuojauksesi pettää, jos käyttäjä ottaa evästeet pois käytöstä.
Vähän huono PHP-kysymys: Siis millä koodilla kokonaisuudessaan saan palautteen lähtemään.
Ennen kuin unohtuu mainita, niin lisäisin, että tuolla cookie-patentilla et saa minkäänlaista floodisuojausta aikaan. On suorastaan luvattoman helppoa rakennella systeemi, joka lähettää noita maileja melkoisen monta melkoisen lyhyessä ajassa :)
Siivotaan nyt sitten muiden koodia:
<?php // Tarkistetaan ettei mikään suojausmenetelmä petä (joopa joo) if (isset($_COOKIE['plomake'])) { echo "Odota vähintään 2 minuuttia viestien lähetysten välillä."; exit; } if (strlen($_POST['viesti']) > 10000) { echo "Kirjoitteleppas vähän lyhempää viestiä. 10000 merkkiä on suurin mahdollinen pituus."; exit; } // Luodaan evästettä typerien floodaus-viestien takia setcookie("plomake", "Palautelomakkeen aikajakso", time() + 60 * 2); // Selvitetään käyttäjän hosti $iposoite = $_SERVER['REMOTE_ADDR']; $host = gethostbyaddr($iposoite); // Muotoillaan viestiä hienommaksi $palaute = $_POST['viesti']."\n\n\n$host\nSähköposti: ".$_POST['email']."\n"; // Lähetetään palaute alla määritettyyn osoitteeseen $laheta = mail("emtuomi@hotmail.com", "$_POST['aihe']", "\r\n\r\n$palaute"); if($laheta) { header("Location: kiitos.php"); } else { header("Location: virhe.php"); } ?>
Poistin tuon vastaus-kohdan, kun en nähnyt, mistä ihmeestä sen kiskoit. Saa soveltaa. Korjasin myös pari suomen kieleen liittyvää virhettä.
tkarkkainen kirjoitti:
Jos IP-osoite selviää $_SERVER-taulukon avulla, niin register_globals on poissa päältä
Kyllä nuo superglobaalit taulukot ovat silti voimassa vaikka register_globals olisikin On, ainakin pienen testailun tuloksena ja eihän tuo sinällään ole mitenkään superglobaalit poissulkeva optio.
Eikä merkkijonoja tartte "muuttaa" merkkijonoiks ymppäämällä lainausmerkit muuttujan ympärille, se on merkkijono jos se kerran on merkkijono, ja PHP muutenkin tekee nuo muutokset automaagisesti. Ja jos tarvitseekin niin mieluiten erikseen ja vaikka settypellä tai millä hyvänsä, tuo näyttää niin purkalta.
Parse error: parse error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /mbnet/c/cpf/laheta.php on line 18
tsuriga kirjoitti:
Kyllä nuo superglobaalit taulukot ovat silti voimassa vaikka register_globals olisikin On, ainakin pienen testailun tuloksena ja eihän tuo sinällään ole mitenkään superglobaalit poissulkeva optio.
Eipä ole tullut tuolta kannalta ajateltuakaan, itse kun koodaan PHP:ni aina niin että register_globals on pois päältä. Ilmeisesti koodini pitäisi sitten toimia muuttamattomana myös register_globalsia päällä pitävillä servereillä.
Tuo parse errori saattaa johtua siitä, että $_POST['aihe'] jäi epähuomiossa lainausmerkkeihin. Kokeile ottaa lainausmerkit sen ympäriltä pois. Voi johtua myös siitä, että tämänhetkisellä lomakkeellasi ei ole aihe-nimistä kenttää.
tkarkkainen kirjoitti:
$laheta = mail("emtuomi@hotmail.com", "$_POST['aihe']", "\r\n\r\n$palaute");
$laheta = mail("emtuomi@hotmail.com", $_POST['aihe'], "\r\n\r\n$palaute");
Tai jos on ihan pakko saaja lainausmerkit tuohonkin, niin
$laheta = mail("emtuomi@hotmail.com", "{$_POST['aihe']}", "\r\n\r\n$palaute");
Ai niin, ja speksin mukaan Location-headerissa pitäis olla aina absoluuttinen URL.
Palaute ei lähde vieläkään.
Tuolla ongelmakuvauksella on hankala lähteä arpomaan mitään.
Olethan tarkastanut, ettei hotmail tulkitse viestiä spämmiksi?
Olen. Tuossa koodissa on pakko mätätä joku.
EDIT: Alkaa tulla sellainen vaikutelma, että onglema on niin helppo ratkaista, ettei niin läheltä osaa etsiä :D
EDIT: Ja nyt kun rupesin asiaa etsimään mahdollisimman läheltä, helpotuin. Palaute lähtee hyvin, kun ottaa tuon $laheta-kohdan pois.
Mutta nyt toinen kysymys:
Miten se if-ehtolause sovelletaan tuohon??
EDIT: JESS! NYT TOIMII! Jo oli pienestä kiinni; if-ehtolauseesta puuttui väli!
EDIT: Se vika olikin näköjään hotmailissa. "Palvelin kuormittunut"-tyyppinen ilmoitus tuli ruutuun.
Vika lienee tosiaan tuon PHP-koodin ulkopuolella. Myöhemmin tuleva if-lause ja sen mahdolliset välit eivät vaikuta mitenkään mail-funktion toimintaan.
Aihe on jo aika vanha, joten et voi enää vastata siihen.