Mulla on tommonen pätkä, jolla ois tarkotus muokata tekstitiedoston tiettyä riviä. Tosta saan sen ihan nätisti tietyn uutisen tohon muokattavaksi ja sillee, tosin en tiedä kyllä onko mikään fiksu tapa tuohon.
Vaivaa tuottaa lähinnä se, että miten kirjottelen nuo siihen tekstitiedostoon?
Teoriassa tiedän luultavasti miten teen ton, eli kaiketikin kirjotan tota muokattavaa viestiä edeltävät viestit uudestaan tiedostoon, sitten tämän muokattavan viestin niiden jälkeen ja lopuksi vielä ne loput viestit?
Mutta käytännössä en ole onnistunu tätä nyt jostain syystä tekemään, en oo onnistunu saamaan niitä tiettyjä rivejä kirjotettua. En oikeen tiiä miten löytäisin ne oikeet rivit?
Eli tähän tarttis pientä helppiä?
Niin ja kertokaa ihan suoraan, jos on tehty alkukin päin helvettiä. :)
<?php $lines = file('uutiset.txt'); $edit_line = $_GET['edit_line']; $count = sizeof($lines); for ($i=0; $i<$count; $i++){ if ($i == $edit_line){ $tiedot = explode("|", $lines[$i], 4); $otsikko = $tiedot[0]; $laji = $tiedot[1]; $aika = $tiedot[2]; $uutinen = $tiedot[3]; } } echo $edit_line; $uutinen = str_replace("<br />", "", $uutinen); echo "<form action=\"muok.php\" method=\"post\">"; echo "<em class=\"nimitys\">Otsikko:</em><br />"; echo "<input type=\"text\" name=\"otsikko\" size=\"65\" value=\"$otsikko\"><br />"; echo "<em class=\"nimitys\">Uutinen:</em><br />"; echo "<textarea name=\"uutinen\" rows=\"9\" cols=\"60\">$uutinen</textarea><br/>"; echo "<em class=\"nimitys\">Tyyppi:</em><br />"; echo "<input type=\"radio\" name=\"laji\" value=\"tiedote\"> Tiedote"; echo "<input type=\"radio\" name=\"laji\" value=\"paivitys\"> Päivitys"; echo "<input type=\"radio\" name=\"laji\" value=\"korjaus\"> Korjaus"; echo "<input type=\"radio\" name=\"laji\" value=\"huomio\"> Huomio"; echo "<input type=\"radio\" name=\"laji\" value=\"uutinen\" checked> Uutinen<br/><br/>"; echo "<input type=\"submit\" value=\"Lähetä\"><input type=\"reset\" value=\"Tyhjennä\">"; echo "</form>"; // kirjotetaan muokattavaa riviä ($edit_line) edeltävät rivit // kirjotetaan muokattu rivi // kirjotetaan loput rivit ?>
Meniskö ihan tällein? Koodi on rumaa, mutta koita kestää.
<?php <?php if(isset($_POST['otsikko'])){ $rivit = file("file.txt"); $rivi = $_POST['rivi']; $otsikko = $_POST['otsikko']; $laji = $_POST['laji']; $aika = time(); $uutinen = $_POST['uutinen']; $muokattava = $otsikko."|".$laji."|".$aika."|".$uutinen."\n"; $rivit[$rivi] = $muokattava; file_put_contents("file.txt", implode(" ", $rivit)); } $lines = file('file.txt'); $edit_line = $_GET['edit_line']; $tiedot = explode("|", $lines[$edit_line]); $otsikko = $tiedot[0]; $laji = $tiedot[1]; $aika = $tiedot[2]; $uutinen = $tiedot[3]; echo "<form action=\"\" method=\"post\">"; echo "<em class=\"nimitys\">Otsikko:</em><br />"; echo "<input type=\"text\" name=\"otsikko\" size=\"65\" value=\"$otsikko\"><br />"; echo "<em class=\"nimitys\">Uutinen:</em><br />"; echo "<textarea name=\"uutinen\" rows=\"9\" cols=\"60\">$uutinen</textarea><br/>"; echo "<em class=\"nimitys\">Tyyppi:</em><br />"; echo "<input type=\"radio\" name=\"laji\" value=\"tiedote\"> Tiedote"; echo "<input type=\"radio\" name=\"laji\" value=\"paivitys\"> Päivitys"; echo "<input type=\"radio\" name=\"laji\" value=\"korjaus\"> Korjaus"; echo "<input type=\"radio\" name=\"laji\" value=\"huomio\"> Huomio"; echo "<input type=\"radio\" name=\"laji\" value=\"uutinen\" checked> Uutinen<br/><br/>"; echo "<input type=\"submit\" value=\"Lähetä\"><input type=\"reset\" value=\"Tyhjennä\">"; echo "<input name=\"rivi\" type=\"hidden\" value=\"".$edit_line."\" />"; echo "</form>"; ?>
Muuten näyttäisi toimivan jotenkin, mutta välillä ohjelma lisää tyhjän rivin edeltävän muokatun perään. Tarkemmin, jos sitä uutista ei muokkaa lainkaan vaan muokkaa esim. otsikkoa niin tällöin tulee tyhjä rivi väliin.
EDIT:
Unohda toi. Oma mokani, kun unohdin noi säätää noitten rivinvaihtojen kanssa.
Ainoo ongelma on se, että en tiiä mihin sijoittaisin ton toiselle sivulle ohjaamisen niin et se toimis?
Toinenkin pikku kysymys jäi vielä. Miten saan sen viestin luonti päivämäärän pysymään tuossa? Kun tällä hetkellä se ottaa tietenkin sen muokkauksen aikaleiman ja käyttää sitä, mutta haluaisin käyttää sitä akuperäistä aikaleimaa, jotta tiedän koska viesti on oikeasti luotu.
Tommosta antaa jos laittaa sen vanhan suoraan siihen:
Warning: date() expects parameter 2 to be long, string given
Kokeile muuttaa date():n toinen parametri luvuksi: date(..., intval(...)).
Tuossa rivipohjaisessa tallennusmenetelmässähän on sellainen pieni aukko, että käyttäjä voi lähettää tarkoituksella tai (selaimen salliessa) vahingossa uutisen, jossa on rivinvaihtoja. Kannattanee siis tarkistaa, ettei tallennettavassa rivissä ole rivinvaihtoja.
Hmmmm... intvalin kanssa ei tule enää virheilmoitusta, mutta päivämäärä ei ole kuitenkaan oikea. (01.01.1970 02:00)
En tiedä, missä muodossa se toinen parametri sitten on, mutta ehkäpä strtotime() tunnistaa sen. Siis: date(..., strtotime(...))
strtotime() tunnistaa ainakin muotoa "vuosi-kuukausi-päivä tunti:minuutti" olevat ajat.
Sekään ei näytä toimivan. Tällä kertaa heittää jokaiseen jonkun tuommoisen ja jokaisesssa päivämäärä ja kellonaika ovat samat, mutta vuosi vaihtuu (10.09.8518 12:52). Ja muokkauksen jälkeen tulee taas se sama 01.01.1970...
Kuitenkin sen aikaleiman saa ihan nätisti tulostettua ja vaikka mitä, mutta ei se sitten kelpaa tolle date() -funktiolle.
Tossa on aikaleima tulostettuna.
1252438518
Onko tekstissä ylimääräisiä välejä tms. alussa tai lopussa? Auttaisiko trim?
Eipä auta. :/
Alla oleva koodi on pitkähkö, mutta toimivaksi todettu. Samalla hiukan eroteltu html ja php toisistaan. Lomake on tehty lomakeluokan avulla.
<?php <?php require("Clomake.php"); $sivu = new DOMDocument("1.0", "UTF-8"); $sivu->formatOutput = true; $html = $sivu->createElement("html"); $sivu->appendChild($html); $head = $sivu->createElement("head"); $html->appendChild($head); $title = $sivu->createElement("title", "Rvin muokkausta"); $head->appendChild($title); $body = $sivu->createElement("body"); $html->appendChild($body); $con = $sivu->createElement("div"); $con->setAttribute("id", "content"); $body->appendChild($con); $h1 = $sivu->createElement("h1", "Tiedoston rivin muokkaus"); $con->appendChild($h1); if(isset($_GET['rivi'])){ $rivi = $_GET['rivi']; $rivit = file("file.txt"); $tiedot = explode("|", $rivit[$rivi]); $otsikko = $tiedot[0]; $laji = $tiedot[1]; $aika = $tiedot[2]; $uutinen = $tiedot[3]; try{ $asetukset = new Clomake($sivu, "index.php?rivi=$rivi", 'post'); /** * Lajit */ $lajit = array(); $lajit[] = new CmultipleElement("Päivitys", 0); $lajit[] = new CmultipleElement("Korjaus", 1); $lajit[] = new CmultipleElement("Huomio", 2); $lajit[] = new CmultipleElement("Uutinen", 3); /** * Varsinaiset elementtioliot */ $teksti = array(); $teksti[] = new Ctext("Otsikko", true, $otsikko, ""); $teksti[] = new Ctext("Aika", true, $aika, "Älä muuta!"); $teksti[] = new Cradio("Laji", $lajit, "Valinta", 3); $teksti[] = new Ctextarea("Uutinen", $uutinen, 60, 15, true); $teksti[] = new Chidden("lahetys", 1); $teksti[] = new Chidden("rivi", $rivi); /** * Lisätään elementit lomakkeelle */ if(isset($_POST['Otsikko'])){ $kentat = array(); if($asetukset->lisaaElementit($teksti, true)){ foreach($_POST AS $kentta => $arvo){ $kentat[$kentta] = $arvo; } $rivi = $_POST['rivi']; $rivit = file("file.txt"); $muokattava = $kentat['Otsikko'] . "|" . $kentat['Laji'] . "|" . $kentat['Aika'] . "|" . $kentat['Uutinen'] . "\n"; $rivit[$rivi] = $muokattava; file_put_contents("file.txt", implode(" ", $rivit)); }else{ /* Kentissä on jotakin vialla */ } }else{ $asetukset->lisaaElementit($teksti); } /** * Lisätään lomake sisältöön (eka div-elementti) */ $sivu->getElementsByTagName('div') ->item(0) ->appendChild($asetukset->haeElementti()); /** * Napataan mahdollinen poikkeus (try lohko) */ }catch(Exception $e){ $polku = $e->getFile(); $tiedosto = explode("\\", $polku); $tiedosto = $tiedosto[count($tiedosto)-1]; $viesti = $e->getMessage(); $rivi = $e->getLine(); $kpl = $sivu->createElement('p', "$viesti $tiedosto $rivi"); $con->appendChild($kpl); } }else{ $kpl = $sivu->createElement("p", "Et ole valinnut mitään riviä editoivaksi!"); $con->appendChild($kpl); } echo $sivu->saveXML(); ?>
En nyt millään jaksais alkaa kikkailemaan koko hommaa uudestaan, ku totakin saa taas vääntää viikon ennen ku siin on kaikki tarvittava. Enkä ole mitenkään suuremmin innostunut html:n ja php:n erottamisesta, kunhan nyt koitan jottain purkkaa vääntää. Menee liian hienoks...
Mul on tos ihan kiva koodinpätkä ja joku vois vaan kertoo minkä takia toi $tiedot[2] häviää tolla matkalla johonkin ennen kun se ehtii tekstitiedostoon?
<?php echo $tiedot[2]; echo "<br />"; echo date("d.m.Y H:i", $tiedot[2]); if(isset($_POST['otsikko'])){ $rivit = file("uutiset.txt"); $rivi = $_POST['rivi']; $otsikko = $_POST['otsikko']; $laji = $_POST['laji']; $tiedot[2] = $_POST['tiedot[2]']; $uutinen = $_POST['uutinen']; $uutinen = stripslashes($uutinen); $uutinen = str_replace("\n", "<br />", $uutinen); $uutinen = str_replace(":)", "<img src=\"kuvat/smile.png\" />", $uutinen); $uutinen = str_replace(":(", "<img src=\"kuvat/sad.png\" />", $uutinen); $uutinen = str_replace(":D", "<img src=\"kuvat/hah.png\" />", $uutinen); $uutinen = str_replace(":P", "<img src=\"kuvat/tongue.png\" />", $uutinen); $uutinen = str_replace(":G", "<img src=\"kuvat/angry.png\" />", $uutinen); $uutinen = str_replace(";)", "<img src=\"kuvat/wink.png\" />", $uutinen); $uutinen = str_replace(":?", "<img src=\"kuvat/think.png\" />", $uutinen); $uutinen = str_replace("8)", "<img src=\"kuvat/cool.png\" />", $uutinen); $muokattava = $otsikko."|".$laji."|".$tiedot[2]."|".$uutinen."\n"; $rivit[$rivi] = $muokattava; file_put_contents("uutiset.txt", implode("", $rivit)); } ?>
Niksu kirjoitti:
$tiedot[2] = $_POST['tiedot[2]']
Siinäpä se. Jos kentän nimi on tiedot[2], oikea tapa hakea se on $_POST['tiedot'][2].
Kannattaa muistaa, että rivinvaihtona on usein \r\n ja joskus myös pelkkä \r. Siksi kannattaa muuttaa ensin \r\n => \n ja \r => \n ja vasta näiden jälkeen \n => <br/>. Lisäksi sinun pitäisi muuttaa myös pystyviivat johonkin toiseen muotoon, jottei niitä luettaessa tulkita väärin.
Tarkista seuraavan rivin oikeellisuus:
Niksu kirjoitti:
<?php $tiedot[2] = $_POST['tiedot[2]']; ?>
Tai tee näin:
$tiedot[2] = $_POST['tiedot'][2];
Tuo ei kyllä muuttanut mitään? Edelleenkään tuo ei pääse tiedostoon asti.
Warning: date() expects parameter 2 to be long, string given
Tutkipa nyt jollain kunnon välineellä, mitä muuttujassa oikeasti on. Laita tänne arvo, jonka saat funktiolta urlencode, json_encode tai base64_encode, niin selvitetään, mitä mättää.
Ihan normaalisti echolla saan nuo:
echo $tiedot[2]; //1229348631 echo "<br />"; echo date("d.m.Y H:i", $tiedot[2]); //15.12.2008 15:43
Koitan mitä joku noista funktioista sanoo kunhan saan ensin äkkiä ruokaa.
Älä tuosta sitä katso vaan siitä, mitä saat luettua tiedostosta.
Tiedostoon ei tule mitään siihen kohtaan mihin tuon pitäisi tulla.
Käsitin, että sinne olisi tullut jotenkin virheellinen teksti, kun olet niin kovasti tuota date-funktion virheilmoitusta korostanut. Laitapa sitten var_dump($_POST) tai json_encode($_POST).
otsikko|laji||uutinen
Tollee käy tosiaan.
var_dump($_POST)
sanoo tollasta kai?
array(4) { ["otsikko"]=> string(7) "Sivutus" ["uutinen"]=> string(155) "Uutisiin on nyt lisätty sivutus. Yhdelle sivulle mahtuu vain 3 uusinta uutista. Näin uutisten selaaminen helpottuu, kun ei tarvitse rullata ylös ja alas. " ["laji"]=> string(8) "paivitys" ["rivi"]=> string(2) "10" }
En jaksa uskoa, että näin yksinkertasen asian kanssa voi olla näin paljon ongelmia. Luulen, et oon nyt vaan kämmänny jotain yksinkertasta.
No eihän tuolla ole lainkaan kohtaa tiedot[2]. Ei ihme, ettei toimi. Mistä tuon aikatiedon pitäisi tulla? Mistä olet sen tuohon debuggaukseesi hankkinut?
Missä ihmeessä tässä sitten mättää ?
<?php $lines = file('uutiset.txt'); $edit_line = $_GET['edit_line']; $tiedot = explode("|", $lines[$edit_line]); $otsikko = $tiedot[0]; $laji = $tiedot[1]; $aika = $tiedot[2]; $uutinen = $tiedot[3]; $uutinen = str_replace("<br />", "", $uutinen); $uutinen = str_replace("<img src=\"kuvat/smile.png\" />", ":)", $uutinen); $uutinen = str_replace("<img src=\"kuvat/sad.png\" />", ":(", $uutinen); $uutinen = str_replace("<img src=\"kuvat/hah.png\" />", ":D", $uutinen); $uutinen = str_replace("<img src=\"kuvat/tongue.png\" />", ":P", $uutinen); $uutinen = str_replace("<img src=\"kuvat/angry.png\" />", ":G", $uutinen); $uutinen = str_replace("<img src=\"kuvat/wink.png\" />", ";)", $uutinen); $uutinen = str_replace("<img src=\"kuvat/think.png\" />", ":?", $uutinen); $uutinen = str_replace("<img src=\"kuvat/cool.png\" />", "8)", $uutinen); echo "<form action=\"edit.php\" method=\"post\">"; echo "<em class=\"nimitys\">Otsikko:</em><br />"; echo "<input type=\"text\" name=\"otsikko\" size=\"65\" value=\"$otsikko\"><br />"; echo "<em class=\"nimitys\">Uutinen:</em><br />"; echo "<textarea name=\"uutinen\" rows=\"9\" cols=\"60\">$uutinen</textarea><br/>"; echo "<em class=\"nimitys\">Tyyppi:</em><br />"; if ($laji == "tiedote") { echo "<input type=\"radio\" name=\"laji\" value=\"tiedote\" checked> Tiedote"; } else { echo "<input type=\"radio\" name=\"laji\" value=\"tiedote\"> Tiedote"; } if ($laji == "paivitys") { echo "<input type=\"radio\" name=\"laji\" value=\"paivitys\" checked> Päivitys"; } else { echo "<input type=\"radio\" name=\"laji\" value=\"paivitys\"> Päivitys"; } if ($laji == "korjaus") { echo "<input type=\"radio\" name=\"laji\" value=\"korjaus\" checked> Korjaus"; } else { echo "<input type=\"radio\" name=\"laji\" value=\"korjaus\"> Korjaus"; } if ($laji == "huomio") { echo "<input type=\"radio\" name=\"laji\" value=\"huomio\" checked> Huomio"; } else { echo "<input type=\"radio\" name=\"laji\" value=\"huomio\"> Huomio"; } if ($laji == "uutinen") { echo "<input type=\"radio\" name=\"laji\" value=\"uutinen\" checked> Uutinen<br/><br/>"; } else { echo "<input type=\"radio\" name=\"laji\" value=\"uutinen\"> Uutinen<br/><br/>"; } echo "<input type=\"submit\" value=\"Lähetä\"><input type=\"reset\" value=\"Tyhjennä\">"; echo "<input name=\"rivi\" type=\"hidden\" value=\"".$edit_line."\" />"; echo "</form>"; echo $tiedot[2]; echo "<br />"; echo date("d.m.Y H:i", $tiedot[2]); if(isset($_POST['otsikko'])){ var_dump($_POST); $rivit = file("uutiset.txt"); $rivi = $_POST['rivi']; $otsikko = $_POST['otsikko']; $laji = $_POST['laji']; $tiedot[2] = $_POST['tiedot'][2]; $uutinen = $_POST['uutinen']; $uutinen = stripslashes($uutinen); $uutinen = str_replace("\n", "<br />", $uutinen); $uutinen = str_replace(":)", "<img src=\"kuvat/smile.png\" />", $uutinen); $uutinen = str_replace(":(", "<img src=\"kuvat/sad.png\" />", $uutinen); $uutinen = str_replace(":D", "<img src=\"kuvat/hah.png\" />", $uutinen); $uutinen = str_replace(":P", "<img src=\"kuvat/tongue.png\" />", $uutinen); $uutinen = str_replace(":G", "<img src=\"kuvat/angry.png\" />", $uutinen); $uutinen = str_replace(";)", "<img src=\"kuvat/wink.png\" />", $uutinen); $uutinen = str_replace(":?", "<img src=\"kuvat/think.png\" />", $uutinen); $uutinen = str_replace("8)", "<img src=\"kuvat/cool.png\" />", $uutinen); $muokattava = $otsikko."|".$laji."|".$tiedot[2]."|".$uutinen."\n"; $rivit[$rivi] = $muokattava; file_put_contents("uutiset.txt", implode("", $rivit)); } ?>
Usko jo: et lähetä POSTilla kenttää niemeltä tiedot, joten et voi hakea sitä $_POST-taulukosta. Luultavasti sinun pitäisi tuossa POST-käsittelyssäsi hakea se tiedostosta, kuten teet koodin alussakin.
Sori, sori. Nyt sytytti. :D Se oli hyvinkin yksinkertasesta asiasta tosiaan kiinni. Kiitän kärsivällisyydestä. :)
Aihe on jo aika vanha, joten et voi enää vastata siihen.