Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Ongelma tiedostoon kirjoituksessa

ville-v [22.09.2005 15:55:54]

#

<?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&amp;v=vastaa&amp;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&auml;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&#64;kolme.||||http://kolme||||kolme||||22.09.2005 15:53:57||||2||||kolmekolmekolme||||
kaksi||||kaksi&#64;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&#64;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||||

Mazuli [22.09.2005 18:14:55]

#

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>

Lebe80 [23.09.2005 10:08:52]

#

Eikös tuo sinun esimerkki jätä poistetun rivin kohdalle tyhjän rivin, eikä oikeasti poista sitä, vaan vaan tyhjentää.

<?
function poista_rivi($tiedosto,$rivi)
{
  $rivit=file($tiedosto);
  $rivit[$rivi]=null;
  $fp=fopen($tiedosto,"w");
  foreach($rivit as $rivi)
    if(strlen($rivi)>0 ){
      fwrite($fp,$rivi);
    }
  fclose($fp);
}
?>

Mazuli [23.09.2005 10:46:27]

#

Ei. Kokeile vaikka tätä

<?

$array=array(1,2,3);
unset($array[0]);
print_r($array);

?>

huomaat ettei taulukkoon jää alkiota nolla, joten foreach:issa sitä ei edes käydä läpi.

kayttaja-2791 [23.09.2005 10:50:22]

#

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

Mazuli [23.09.2005 11:19:24]

#

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

ville-v [23.09.2005 14:49:17]

#

Nyt toimii.

Vastaus

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

Tietoa sivustosta