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:
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.
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ä!
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); ?>
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"); ?>
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!
Aihe on jo aika vanha, joten et voi enää vastata siihen.