Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Lomakkeilla tekstitiedoston rivien muokkaus

kekke [11.05.2010 15:49:52]

#

Tervehdys,

Tavoitteena olisi muuttaa tekstitiedoston rivejä tuomalla rivit omiin lomakekenttiinsä, tehdä muutokset ja tallentaa uusi sisältö vanhan päälle.

Ongelmana on kuitenkin uuden sisällön kirjoitus. Kenttien nimeksi olen antanut rivi+rivinumeron ja kenttään haetaan arvona kyseinen rivi.
Olen samaa periaatetta käyttänyt tallennuksessa(suorita.php), mutta tuntuu menevän aika kikkailuksi, tällä hetkellä jätin tuon kirjoituksen pois, jonka sijaan näytetään $_POST:lla vastaanotettu sisältö.

Lähestymistapani asiaan tuntuu menevän hieman metsään, niin voisiko joku vihjaista miten tuon toiminnan saisi fiksummaksi?

Lisäksi tuo alla-oleva kokoonpano tuo mukaan ylimääräisen tyhjän rivin, teksti.txt-tiedostossa ei ole tyhjiä rivejä.

Koitin jo hakea putkasta ja googlen kautta ongelmaan ratkaisua, mutta ei auennut...


teksti.txt:

rivin 0 sisältö
rivin 1 sisältö
rivin 2 sisältö
rivin 3 sisältö
rivin 4 sisältö


muokkaus.php:

<?php
$tiedosto = file("teksti.txt");

echo '<form action="suorita.php" method="post" />';

$rivit = count($tiedosto);
if ($rivit != 0){
   for($i=$rivit; $i >= 0; $i--){

		echo "<input type=\"text\" name=\"rivi$i\" value=\"$tiedosto[$i]\"/><br />";
   }
}
		echo '<input type="submit" value="lähetä">';
		echo '</form>';

?>

suorita.php:

<?php
$tiedosto = file("teksti.txt");

$rivit = count($tiedosto);
if ($rivit != 0){
   for($i=$rivit; $i >= 0; $i--){

$sisalto = $_POST[rivi . $i];


   echo "$sisalto<br />";


   }

}
?>

Othnos [11.05.2010 17:20:55]

#

Hei kekke.

kekke kirjoitti:

Lisäksi tuo alla-oleva kokoonpano tuo mukaan ylimääräisen tyhjän rivin, teksti.txt-tiedostossa ei ole tyhjiä rivejä.

Lasket koodissasi rivimäärän 1-5, mutta PHP käsittelee kyseiset rivit riveinä 0-4. Jos haluat tulostaa rivit yllämainitulla tavalla tulee $i alustaa $rivit - 1.

Kannattaa lukea ohjelmointiputkan PHP-oppaan Osa 4 ja Osa 5 joissa kerrotaan lomakkeiden lähettelystä, käsittelystä sekä tiedostojen käsittelystä.

En ole aikaisemmin käsitellyt tiedostoja PHP:llä, mutta sain seuraavanlaisen koodin väännettyä PHP-oppaan Osa 5 avulla, joka saattaa vastata tarkoitustasi.

//suorita.php

<?php
//Avataan tiedosto teksti.txt kirjoitettavaksi
$tiedosto = fopen("teksti.txt", "w");

//Haetaan rivit-muuttujaan rivimäärä
$rivit = $_POST['rivit'];

//Kirjoitetaan silmukassa rivit tiedostoon
for($i = 0; $i < $rivit; $i++)
{
	fwrite($tiedosto, $_POST['rivi'.$i]."\n");
}

//Suljetaan tiedosto
fclose($tiedosto);

//Palataan muokkaus.php-sivulle
header("location: muokkaus.php");
?>

Käyttääksesi ylläolevaa koodia sinun täytyy lisätä myös muokkaus.php:hen $rivit = count($tiedosto); jälkeen

echo "<input type=\"hidden\" name=\"rivit\" value=\"$rivit\" />";

-koodi, että saat rivimäärän välitetyksi myös suorita.php:lle.

kekke [11.05.2010 22:33:17]

#

Kiitoksia Othnos!

Nyt kävi toimimaan, seuraavaksi sitten tekemään rivin sisällöstä taulukoita, eiköhän tämä tästä lähde.

Kiitoksia vielä!

kekke [27.05.2010 13:09:04]

#

Olen hieman jalostanut aiempaa koodia, tavoitteena olisi saada aikaan ajankohtaista-palstan muokkaus, jossa voi muokata otsikkoa, tekstiä ja halutessaan poistaa nämä.

Ongelmana on tuo poistaminen, poistaminen siis toimisi niin, että ruksataan haluttu checkbox(poista) jolloin kyseisen kohdan tietoja ei kirjoiteta tiedostoon. Tämä nyt jollain tavalla näyttää toimimisen merkkejä eli valittu sisältö ei tule näkyviin, mutta osa valitsemattomista toistuvat useampaan kertaan. Olen muutamia vaihtoehtoja kokeillut, mutta ei lähde toimimaan, apua vaille taas...
Olen nyt testannut tuota echo:n avulla eli sen takia nuo tiedostoon kirjoittamiset ovat pois käytöstä.

Toinen asia mikä mieltä askarruttaa on tietojen kääntäminen päinvastaiseen järjestykseen. Tällähän näytettävä sisältö kääntyy ok:
$tiedosto = array_reverse(file("../suojattu/tekstit/ajankohtaista.txt"));
Tässä taas tulee ongelmaksi, että miten saan käännettyä $rivi päinvastaiseen järjestykseen, jotta kirjoittaminenkin menisi oikessa järjestyksessä?


muokkaa.php ("form action" ja "submit" ovat php-koodin ulkopuolella)

<?php

$tiedosto = file("ajankohtaista.txt");

$rivit = count($tiedosto);
echo "<input type=\"hidden\" name=\"rivit\" value=\"$rivit\" />";

foreach ($tiedosto as $rivi => $arvo){

$kentta = explode("|", $arvo);

$aika = $kentta[0];
$otsikko = $kentta[1];
$teksti = $kentta[2];
$teksti = str_replace("\n","",$teksti);
$teksti = str_replace("<br />", "\r", $teksti);
$poista = $kentta[3];
$pvm = date("d.m.y H:i", $aika);

echo ('

rivinumero '.$rivi.'<br />

'.$pvm.'<br />

<input type="hidden" name="aika'.$rivi.'" value="'.$aika.'" />

<input type="text" name="otsikko'.$rivi.'" value="'.$otsikko.'" />

<textarea rows="5" cols="24" name="teksti'.$rivi.'">'.$teksti.'</textarea>

<input type="checkbox" name="poista'.$rivi.'" value="valittu" />Poista<br />
<hr>

');

}

?>

suorita.php

<?php


//$tiedosto = fopen("ajankohtaista.txt", "w");


$rivit = $_POST['rivit'];




for($i = 0; $i < $rivit; $i++) {

$aika = $_POST['aika'.$i];
$otsikko = $_POST['otsikko'.$i];
$teksti = $_POST['teksti'.$i];


$teksti = stripslashes($teksti);
$teksti = htmlspecialchars($teksti);
$teksti = str_replace("\n\n", "<br />", $teksti);
$teksti = str_replace("\n", "<br />", $teksti);
$teksti = str_replace("\r", "", $teksti);
$teksti = str_replace("|", " ", $teksti);


if (isset($_POST['poista'.$i]) != "valittu")
$rivi = "$aika|$otsikko|$teksti\n";
echo $rivi;

//fwrite($tiedosto, $rivi);
}

//fclose($tiedosto);


?>

Othnos [29.05.2010 22:49:11]

#

Tervehdys kekke.

Onko tarkoituksesi poistaa rivi kokonaan tiedostosta vai estää vain tulostus?

Voithan järjestää tiedoston sort()- tai rsort()-funktiolla ja tallentaa sitten kyseiseen järjestykseen, jos tarkoituksesi on järjestää rivit esim. tuon ajan mukaan.

Tuossa suorita.php:ssähän voit myös käyttää kyseistä foreach-funktiota jolloin rivimäärän lähetys jää turhaksi.

Muokkasin hieman koodinpätkääsi, josta näet mitä hain takaa.

muokkaa.php

<?php
$tiedosto = file("ajankohtaista.txt");
//Järjestetään tulostettavat tiedot ajan mukaan uusimmasta vanhimpaan
rsort($tiedosto);

foreach ($tiedosto as $rivi => $arvo)
{
	$kentta = explode("|", $arvo);

	$aika = $kentta[0];
	$otsikko = $kentta[1];
	$teksti = $kentta[2];
	$teksti = str_replace("\n","",$teksti);
	$teksti = str_replace("<br />","\r\n",$teksti);
	$pvm = date("d.m.y H:i", $aika);
?>

	rivinumero <?php echo $rivi; ?><br />

	<?php echo $pvm; ?><br />

	<input type="hidden" name="aika[<?php echo $rivi; ?>]" value="<?php echo $aika; ?>" />

	<input type="text" name="otsikko[<?php echo $rivi; ?>]" value="<?php echo $otsikko; ?>" />

	<textarea rows="5" cols="24" name="teksti[<?php echo $rivi; ?>]"><?php echo $teksti; ?></textarea>

	<input type="checkbox" name="poista[<?php echo $rivi; ?>]" value="valittu" />Poista<br />

	<hr>

<?php
}
?>

suorita.php

<?php
$tiedosto = fopen("ajankohtaista.txt", "w");

foreach($_POST['aika'] as $key => $aika)
{
	if(empty($_POST['poista'][$key]))
	{
		$otsikko = $_POST['otsikko'][$key];
		$teksti = $_POST['teksti'][$key];

		$teksti = stripslashes($teksti);
		$teksti = htmlspecialchars($teksti);
		$teksti = str_replace("\r\n", "<br />", $teksti);
		$teksti = str_replace("\n", "", $teksti);
		$teksti = str_replace("\r", "", $teksti);
		$teksti = str_replace("|", " ", $teksti);

		$rivi = "$aika|$otsikko|$teksti|\r\n";

		fwrite($tiedosto, $rivi);
	}
}

fclose($tiedosto);

//Palataan muokkaa.php-tiedostoon
header("Location: muokkaa.php");
?>

kekke [01.06.2010 22:04:18]

#

Kiitoksia jälleen vastauksestasi Othnos!

Jep, tarkoituksenani on poistaa kokonaan rivi tiedostosta siis käytännössä jättää valittu rivi kirjoittamatta.

Tuo sort:n käyttäminen oli hyvä vinkki, sillä tuo järjestely hoituu hyvin. Myös tuo rivin poisto menetelmälläsi toimi hyvin.

Kiitos paljon avustasi!

Vastaus

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

Tietoa sivustosta