<?php// Jos halutaan käsitellä viestejä elseif($_GET["v"] == 'vastaa' || $_GET["v"] == 'poista'){ global $tiedostonosoite; tarkista_tiedosto(); $filukka = @file($tiedostonosoite); $viestit = @fopen($tiedostonosoite, "r+"); $vid = $_GET["i"]; ylapala(); // Jos halutaan vastata viestiin if($_GET["v"] == 'vastaa'){ if(!isset($_POST["vastaus"])){ ?> <h2>Vastaa viestiin</h2> <form action="<?php echo($htomansivunosoite.'a=admin&v=vastaa&i='.$vid); ?>" method="post" name="vastaa" id="vastaa"> <textarea rows="5" style="width:450px;" name="vastaus" id="vastaus"></textarea><br /> <input type="submit" value="Vastaa" /> </form> <?php } else{ // Luodaan taulukko viesteille $valiaikainen = array(); // Käydään viestit silmukassa läpi for($las = 0; $las < sizeof($filukka); $las++){ $cviesti = $filukka[$las]; list($dnimi, $dmaili, $durl, $dkotisivu, $ddate, $did, $dviesti, $dvastaus) = explode("||||", $cviesti); // Jos viestin id on oikea, vaihdetaan vastaus if($did == $vid) $dvastaus = htmlentities($_POST["vastaus"]); $valiaikainen[] = $dmini.'||||'.$dmaili.'||||'.$durl.'||||'.$dkotisivu.'||||'.$ddate.'||||'.$did.'||||'.$dviesti.'||||'.$dvastaus; } // Kirjoitetaan viestit tiedostoon for($i = 0; $i < sizeof($filukka); $i++) @fwrite($viestit, $valiaikainen[$i]); echo 'Vastaus lisätty!'; } } // Jos halutaan poistaa viesti elseif($_GET["v"] == 'poista'){ // Luodaan taulukko viesteille $valiaikainen = array(); // Käydään viestit silmukassa läpi for($las = 0; $las < sizeof($filukka); $las++){ $cviesti = $filukka[$las]; list($dnimi, $dmaili, $durl, $dkotisivu, $ddate, $did, $dviesti, $dvastaus) = explode("||||", $cviesti); // Jätetään poistettava viesti lisäämättä taulukkoon if($did != $vid) $valiaikainen[] = $dmini.'||||'.$dmaili.'||||'.$durl.'||||'.$dkotisivu.'||||'.$ddate.'||||'.$did.'||||'.$dviesti.'||||'.$dvastaus; } // Kirjoitetaan viestit tiedostoon for($i = 0; $i < sizeof($filukka); $i++) @fwrite($viestit, $valiaikainen[$i]); echo 'Viesti poistettu!'; } // Suljetaan tiedosto @fclose($filukka); }?>
Kyseistä koodipätkää käytetään tekemäni vieraskirjan admin-osiossa. Viestit ovat tiedostossa $tiedostonosoite seuraavasti:
nimi||||sähköposti||||kotisivun url||||kotisivu||||viestin lähetysaika||||viestin id||||viesti||||vastaus nimi||||sähköposti||||kotisivun url||||kotisivu||||viestin lähetysaika||||viestin id||||viesti||||vastaus nimi||||sähköposti||||kotisivun url||||kotisivu||||viestin lähetysaika||||viestin id||||viesti||||vastaus
Yritettäessä vastata viesteihin, tai poistaa niitä tapahtuu seuraavaa:
Tiedosto ennen kuin yritetään poistaa kolmas viesti:
kolme||||kolme@kolme.||||http://kolme||||kolme||||22.09.2005 15:53:57||||2||||kolmekolmekolme|||| kaksi||||kaksi@kaksi.||||http://kaksi||||kaksi||||22.09.2005 15:53:43||||1||||kaksikaksikaksi|||| yksi|||| ||||http://yksi||||yksi||||22.09.2005 15:53:23||||0||||yksiyksiyksi||||
Tiedosto sen jälkeen kun on yritetty poistaa kolmas viesti:
||||kaksi@kaksi.||||http://kaksi||||kaksi||||22.09.2005 15:53:43||||1||||kaksikaksikaksi|||| |||| ||||http://yksi||||yksi||||22.09.2005 15:53:23||||0||||yksiyksiyksi|||| ||||1||||kaksikaksikaksi|||| yksi|||| ||||http://yksi||||yksi||||22.09.2005 15:53:23||||0||||yksiyksiyksi||||
eikä olisi helpompi tehdä functio joka poistaa halutun rivin tiedostosta esim.
<? function poista_rivi($tiedosto,$rivi) { $rivit=file($tiedosto); $rivit[$rivi]=null; $fp=fopen($tiedosto,"w"); foreach($rivit as $rivi) fwrite($fp,$rivi); fclose($fp); } ?>
sitten siinä admin osiossa jossa voi poistaa viestejä sinulla on linkki esim poista johon laitat mukaan viestin rivinumeron tyylin <a href="?v=poista&id=3>poista</a>
Eikös tuo sinun esimerkki jätä poistetun rivin kohdalle tyhjän rivin, eikä oikeasti poista sitä, vaan vaan tyhjentää.
Ei. Kokeile vaikka tätä
huomaat ettei taulukkoon jää alkiota nolla, joten foreach:issa sitä ei edes käydä läpi.
Juu, kyllä tuon mielestäni pitäisi toimia tuon Mazulin version kerta se taulukko käydään läpi Foreachilla, joten tyhjät indeksit välissä eivät haittaa... Eri olisi tieten esimerkiksi for-loopilla käytäessä.
Niin, ja vaikka taulukko käytäisiin for:lla, ei tiedostoon tallentuisi mitään siinä kohdalla joka on unset:ttu, koska sen kohdan alkio on tyhjä. xD
edit: hups olin siinä alkuperäisessa laittanutkin että $rivit[$rivi]=null; No toimiihan se silleenkin... xD
Nyt toimii.
Aihe on jo aika vanha, joten et voi enää vastata siihen.