Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Tekstitiedoston rivin muokkaus

Sivun loppuun

Niksu [08.09.2009 19:59:37]

#

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

?>

Teuro [08.09.2009 20:30:23]

#

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>";
?>

Niksu [08.09.2009 21:13:42]

#

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?

Niksu [09.09.2009 23:29:36]

#

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

map_ [09.09.2009 23:56:33]

#

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.

Niksu [10.09.2009 00:05:12]

#

Hmmmm... intvalin kanssa ei tule enää virheilmoitusta, mutta päivämäärä ei ole kuitenkaan oikea. (01.01.1970 02:00)

map_ [10.09.2009 02:24:14]

#

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.

Niksu [10.09.2009 09:27:13]

#

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

Metabolix [10.09.2009 10:37:08]

#

Onko tekstissä ylimääräisiä välejä tms. alussa tai lopussa? Auttaisiko trim?

Niksu [10.09.2009 14:42:06]

#

Eipä auta. :/

Teuro [10.09.2009 18:54:37]

#

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();
?>

Niksu [10.09.2009 19:54:35]

#

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));


}
?>

Metabolix [10.09.2009 19:58:07]

#

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.

Teuro [10.09.2009 20:01:27]

#

Tarkista seuraavan rivin oikeellisuus:

Niksu kirjoitti:

<?php
$tiedot[2] = $_POST['tiedot[2]'];
?>

Tai tee näin:

<?php
if(isset($_POST['otsikko'])){
var_dump($_POST);
}

Niksu [10.09.2009 20:07:05]

#

$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

Metabolix [10.09.2009 20:20:52]

#

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ää.

Niksu [10.09.2009 20:24:37]

#

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.

Metabolix [10.09.2009 20:31:41]

#

Älä tuosta sitä katso vaan siitä, mitä saat luettua tiedostosta.

Niksu [10.09.2009 20:36:24]

#

Tiedostoon ei tule mitään siihen kohtaan mihin tuon pitäisi tulla.

Metabolix [10.09.2009 20:43:13]

#

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).

Niksu [10.09.2009 20:51:15]

#

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.

Metabolix [10.09.2009 21:01:20]

#

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?

Niksu [10.09.2009 21:02:39]

#

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));


}

?>

Metabolix [10.09.2009 21:23:57]

#

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.

Niksu [10.09.2009 21:26:43]

#

Sori, sori. Nyt sytytti. :D Se oli hyvinkin yksinkertasesta asiasta tosiaan kiinni. Kiitän kärsivällisyydestä. :)


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta