Aloin tekemään Ohjelmointiputkan oppaan esimerkkivieraskirjan pohjalta omaa vieraskirjaa muokkaamalla sitä ja lisäämällä uusia ominaisuuksia. Lisäsin jo uusia kenttiä, muokkasin ulkoasua ja tietojen näyttämistä paljon. Monia tärkeitä ominaisuuksia en kuitenkaan osaa tehdä, ja niissä tarvitsisin teidän apuanne. Mitään valmista koodia ei tietenkän tarvitse välttämättä laittaa (vaikka hyötyä siitäkin olisi :), mutta edes vinkki siitä miten asia pitäisi hoitaa, olisi hyväksi. Itse tekemällähän sitä parhaiten oppii (ainakin villi huhu väittää näin). Kiitän kaikkia niitä, jotka viitsivät vastata edes yhteen kohtaan!
(Linkki Ohjelmointiputkan esimerkkivieraskirjaan: https://www.ohjelmointiputka.net/oppaat/opas.
1. Lähetetyn viestin ajan saaminen oli hoidettu Ohjelmointiputkan koodissa niin, että kun lomakkeen tiedot tallentava skripti suoritettiin, tallensi oheinen koodi ajan tiedostoon.
//otetaan talteen aika, jolloin viesti lähetettiin $aika = time();
Saako samalla menetelmällä tallennettua myös IP:n, eli laittamalla vaikkapa tuon edelläolevan koodin perään tällainen pätkä?
//otetaan talteen ip, josta viesti lähetettiin $ip = $_SERVER['REMOTE_ADDR'];
Otin toki tuossa huomioon sen, että lisäsin $ip-muuttujan tiedostoon tallennettavaan riviin, ja nayta.php-skriptiin.
Voisiko edelläolevat asiat hoitaa myös niin, että laittaa itse lomakkeeseen kaksi piilotettua kenttää, joidenka muuttujat sitten haettaisiin muiden lomakkeissa annettujen tietojen ohella?
2. Haluaisin tehdä aivan yksinkertaisen admin-osion, jossa on vain yksi iso tekstikenttä (textarea), jonka sisällä on sitten datatiedoston sisältö. Koska vain minä käyttäisin tuota admin-osiota, ei sen tarvitsisi olla sen kummempi, koska osaan muokata kyllä datatiedostoa siinä mielessä, että voin poistaa tai muokata viestiä. Eli jos vaikkapa vieraskirjassa olisi yksi viesti, voisi textarean sisällä olla tällainen teksti:
Matti Meikäläinen|minun@osoite.net|http://kotisivut.net|Onpas hienot sivut!
Ilmeisesti asia pitäisi hoitaa jotenkin niin, että <textarea>- ja </textarea>-tagien väliin laitettaisiin pieni PHP-skripti, joka avaa ja lukee tiedoston / avaa kirjoitettavaksi. Mutta miten tähän tiedostoon tehtävät muutokset saataisiin vielä tallennettua submit-nappia painamalla?
3. Haluaisin tehdä myös vastausmahdollisuuden vieraskirjaani. Ideoin asian niin, että uutta vieraskirjaviestiä lähetettäessä tallennetaan myös $vastaus-niminen muuttuja, joka on tyhjä. Sen jälkeen voisin muokata tuota tyhjää kohtaa admin-osiossa. Onnistuisinko oheisilla tavoilla?
<input type="hidden" name="vastaus" value="">
TAI
$vastaus = "";
Ylimmäinen kohta tulisi siis itse lomakkeeseen, ja alimmainen samaan kohtaan missä tallennetaan aikakin.
Value voisi olla myös vaikkapa "vastaustähän", jolloin laittaisin koodiin if-ehtolauseen, joka näyttää vastauksen vain jos sen arvona on jokin muu kuin "vastaustähän".
4. Miten voisin määritellä viestin ja sanojen maksimipituudet?
5. Miten sivutus pitäisi toteuttaa?
Kiitos!
lainaus:
4. Miten voisin määritellä viestin ja sanojen maksimipituudet?
Eilen oppimani substr_count():lla voi laskea sanojen määrän ja sen perusteella voi myös estää liian monen sanan kirjoittamisen tähän tapaan:
$sanoja = substr_count($viesti, " "); //laskee välilyöntien määrät $sanoja = $sanoja + 1; //välilyöntimäärä+1=sanamäärä if ($sanoja > $max) { print "Liian monta sanaa, koita uudelleen"; }
Muista sitten että jos joku kirjottaa viestiin esim "moi<hirmu paljon välilyöntejä>moi!" niin sanojen määrä kasvaa.. en jaksa ja/tai en osaa korjata :p
Paljon kätevämpi: str_word_count("Tässä on sanoja"); // Palauttaa 3.
Tarkoitin siis viestin maksimipituudella merkkien määrää viestissä, ja sanojen maksimipituudella merkkien määrää sanassa. Periaatteessa toimisi kyllä maksimisanamääräkin, ellei sitten joku keksisi kirjoittaa kaikkea yhteen pötköön :P
lainaus:
Saako samalla menetelmällä tallennettua myös IP:n, eli laittamalla vaikkapa tuon edelläolevan koodin perään tällainen pätkä?
Kyllä saa. Mutta tuo $_SERVER['REMOTE_ADDR'] ei sitten välttämättä ole se oikea IP-osoite. Hieman parempi funktio IP:n hakemiseen on Mureakuhasta löytynyt GetIP() funktio joka löytyy myös sivuiltani: http://www.saunalahti.fi/~trinit/tero_pietila/
lainaus:
Voisiko edelläolevat asiat hoitaa myös niin, että laittaa itse lomakkeeseen kaksi piilotettua kenttää, joidenka muuttujat sitten haettaisiin muiden lomakkeissa annettujen tietojen ohella?
Onnistuu ihan hyvin.
lainaus:
Ilmeisesti asia pitäisi hoitaa jotenkin niin, että <textarea>- ja </textarea>-tagien väliin laitettaisiin pieni PHP-skripti, joka avaa ja lukee tiedoston / avaa kirjoitettavaksi. Mutta miten tähän tiedostoon tehtävät muutokset saataisiin vielä tallennettua submit-nappia painamalla?
Yksinkertaisin tapa hoitaa tallennus on avata kyseinen viestitiedosto "w" muotoon joka tyhjää tiedoston ja sen jälkeen kirjoittaa koko <textarea>:n sisältö uudestaan tähän tiedostoon.
lainaus:
3. Haluaisin tehdä myös vastausmahdollisuuden vieraskirjaani. Ideoin asian niin, että uutta vieraskirjaviestiä lähetettäessä tallennetaan myös $vastaus-niminen muuttuja, joka on tyhjä. Sen jälkeen voisin muokata tuota tyhjää kohtaa admin-osiossa.
Onnistuuhan se noinkin, mutta eihän sitä vastausta sinne tarvitse tallentaa vastakuin admin osiossa vastaat viestiin. Vastaushan voisi olla viestitiedostossa aina viimeisenä osana:
Rivi ennen vastauksen tallennusta: Matti Meikäläinen|minun@osoite.net|http://kotisivut.net|Onpas hienot sivut! ja vastauksen jälkeen: Matti Meikäläinen|minun@osoite.net|http://kotisivut.net|Onpas hienot sivut!|Kiitos kommentistasi
Nyt kun viestitiedostoa luetaan - explodella varmaankin erottelet nuo kentät toisistaan - niin mikäli taulukon 4. solussa on jotain tekstiä niin vastaus näytetään viestin lisäksi. Eli tyyliin:
Kiitos monista vastauksista!
lainaus:
Yksinkertaisin tapa hoitaa tallennus on avata kyseinen viestitiedosto "w" muotoon joka tyhjää tiedoston ja sen jälkeen kirjoittaa koko <textarea>:n sisältö uudestaan tähän tiedostoon.
Öh, tajusinko ihan oikein? Textarean sisältö tyhjennettäisiin, ja sitten kirjoittaisin sen kokonaan uudestaan? Minun pitäisi siis aluksi kopioida wanha tiedosto teksturiin, tehdä siinä muutokset, ja kopioida ja liitää se textareaan?
Mitenkäs sen tallennuksen kanssa muuten?
ehdottaisin mktime() tyyppistä aikamuotoa ilman HIDDEN inputtien lisäämistä!
esim kun lisäys tehdään ja aloitetaan "tallennusoperaatio" määritetään: $aika = mktime(); sitten se lisätään sille riville, ja myöhemmin puretaan viestistä: date("j.n.Y - H:i:s", $aika_mktimena);
hmm... olet kyllä tehnyt todella oudosti nuo jutut... mutta ei se mitäänh...
lainaus:
Öh, tajusinko ihan oikein? Textarean sisältö tyhjennettäisiin, ja sitten kirjoittaisin sen kokonaan uudestaan? Minun pitäisi siis aluksi kopioida wanha tiedosto teksturiin, tehdä siinä muutokset, ja kopioida ja liitää se textareaan?
Ei textarean sisältöä vaan tiedostoton sisältö.
Etkös kertonut että koko tiedoston sisältö laitetaan textareaan jossa teet muutokset ja sen jälkeen tallennetaan? Silloin mielestäni helpoin tapa on lukea ensin viestitiedosto muistiin esim. file() funktiolla, lisätä tämä muistissa oleva teksti <textarea> ja </textarea> tagien väliin ja kun tallennat niin viestitiedosto vain avataan fopen:lla "w" muotoon ja sinne kirjoitetaan textarea:n sisältämä teksti
strlen-funktio palauttaa annetun muuttujan pituuden, jolloin voin laskea viestin pituuden. Mutta onko olemassa minkäänlaista muuttujaa, joka palauttaa muuttujan pisimmän sanan pituuden?
Ja onko vielä mitään ehdotuksia sivutuksen toteuttamiseen?
lainaus:
onko olemassa minkäänlaista muuttujaa, joka palauttaa muuttujan pisimmän sanan pituuden?
Ei taida olla mutta äkkiäkös sellaisen funktion itsekin tekee:
<?php function LaskePisinSana($mjono) { // Käyttö: // $pisin = LaskePisinSana("Tämä on esimerkki"); $sanat = explode(" ", $mjono); $pituus = 0; for ($i = 0; $i < count($sanat); $i++) { if (strlen($sanat[$i]) > $pituus) { $pituus = strlen($sanat[$i]); } } return $pituus; } ?>
Tämä funktio siis palauttaa pisimmän sanan merkkimäärän joka löytyy merkkijonosta $mjono. Sanaksi funktio tunnistaa sellaisen merkkijono joka on " " ja " " merkkien (välilyönti) välissä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.