Heips, tekaisin tuossa ohjelmointiputkan php-oppaan avulla vieraskirjan sivuilleni. Ongelmia on kuitenkin monia...
1. En osaa asettaa viesteille lähetysaikaa
2. Lähetettäessä tuo herjaa, ettei tiedä minne mennä lähettämisen jälkeen - osoite siis väärin, mutta olen kokeillut vaikka minkälaisia versioita... (index.php, vieraskirja/index.php, http://rantaminttu.net/hemppa/vieraskirja/index.
3. Miten tuossa textareassa saa rivinvaihdot toimimaan. Nyt kun siihen laittaa rivinvaihtoja niin se heittää tuolla .txt tiedostossa sen tietysti monelle riville ja tuo käsittelee sen monena eri viestinä eri rivitysten takia...
Kohdat 1 ja 3: Nämä asiat sisältyvät oppaan vieraskirjaan. Voit siis tallentaa funktion time antaman aikaleiman tiedoston ja näyttää sen perusteella lähetysajan funktion date avulla. Rivinvaihdot taas voi korvata <br>-tageilla, jolloin ne eivät aiheuta häiriötä tiedoston riveihin.
Kohta 2: Viimeisen ehdotuksesi (sivun täydellinen osoite) pitäisi ainakin toimia, jos siis käytät tällaista koodia:
header("Location: http://tahan.tulee.fi/sivun/taydellinen/osoite.php");
1. Aikaleiman saa time-funktiolla, ja sen voi (tulostusvaiheessa) muuttaa päivämääräksi date-funktiolla.
2. Miten olet yrittänyt tehdä ja millainen virheilmoitus tarkalleen tulee? Luettelostasi päätellen ohjauksen pitäisi näyttää tältä:
header("Location: http://rantaminttu.net/hemppa/vieraskirja/");
3. Voit tallentaa viestin enkoodattuna esim. funktiolla rawurlencode, jolloin latausvaiheessa täytyy vastaavasti purkaa se funktiolla rawurldecode.
Antti Laaksonen kirjoitti:
Rivinvaihdot taas voi korvata <br>-tageilla
Tekstin muuntaminen HTML-muotoon jo tallennusvaiheessa on yleensä huono idea. Parempi olisi muuttaa teksti vasta tulostuksen yhteydessä. Lisäksi oppaan vieraskirjassa on virhe stripslashes-funktion suhteen (koska eihän sitä nykyään pitäisi tarvita kuin poikkeustilanteissa) sekä siinä, että |-merkki viestissä sotkee järjestelmän.
Kiitos Antti, kokeilenpas tuota päivämääräjuttua :) ainoa ongelma tossa <br> tulee olemaan se, että miten saan kaikki kirjoittajat sitä käyttämään? Sivuilla kun käy 10-vuotiaitakin lapsia, joille käsite HTML on hepreaa (= vaikka kirjoittaisi kissan kokoisilla kirjaimilla ohjeet niin ei ne sisäistä sitä :D).
Ja tuota täydellistä osoitetta olen kokeillutkin :( Eikä toimi
muoks// multa ei onnistu mikään ilman tarkkaa selitystä x) joten tuo enkoodaus ei mene järkeen. Enkä hahmota, että minne kohtaan tuo:
$aika = time();
...pitäisi tunkea? Siihenkö kohtaan, jossa haetaan ne lomakkeen eri kohdat? + että onko edes oikea koodi...
merlin kirjoitti:
ainoa ongelma tossa <br> tulee olemaan se, että miten saan kaikki kirjoittajat sitä käyttämään?
Ideana oli, että viestin kirjoittaja voi kirjoittaa rivinvaihdot tavallisesti, mutta ne muutetaan HTML-muotoon viestin lähetyksen yhteydessä.
(Metabolix on oikeassa siinä, että viestin tallentaminen HTML-muodossa ei ole usein järkevää. Tässä tapauksessa se on kuitenkin minusta toimiva ratkaisu.)
merlin kirjoitti:
Ja tuota täydellistä osoitetta olen kokeillutkin :( Eikä toimi
Miten tarkalleen kutsut header-funktiota? Missä tiedostossa kutsut sitä?
merlin kirjoitti:
Enkä hahmota, että minne kohtaan tuo:
Tuo koodi selvittää nykyhetken aikaleiman, jonka voit tallentaa tiedostoon viestin muiden tietojen yhteyteen. Eli järkevä paikka koodille on vähän ennen viestin tallennusta tiedostoon.
https://www.php.net/manual/en/function.nl2br.php <-- rivinvaihto <br /> tagiksi
Lue:
http://www.scratchprojects.com/2006/05/
Vaihtoehtoisesti, jos lontoo ei taivu..
http://translate.google.com/translate?js=n&prev=_t&hl=fi&ie=UTF-8&layout=2&eotf=1&sl=en&tl=fi&u=http://www.
merlin kirjoitti:
ainoa ongelma tossa <br> tulee olemaan se, että miten saan kaikki kirjoittajat sitä käyttämään? Sivuilla kun käy 10-vuotiaitakin lapsia, joille käsite HTML on hepreaa (= vaikka kirjoittaisi kissan kokoisilla kirjaimilla ohjeet niin ei ne sisäistä sitä :D).
Ja tuota täydellistä osoitetta olen kokeillutkin :
Jos vieraskirjan tekstikentän nimi on "viesti" (<textarea name="viesti"></textarea>
), niin nuo rivinvaihdot saa muutettua <br>
-tagiksi tällä koodilla:
$viesti = str_replace("\n", "<br>", $viesti);
Tuo tulee sitten sinne käsittely sivulle, jossa kaikkien kenttien tiedot käsitellään ja tallennetaan tekstitiedostoon.
Yritin lähettää vieraskirjaasi viestiä ja silloin tuli virheviesti, josta selvisi että olit suomentanut funktion time();
aika();
:ksi
Näin pitäisi toimia tuo ajan ottaminen:
//otetaan talteen aika, jolloin viesti lähetettiin $aika = time(); //muodostetaan tiedostoon tallennettava rivi $rivi = "$nimi|$email|$aika|$viesti\n";
Eli teet tuon mallin mukaan niin eiköhän pitäisi toimia, älä muuta funktiota time();.
Oikeesti oon ihan ulapalla, minne kohtiin nuo täytyy tunkea x) Tässä siis sinun läheta.php koodi:
<?php //jos nimeä ei ole annettu, näytetään lomake... if (!isset($_POST['nimi'])) { ?> <h1>Kirjoita viesti vieraskirjaan</h1> <p><a href="http://rantaminttu.net/hemppa/index2.php?sivu=vieraskirja/index.php"><- Takaisin</a></p> <form action="http://rantaminttu.net/hemppa/index2.php?sivu=vieraskirja/laheta.php" method="post"> <p><center><table class="lahetys"> <tr> <td class="lahetys1" valign="top"> Nimi:<br/> Sähköposti:<br /> Sivusi nimi:<br /> Sivusi URL:<br /> Viestisi:</td> <td class="lahetys2" valign="top"> <input type="text" name="nimi" class="loota" /> <br /> <input type="text" name="sposti" class="loota" /> <br /> <input type="text" name="sivu" class="loota" /> <br /> <input type="text" name="sivuURL" class="loota" /> <br /> <textarea name="viesti" class="loota2" rows="8" cols="35">Tämä on tekstikenttä</textarea><br /> <input name="vastaus" type="hidden" /><br /> <center><input type="submit" value="Lähetä" class="lahetanappi"></center></td></tr></table></center><br /> </form> <?php //...muussa tapauksessa kirjoitetaan viesti tiedostoon } else { //avataan tiedosto append-tilassa: kirjoitetaan tiedoston loppuun $tiedosto = fopen("vieraskirja/viestit.txt", "a"); //haetaan lomakkeen kautta tulleet muuttujat $nimi = $_POST['nimi']; $sposti = $_POST['sposti']; $sivu = $_POST['sivu']; $sivuURL = $_POST['sivuURL']; $viesti = $_POST['viesti']; //muodostetaan tiedostoon tallennettava rivi $rivi = "$nimi|$sposti|$sivu|$sivuURL|$viesti|$vastaus\n"; //kirjoitetaan rivi tiedostoon fwrite($tiedosto, $rivi); //suljetaan tiedosto fclose($tiedosto); //ohjataan käyttäjä vieraskirjasivulle header("Location: http://rantaminttu.net/hemppa/index2.php?sivu=vieraskirja/index.php"); } ?>
<?php //jos nimeä ei ole annettu, näytetään lomake... if (!isset($_POST['nimi'])) { ?> <h1>Kirjoita viesti vieraskirjaan</h1> <p><a href="http://rantaminttu.net/hemppa/index2.php?sivu=vieraskirja/index.php"><- Takaisin</a></p> <form action="http://rantaminttu.net/hemppa/index2.php?sivu=vieraskirja/laheta.php" method="post"> <p><center><table class="lahetys"> <tr> <td class="lahetys1" valign="top"> Nimi:<br/> Sähköposti:<br /> Sivusi nimi:<br /> Sivusi URL:<br /> Viestisi:</td> <td class="lahetys2" valign="top"> <input type="text" name="nimi" class="loota" /> <br /> <input type="text" name="sposti" class="loota" /> <br /> <input type="text" name="sivu" class="loota" /> <br /> <input type="text" name="sivuURL" class="loota" /> <br /> <textarea name="viesti" class="loota2" rows="8" cols="35">Tämä on tekstikenttä</textarea><br /> <input name="vastaus" type="hidden" /><br /> <center><input type="submit" value="Lähetä" class="lahetanappi"></center></td></tr></table></center><br /> </form> <?php //...muussa tapauksessa kirjoitetaan viesti tiedostoon } else { //avataan tiedosto append-tilassa: kirjoitetaan tiedoston loppuun $tiedosto = fopen("vieraskirja/viestit.txt", "a"); //haetaan lomakkeen kautta tulleet muuttujat $nimi = $_POST['nimi']; $sposti = $_POST['sposti']; $sivu = $_POST['sivu']; $sivuURL = $_POST['sivuURL']; $viesti = $_POST['viesti']; // Muutetaan tekstikentän rivinvaihdot br -tagiksi $viesti = str_replace("\n", "<br>", $viesti); // Aika, jolloin viesti lähetetään $aika = date("H:i"); //muodostetaan tiedostoon tallennettava rivi $rivi = "$nimi|$sposti|$aika|$sivu|$sivuURL|$viesti|$vastaus\n"; //kirjoitetaan rivi tiedostoon fwrite($tiedosto, $rivi); //suljetaan tiedosto fclose($tiedosto); //ohjataan käyttäjä vieraskirjasivulle header("Location: http://rantaminttu.net/hemppa/index2.php?sivu=vieraskirja/index.php"); } ?>
Lisäsin tuon ajan tallentamisen ja rivinvaihdot br -tagiksi.
Toimiiko?
Mulla ainakin toimii.
mulla toimii :) (siis nuo muokkaamasi jutut, ainoa mikä ei toimi on vielä tuo ohjaus pois tuolta sivulta... osoite on todellakin tuo mikä tuossa headerissa on, mutta se ei toimi)
https://www.php.net/manual/en/function.ob-start.php
"<?php" tagin jälkeen ennen mitään tulosteluita
<?php ob_start();?> <?php //jos nimeä ei ole annettu, näytetään lomake... if (!isset($_POST['nimi'])) { ?> <h1>Kirjoita viesti vieraskirjaan</h1> <p><a href="http://rantaminttu.net/hemppa/index2.php?sivu=vieraskirja/index.php"><- Takaisin</a></p> <form action="http://rantaminttu.net/hemppa/index2.php?sivu=vieraskirja/laheta.php" method="post"> <p><center><table class="lahetys"> <tr> <td class="lahetys1" valign="top"> Nimi:<br/> Sähköposti:<br /> Sivusi nimi:<br /> Sivusi URL:<br /> Viestisi:</td> <td class="lahetys2" valign="top"> <input type="text" name="nimi" class="loota" /> <br /> <input type="text" name="sposti" class="loota" /> <br /> <input type="text" name="sivu" class="loota" /> <br /> <input type="text" name="sivuURL" class="loota" /> <br /> <textarea name="viesti" class="loota2" rows="8" cols="35">Tämä on tekstikenttä</textarea><br /> <input name="vastaus" type="hidden" /><br /> <center><input type="submit" value="Lähetä" class="lahetanappi"></center></td></tr></table></center><br /> </form> <?php //...muussa tapauksessa kirjoitetaan viesti tiedostoon } else { //avataan tiedosto append-tilassa: kirjoitetaan tiedoston loppuun $tiedosto = fopen("vieraskirja/viestit.txt", "a"); //haetaan lomakkeen kautta tulleet muuttujat $nimi = $_POST['nimi']; $sposti = $_POST['sposti']; $sivu = $_POST['sivu']; $sivuURL = $_POST['sivuURL']; $viesti = $_POST['viesti']; // Muutetaan tekstikentän rivinvaihdot br -tagiksi $viesti = str_replace("\n", "<br>", $viesti); // Aika, jolloin viesti lähetetään $aika = date("H:i"); //muodostetaan tiedostoon tallennettava rivi $rivi = "$nimi|$sposti|$aika|$sivu|$sivuURL|$viesti|$vastaus\n"; //kirjoitetaan rivi tiedostoon fwrite($tiedosto, $rivi); //suljetaan tiedosto fclose($tiedosto); //ohjataan käyttäjä vieraskirjasivulle header("Location: http://rantaminttu.net/hemppa/index2.php?sivu=vieraskirja/index.php"); } ?> <?php ob_end_flush();?>
Toimiskos nyt?
EDIT: Huomasin että vieraskirjan tulostumisessa päivämäärän erottimena on kaksoispiste (:). Onko kyseessä virhe?
Jos laittaisit date-funktioon kaksoispisteen tilalle pisteen, niin tulisiko piste?
//Tulostaa esimerkiksi 18:10 $aika = date("H:i"); //Tulostaa esimerkiksi 18.10 $aika = date("H.i"); //Tulostaa esimerkiksi 18,10 $aika = date("H,i");
Tajusit varmaankin kunnolla nyt?
En kyllä tiedä, onko mitään järkeä tallentaa tiedostoon pelkästään aika (esim. 14:50) ilman päivää. Itse tallentaisin tiedostoon pelkästään aikaleiman funktiolla time()
, ja hoitaisin muotoilut tulostusvaiheessa. Näin muotoilujen vaihtaminen on helpompaa.
Nyt laitoin sinne päivämääränkin :D Kiitos kaikille auttajille <3! Enää pitäisi tuo uudelleenohjaus saada toimimaan...
apuja tuohon uudelleenohjaukseen?
Laita ihan kooditiedoston alkuun seuraavat rivit:
Kokeile tämän jälkeen, tuleeko sivulle jokin virheilmoitus, kun lähetät viestin.
lainaus:
Strict Standards: date() [function.date]: It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Helsinki' for 'EET/2.0/no DST' instead in /home/rantamin/public_html/hemppa/vieraskirja/laheta.php on line 49
Strict Standards: date() [function.date]: It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Helsinki' for 'EET/2.0/no DST' instead in /home/rantamin/public_html/hemppa/vieraskirja/laheta.php on line 49
Strict Standards: main() [function.main]: It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Helsinki' for 'EET/2.0/no DST' instead in /home/rantamin/public_html/hemppa/vieraskirja/laheta.php on line 52
Notice: Undefined variable: vastaus in /home/rantamin/public_html/hemppa/vieraskirja/laheta.php on line 52
Strict Standards: header() [function.header]: It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Helsinki' for 'EET/2.0/no DST' instead in /home/rantamin/public_html/hemppa/vieraskirja/laheta.php on line 61
Warning: Cannot modify header information - headers already sent by (output started at /home/rantamin/public_html/hemppa/index2.php:19) in /home/rantamin/public_html/hemppa/vieraskirja/laheta.php on line 61
ja koodihan on:
<?php ob_start();?> <?php ini_set("error_reporting", E_ALL | E_STRICT); ini_set("display_errors", 1); //jos nimeä ei ole annettu, näytetään lomake... if (!isset($_POST['nimi'])) { ?> <h1>Kirjoita viesti vieraskirjaan</h1> <p><a href="http://rantaminttu.net/hemppa/index2.php?sivu=vieraskirja/index.php"><- Takaisin</a></p> <form action="http://rantaminttu.net/hemppa/index2.php?sivu=vieraskirja/laheta.php" method="post"> <p><center><table class="lahetys"> <tr> <td class="lahetys1" valign="top"> Nimi:<br/> Sähköposti:<br /> Sivusi nimi:<br /> Sivusi URL:<br /> Viestisi:</td> <td class="lahetys2" valign="top"> <input type="text" name="nimi" class="loota" /> <br /> <input type="text" name="sposti" class="loota" /> <br /> <input type="text" name="sivu" class="loota" /> <br /> <input type="text" name="sivuURL" class="loota" /> <br /> <textarea name="viesti" class="loota2" rows="8" cols="35">Tämä on tekstikenttä</textarea><br /> <input name="vastaus" type="hidden" /><br /> <center><input type="submit" value="Lähetä" class="lahetanappi"></center></td></tr></table></center><br /> </form> <?php //...muussa tapauksessa kirjoitetaan viesti tiedostoon } else { //avataan tiedosto append-tilassa: kirjoitetaan tiedoston loppuun $tiedosto = fopen("vieraskirja/viestit.txt", "a"); //haetaan lomakkeen kautta tulleet muuttujat $nimi = $_POST['nimi']; $sposti = $_POST['sposti']; $sivu = $_POST['sivu']; $sivuURL = $_POST['sivuURL']; $viesti = $_POST['viesti']; // Muutetaan tekstikentän rivinvaihdot br -tagiksi $viesti = str_replace("\n", "<br>", $viesti); // Aika, jolloin viesti lähetetään $aika = date("H:i d.m.Y"); //muodostetaan tiedostoon tallennettava rivi $rivi = "$nimi|$sposti|$sivu|$sivuURL|$aika|$viesti|$vastaus\n"; //kirjoitetaan rivi tiedostoon fwrite($tiedosto, $rivi); //suljetaan tiedosto fclose($tiedosto); //ohjataan käyttäjä vieraskirjasivulle header("Location: http://rantaminttu.net/hemppa/index2.php?sivu=vieraskirja/index.php"); } ?> <?php ob_end_flush();?>
merlin kirjoitti:
Enää pitäisi tuo uudelleenohjaus saada toimimaan...
Vika on siinä, että tiedostossa on ennen headerien lähetystä jotain selaimelle lähetettävää tekstiä. Varmista, ettei ennen ob_start():ia mitään tekstiä, eikä edes byte order markia.
Ei siellä kyllä ole yhtikäs mitään, yllä koko koodi. Onkohan index.php tiedostossa jtn. häikkää?
<h1>Hempan tallin vieraskirja</h1> <p><center><table class="vieraskirja"> <?php //luetaan viestit taulukkoon $viestit = file("vieraskirja/viestit.txt"); //käännetään taulukko, jolloin uusimmat viestit tulevat ylimmiksi $viestit = array_reverse($viestit); //viestien määrä on suoraan taulukon rivien määrä $viestimaara = count($viestit); //tulostetaan viestimäärä echo "<p><a href=\"http://rantaminttu.net/hemppa/index2.php?sivu=vieraskirja/laheta.php\">Lähetä uusi viesti</a> | Yhteensä $viestimaara viestiä vieraskirjassa.</p><hr>"; //käydään jokainen viesti läpi for ($i = 0; $i < $viestimaara; $i++) { //$viestit[$i] on merkkijono, joka sisältää viestin $i tiedot //pystyviivoilla erotettuna; jaetaan viestit $tiedot-taulukkoon $tiedot = explode("|", $viestit[$i], 7); //erotellaan tiedot omiin muuttujiinsa $nimi = $tiedot[0]; $sposti = $tiedot[1]; $sivu = $tiedot[2]; $sivuURL = $tiedot[3]; $aika = $tiedot[4]; $viesti = $tiedot[5]; $vastaus = $tiedot[6]; //tulostetaan viesti echo "<tr><td class=\"viesti\"><p><b>Lähettäjä:</b> <a href=\"mailto:$sposti\">$nimi</a><br />"; echo "<b>Sivusto:</b> <a href=\"$sivuURL\">$sivu</a><br />"; echo "<i>$aika</i><br />"; echo "<b>Viesti:</b> $viesti</p> <p><i>$vastaus</i></p></td></tr>"; } ?> </table></center></p>
merlin kirjoitti:
Ei siellä kyllä ole yhtikäs mitään, yllä koko koodi.
Mikäs tuo rivinvaihto sitten on heti ob_start():n jälkeen?
Eli älä sulje php-tägiä, varsinkaan kun heti perään avaat ne uudelleen. Tulostat todennäköisesti selaimelle pelkän rivinvaihdon, jonka seurauksena otsaketietoja ei voida enää lähettää.
Jos ajat myös index.php:n ennen tätä koodia, niin siellähän sinulla oli jo useampi rivi html-koodia tulostettavana selaimelle.
<?php ob_start();?> <?php ini_set("error_reporting", E_ALL | E_STRICT); ini_set("display_errors", 1);
edit:
Lisäksi kannattaa opetella tekemään asiat niin, ettei monessa skriptissä olisi samoja "koodeja". Eli opettele pistämään lomake omaan php-skriptiinsä niin, että lomake tulostetaan ja käsitellään samassa skriptissä. Nythän ymmärtääkseni sinulla on sama lomake sekä index.php -tiedostossa, että index2.php -tiedostossa. Samalla kannattaa opetella nimeämään php-tiedostot myös selkeästi, mikä auttaa tietenkin sinua ymmärtämään jälkeenpäin pelkän tiedostonimen perusteella, mitä mikin php-tiedosto tekee, ja mikä auttaa myös hakukoneita ymmärtämään mitä kyseinen skripti tekee.
tuo index on siis vieraskirja/index.php ja index2.php on tuolla alakansiossa oma sivunsa, koska sinne on tulossa vielä tervetulosivu.
Ja siis miten tässä nyt pitää menetellä, näinkö? :
Mitä sivulle tulostuu, jos laitat tuonne alkuun näin:
<?php echo rawurlencode(substr(file_get_contents(__FILE__), 0, 3)), "\n";
Toivottu tulos: %3C%3Fp
Byte order mark on täysin näkymätön merkkisarja, joka tiedostoon tulee, jos sen tallentaa vääränlaisella tekstieditorilla UTF-8-muodossa (tai nimenomaan UTF-8 with BOM -muodossa).
Virheilmoitukset paljastavat lisäksi seuraavaa:
Haet tekstin muuttujaan $viesti mutta tallennat tiedostoon lisäksi muuttujan $vastaus, jota ei ole.
Aikafunktioita varten tiedoston alkuun (tai PHP:n asetuksiin) pitäisi lisätä aikavyöhyke:
date_default_timezone_set("Europe/Helsinki");
Lisäksi koodissasi on ns. XSS-aukko: koska olet poistanut oppaassa käytetyn htmlspecialchars-rivin, viestiin voi kirjoittaa sekaan HTML- ja JavaScript-koodia, jolla voi aiheuttaa sivuillesi ongelmia ja esimerkiksi varastaa käyttäjien tietoja.
Aihe on jo aika vanha, joten et voi enää vastata siihen.