Kokeilin vääntää erinäisten ohjeiden avulla itselleni lomaketta, mutta jossain tökkii; tämä kun on ensimmäinen oma PHP-sähläykseni. Laitoin lomakkeen käsittelevän PHP-koodin samalle sivulle itse lomakkeen kanssa ja hain action:llä tätä samaa sivua. En keksinyt kunnollista tapaa pitää virheen sattuessa (puuttuva tieto) jo annetut tiedot lomakkeessa niin ettei lomake tyhjene. Kyhäsin siihen jotain alkeellista ratkaisua, mutta saa antaa parempiakin tapoja. Tällä minun tavallani kun en osaa säilyttää pudotuslaatikoihin annettuja arvoja vaan ainoastaan tekstikenttien arvot säilyvät.
Lomake näennäisesti toimii oikein (ilmoittaa virheistä ja kiittää, että palaute meni perille), mutta todellisuudessa lomake ei lähetä sähköpostiini mitään. Löytyykö vikaa? Ja jos voisitte antaa vastauksia heti alussa rautalangasta vääntämällä niin, että heti ymmärrän, kun olen vielä sen verran alussa tässä ohjelmoinnissa. Kiitos. :)
***Palaute.php:n PHP-osa <?php // Tarkistetaan onko palautteen laji jäänyt antamatta ja painettu lähetä-painiketta. if ($_POST['submit'] == 'Lähetä' && $_POST['laji'] == "valitse") { // Kerrotaan, että pakollinen arvo puuttuu ja otetaan muistiin lomakkeeseen jo syötetyt tiedot echo "Palautteen laji puuttuu!"; $tiedot = array ( nimi => $_POST['nimi'], palaute => $_POST['palaute'] ); } // Tarkistetaan onko palaute antamatta ja painettu lähetä-nappia. elseif ($_POST['submit'] == 'Lähetä' && empty($_POST['palaute'])) { // Kerrotaan, että pakollinen arvo puuttuu ja otetaan muistiin lomakkeeseen jo syötetyt tiedot echo "Palaute puuttuu!"; $tiedot = array ( nimi => $_POST['nimi'], palaute => $_POST['palaute'] ); } // Tarkistetaan painettiinko lähetä-nappia, jottei palaute lähde jo sivulle saapuessa. elseif ($_POST['submit'] == 'Lähetä') { $osoite = "oma@posti.osoite"; // Tarkistellaan onko ei-pakolliset nimi ja löytyi -kentät jäänyt antamatta, jolloin niiden osalta lähetetään tyhjää. if($_POST['nimi'] == "") { $nimi = ""; } else { $nimi = "\nNimi: ".$_POST['nimi']; } $laji = "\nPalautteen laji: ".$_POST['laji']."\n"; if($_POST['loytyi'] == "valitse") { $loytyi = ""; } else { $loytyi = "Löysin tänne ".$_POST['loytyi'] . ".\n"; } $palaute = "\nPalaute:\n".$_POST['palaute']; $viesti = "Sivuilta lähetettiin palautetta seuraavin tiedoin:\n" . $nimi . $laji . $loytyi . $palaute; $laheta = mail($osoite, "Palautetta sivuista", $viesti, "From: " . $osoite); // Tarkistetaan lähtikö viesti onnistuneesti if($laheta) { // Kiitellään palautteesta } else { echo "Palaute ei jostain syystä lähtenyt eteenpäin. Otathan yhteyttä ongelman tiimoilta."; // Ja taas pidetään jo syötetyt tiedot lomakkeessa $tiedot = array ( nimi => $_POST['nimi'], palaute => $_POST['palaute'] ); } } ?>
*** Palaute.php:n html-osa <form action=<? print $_SERVER["PHP_SELF"]; ?> method="post"> Nimi:<br /> <input type="text" name="nimi" value="<?php echo $tiedot["nimi"] ?>"><br /><br /> Löysin tänne:<br /> <select name="loytyi"> <option value="valitse">Valitse</option> <option value="taalta">Täältä</option> <option value="tuolta">Tuolta</option> <option value="sielta">Sieltä</option> <option value="muualta">Jostain muualta</option> </select><br /><br /> Palautteen laji: <span class="pakollinen">*</span><br /> <select name="laji"> <option value="valitse">Valitse</option> <option value="risuja">Risuja</option> <option value="ruusuja">Ruusuja</option> <option value="muuta">Jotain muuta</option> </select><br /><br /> Palaute: <span class="pakollinen">*</span><br /> <textarea name="palaute" rows="5" cols="25"><?php echo $tiedot["palaute"] ?></textarea><br /><br /> <input type="submit" name="submit" value="Lähetä"><br /><input type="reset" value="Tyhjennä"> </form>
Laita nuo $tarkistus[x] kohtien X:t lainausmerkkeihin: $tarkistus["x"]. Onko sivut omalla palvelimella? Mail() ei toimi ilman postipalvelinmäärityksiä.
<option value="valitse"li>
Tuolla nähtävästi jotain roskaa, ota li pois.
Mikäli sikäli haluat säilyttää dropdownien arvot, niin käytä SELECTED-tekstiä siellä option-tagissa. Tarkistat siis mikä on lähetetty optioneista, ja tulostat sen tagin sisälle SELECTED.
En voi antaa esimerkkiä nyt, toivottavasti tuosta saa jotain selvääkin.
Äh.. Tuossa textarea:ssa piti $tarkistus[palaute] olla $tiedot[palaute]
Sitten sinne tosiaan jäi tuota pientä roskaa, mutta ne tuli tässä viestiä kirjoittaessa. Palvelimella näitä virheitä ei ole ja muoksin ne korjaukset nyt myös aloitusviestiin. Siis mitä postipalvelinmäärityksiä?
Kokeilen tuota selected ratkaisua, mutta sehän antaa vastauksen ainoastaan tietojen säilyttämiseksi lomakkeessa virheen sattuessa. Itse pääongelma on edelleen olemassa eli lomake ei lähetä tietoja s-postiin.
AkeMake kirjoitti:
Siis mitä postipalvelinmäärityksiä?
Tietenkin palvelimella pitää olla jokin SMTP-palvelin joka lähettää viestit vastaanottajalle. Taikka sitten php.inistä säädettynä postipalvelimeksi jokin muu (esim. Gmail) ja annat sinne myös tunnuksesi ja salasanasi.
AkeMake kirjoitti:
Kokeilen tuota selected ratkaisua, mutta sehän antaa vastauksen ainoastaan tietojen säilyttämiseksi lomakkeessa virheen sattuessa.
Eikös ollut tarkotuskin pitää dropdownit oikeissa valinnoissaan, mitkä käyttäjä on tehnyt kun tulee virhe?
Tuolla mail-funktiossa on myös ihan syntaksivirhe:
Ei näin:
$laheta = mail($osoite, "Palautetta DDAC:n sivuista", $viesti, "From: "$osoite);
vaan näin:
$laheta = mail($osoite, "Palautetta DDAC:n sivuista", $viesti, "From: " . $osoite);
Edit.
Lisäksi on aika huvittavaa, jos ongelman sattuessa näytetään käyttäjälle seuraavanlainen ilmoitus: "Palaute ei jostain syystä lähtenyt eteenpäin. Otathan yhteyttä ongelman tiimoilta". Millähän se käyttäjä ottaa yhteyttä jos palautelomake ei toimi? :DD
Macro kirjoitti:
Tietenkin palvelimella pitää olla jokin SMTP-palvelin joka lähettää viestit vastaanottajalle. Taikka sitten php.inistä säädettynä postipalvelimeksi jokin muu (esim. Gmail) ja annat sinne myös tunnuksesi ja salasanasi.
Ääh.. En löytänyt käyttämältäni ilmaispalvelimelta tuollaista SMTP -kohtaa. Mitenhän tuo tehtäisiin tällä php.ini:llä? Eli kun haluaisin postipalvelimeksi tuon Gmailin niin miten pitäisi toimia? Mistä löytyy tuo php.ini vai pitääkö se itse tehdä? Mentiin sellaiselle alueelle, josta en ymmärrä yhtään mitään. x)
Macro kirjoitti:
Eikös ollut tarkotuskin pitää dropdownit oikeissa valinnoissaan, mitkä käyttäjä on tehnyt kun tulee virhe?
No juu. Se oli se toinen pienempi ongelma. Kiitos siitä vastauksesta. Siitä vain ei ole apua ennen kuin saan lomakkeen toimimaan.
Tritonille: Tuokin virhe oli näitä mun huolimattomuuksia tässä viestiä kirjoittaessa. Alkuperäisessä lomakkeessa olin jättänyt koko From -kohdan pois. Kiitos silti tuosta huomiosta.
Ja palautteen epäonnistuessa kirjoitetaan alunperin ihan eri teksti. Alkuperäisessä tekstissä kehotin ottamaan yhteyttä erään foorumin yksityisviestillä, mutta tähän kirjotin vain nopeasti mitä sattuu.. :)
Edit. Korjailin näitä virheitä tuonne aloitusviestiin.
Edit2.
Sain nyt myös näissä alasvetovalikoissa valinnan pysymään, vaikka jokin virhe sattuisikin. Enää puuttuu se oleellisin; miten saan viestin lähtemään s-postiin. SMTP? php.ini? Mitä pitää tehdä?
Voit muuttaa php.ini-asetuksia todennäköisesti aika rajallisesti, kun kyseessä on jonkun muun palvelin, mutta jos se onnistuu, niin se onnituu ini_set-funktiolla.
ini_set("SMTP", "smtp.gmail.com");
Mihin kohtaan lomaketta tuo pitäis laittaa? Laitoin ihan vain tuohon php:n alkuun, mutta eipä se näytä toimivan. Palvelinko estää tuon vai laitoinko väärään paikkaan?
Jos se palvelin estää tuon, niin se antaa errorin... Joka tapauksessa muulla ei ole väliä, kunhan tuo on asetettu ennen mail-funktiota.
Edit. Toisaalta jos tuo ilmainen hostisi tarjoaa maksullisiakin palveluita, niin en ihmettele yhtään vaikka tuo tosiaankin olisi estetty...
Kokeile seuravaa koodia.
Tuo palautelomake toimii kyllä ihan hyvin ainakin mbnetin palvelimella, tosin
huomasin vielä sen, että tuo lomakkeen html-koodi menee rikki tästä kohtaa:
<form action=<? print $_SERVER["PHP_SELF"]; ?> method="post">
Kokeile muuttaa se näin:
<form action="<?php print $_SERVER["PHP_SELF"]; ?>" method="post">
Tosin voi johtua myös siitä, että php:n 5.-versio ei taida tukea tuota
<? - ?> merkintä tapaa...
Riippuu php:n asetuksista, kyllä sieltä se short_tags löytyy vieläkin. PHP_SELFin tilalla kannattaa injektiomahdollisuuden takia käyttää SCRIPT_NAMEa.
Äh.. Löysin tämän ilmaispalvelimen foorumilta täysin samasta aiheesta viestiä. Palveluntarjoajalta oli tullut tällaista palautetta:
"Mail sending and receiving works fine for all servers, however sometimes emails are blocked since it is sent to/from free hosting server with high email volumes. There is nothing we can do about it, you can upgrade account and then you will be setup on the server with small email sending volumes so this will help get rid of this problem."
Sen pitäisi siis toimia ilmaiseksi, mutta joskus sähköpostit on tukossa, jolloin täytyis hankkia maksullinen palvelin. Kylläpä vaikuttaa kovasti rahastukselta..
Meinasin noiden keskustelujen jälkeen jo luovuttaa tämän osalta, mutta kun kokeilin Teuron koodia niin tuli tällainen vastaus:
SMTP ennen localhost
SMTP jälkeen smtp.gmail.com
Eli toivo elää vielä??
Edit.
Olin kopsannut tuon <? print $_SERVER["PHP_SELF"];.. , kohdan eräältä sivulta suoraan, joten <? oli sitä perua. Muutin myös tuon PHP_SELF:n SCRIPT_NAME:ksi. Näillä ei näytä olevan mitään vaikutusta viestin lähettämiseen.
Eli nyt näyttäis siltä, että tuo kyllä toimii... Tarkista vielä, että tuonne koodiin asettamasi email on oikein kirjoitettu.
Oon kirjottanu emailin oikein. Ongelma ei johdu siitä. Mitähän tässä enää voi tehdä, kun kaikki on oikein, mutta viesti ei vain silti tule perille?
No sitten mitä mail funktio palauttaa? true tulee jos meni oikein ja false jos meni väärin.
Tulee ilmoitus, että viesti lähti onnistuneesti eli mail palauttaa true. Mikään ei siis näyttäisi päällisin puolin olevan vialla, mutta viesti ei silti saavu sähköpostiin.
Viestisi jää hyvin mahdollisesti johonkin roskapostisuodattimeen.
Gmailin postipalvelimen käyttäminen vaatii käsittääkseni salasanan (en mene tästä takuuseen). PHP:n mail-funktiolle ei voi antaa salasanaa, joten tässä tapauksessa pitäisi käyttää jotain muuta vaihtoehtoa, joita löytyy Googlella useitakin.
Onko sähköpostin lähettäminen edes tarpeen, vai voisiko palautteet tallentaa palvelimelle ja käydä lukemassa sieltä?
Kävin katsomassa gmailin roskapostin, mutta sinne viestit eivät ainakaan olleet menneet.
Menipä se nyt vaikeaksi.. :(
Kyllähän se sähköposti on se kaikkein mukavin vaihtoehto tarkistaa saapuva palaute. Aika ikävä olisi joka kerta käydä kirjautumassa palvelimelle tarkistaakseen tulleen palautteen, kun gmail olisi päällä lähes 24/7, josta näkisi palautteet reaaliajassa.. Miten voisi käyttää niitä googlen suomia muita vaihtoehtoja?
Mutta jos ei sähköpostia saa toimimaan niin millainen olisi se toinen vaihtoehto (miten tallentaa palvelimelle)?
No ne viestithän voi aina tallentaa tiedostoon tai tietokantaan sen mukaan, mitkä resurssit on käytössä.
Yrititkö edes hakea Googlella tietoa? Jo ensimmäinen osuma sisältää yksinkertaiset ohjeet.
tais olla valmiina joku gmail plugin
Aihe on jo aika vanha, joten et voi enää vastata siihen.