Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Rivin poisto

Sivun loppuun

pistemies [11.05.2003 19:58:07]

#

Miten tätä koodia pitäisi muuttaa, jotta for -silmukka tunnistaisi $r ja $p muuttujat.
Tässä mun koodissa poistettava rivi on onnistuneesti tallennettu tiedostoon poista.txt ja sen rivillä 0 (1) on rivin numero(php:lle), jolla poistettava rivi on. Rivinumero tunnistetaan aina tuolla koodissa oleville "Testi-tulostus" riveille saakka, mutta for-silmukassa ei.

// tallennetaan poistettavan rivin yläpuolella olevat rivit

 $poistatiedot=file("poista.txt");
 $loota=explode("|",$poistatiedot[0]);
$i=0;
 while($i <=$loota)
 {
 $r=$loota[0]-1;

 $ylarivit=file("tiedot.txt");

       echo "Rivi r: $r<br>";   // Testi-tulostus

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

 	$ylar="ylarivit.txt";
 	if (!file_exists($ylar));
 	{
 		touch("$ylar");
 		chmod("$ylar",0777);
 	}
      $alkuun=$ylarivit[$i];
      $alkuun=str_replace("\n","",$alkuun);
      $alkuun=str_replace(" ","",$alkuun);

         $ylarivi=fopen($ylar,"w");
         fputs($ylarivi,$alkuun);
         fclose($ylarivi);
         break;
   }

// tallennetaan poistettavalta riviltä alkaen  tiedoston loppuosa

   $p=$loota[0]+1;
 $alarivit=file("tiedot.txt");

 	echo "Rivi p:$p";   // Testi-tulostus
 for($p=1;$i<count($alarivit);$i++)
   {

 	$alar="alarivit.txt";
 	if (!file_exists($alar));
 	{
 		touch("$alar");
 		chmod("$alar",0777);
 	}
         $loppuun=$alarivit[$i];
         $loppuun=str_replace("\n","",$loppuun);
         $loppuun=str_replace(" ","",$loppuun);

         $alarivi=fopen($alar,"w");
         fputs($alarivi,$loppuun);
         fclose($alarivi);
         break;
   }

pistemies [12.05.2003 14:05:46]

#

Esimerkki, miten toimii nyt:

echo $r; // tulostaa: Rivi r: 3
echo $ylarivit[$i]; // tulostaa for-silmukassa: abc|127.0.0.1|||10.05.03 08:24.02||palat/082402100503abc.txt|082402100503 // tiedot.txt tiedoston rivi 0 (1), vaikka pitäisi olla rivit 0- 3(1-4).
echo $p; // tulostaa: Rivi p:5
echo $alarivit[$i]; // tulostaa samoin tiedot.txt 1. rivin, vaikka tulisi tulostaa riviltä 5(6) alkaen tiedoston loppuun.

arcatan [12.05.2003 14:09:19]

#

Voisitko käyttää koodi-tagia?

Sitten ongelmaasi... Enpä ole nähnyt noin sekaava koodia usein. Ei tuo voi edes toimia.. Minä melkein suosittelisin että kirjoitat koko koodin uudeleen.

Tuossa alemmassa for-silmukassa lienee virhe

for($p=1;$i<count($alarivit);$i++)
     ^
    Miksi tuossa on $p eikä $i?

Luulen, että sen pitäisi olla näin:

for($i=$p; $i<count($alarivit); $i++)

Yritätköhän nyt tallentaa yhden vai useampia rivejä?
Koska tuolla on tuo for, luulisi että haluat tallentaa useampia rivejä, mutta toisaalta avaat tiedoston johon haluat tallentaa joka kerta tilaan "w", joka tyhjentää tiedoston. Käytät myös breakia.

Lisäksi tuo while on ihan turha ja tarkistaa onko kokonaisluku pienempi kuin taulukko.

Ei hitsi, onko tämä vitsi? Siis eihän tuo voi toimia niin hyvin kuin väität. Kerro mitä oikeasti haluat koodin tekevän, niin katsotaan.

Edit: ajattelin, etten auta, mutta autoin kuitenkin.

pistemies [12.05.2003 18:38:29]

#

lainaus:

Voisitko käyttää koodi-tagia?

Sitten ongelmaasi... Enpä ole nähnyt noin sekaava koodia usein. Ei tuo voi edes toimia.. Minä melkein suosittelisin että kirjoitat koko koodin uudeleen.

On se kyllä vähän sekava, kun ei tiedä, miten tuo pitäisi tehdä. Pitää yrittää keksiä omin päin jotain, ... Kyseessä on siis rivin poisto, kuten otsikko kertoo. Rivi sijaitsee tiedostossa nimeltä tiedot.txt Kyseessä on vieraskirjan viesti-tietoja sisältävä rivi. Viimeinen "rivi" eli loota sisältää merkkijonon, jonka avulla poistettavan rivin numero saadaan selville viestin vieressä olevasta Poista-linkistä. Rivinumero ja rivi tallennetaan tiedostoon poista.txt. Sen lootassa 0 lukee tuo rivinumero ja toiseksi viimeisessä lootassa lukee poistettavan viesti-tiedoston nimi ja polku.

  $i=0;
 for(;;)
 {
 if ($i >$r)
   {  break;}
       echo $ylarivit[$i]; // Testi-tulostus
           $i++;
       echo "<br>";
	$ylar="ylarivit.txt";

	if (!file_exists($ylar));
	{
		touch("$ylar");
		chmod("$ylar",0777);
	}
     $alkuun=$ylarivit[$i];
     $alkuun=str_replace("\n","",$alkuun);
     $alkuun=str_replace(" ","",$alkuun);
        $ylarivi=fopen($ylar,"w");

        fputs($ylarivi,$alkuun);
        fclose($ylarivi);

  }

Tuossa on tämän hetkinen, mihin asti toimii ja mihin tökkää. Nyt toimii tuohon asti

echo $ylarivit[$i]; // Testi-tulostus
           $i++;

Mutta ei pitemmälle. Tallentaa tiedostoon vain viimeisen rivin. Mistä kiikastaa? Miten tuo tehtäisiin siten, että tuo echon tilalle arrayhin?
Saa tehdä myös ehdotuksia kokonaan uudenlaisesta koodista, jos jaksaa kiinnostaa...

pistemies [12.05.2003 19:40:28]

#

lainaus:

ja tässä rivin poisto:

<?php
$rivi=0; // 0 on tiedoston ensimmäinen rivi
$f=file("tiedosto.txt");
$d=fopen("tiedosto.txt", "w");
$f[$rivi]="";
foreach ($f as $r)
{
  fwrite($d, $f[$r]);
}
fclose($d);
?>

Löysin viestistä 997 tuollaisen snakarin koodin. Se tyhjentää koko tiedoston. Mikä tuossa mahtaa olla tuo $r? Saako tuota toimimaan?

thefox [12.05.2003 20:41:52]

#

Taitaa olla testaamatonta koodia...

<?php
$rivi=0; // 0 on tiedoston ensimmäinen rivi
$f=file("tiedosto.txt");
$d=fopen("tiedosto.txt", "w");
$f[$rivi]="";
foreach ($f as $r)
{
  fwrite($d, $r);
}
fclose($d);
?>

pistemies [13.05.2003 12:31:28]

#

Näyttää siltä, että minun kannattaa jatkaa tuolta edelliseltä pohjalta. Sain nyt toimimaan tuon poistettavan rivin yläpuolella olevien rivien tallennuksen ylarivit.txt tiedostoon. Se onnistui seuraavalla skriptillä:

$s=$loota[0];
$r=$loota[0]-1;

$ylarivit=file("tiedot.txt");


    $ylar="ylarivit.txt";
      if (!file_exists($ylar));
     {
       touch("$ylar");
       chmod("$ylar",0777);
     }
     $ylarivi=fopen($ylar,"w");

 $i=0;

 for(;;)
 {
   if ($i >$r)
   {  break;
    }
      if ($s==0)
 {
  fclose($ylarivit);
  }
 else
 {
     $alkuun=$ylarivit[$i];
     $alkuun=str_replace("\n","",$alkuun);
     $alkuun=str_replace(" ","",$alkuun);

        $i++;
        fwrite($ylarivi,$alkuun);
  }
 }
 fclose($ylarivi);

Arrayhin en onnistunut sitä tallentamaan.

pistemies [13.05.2003 14:12:11]

#

Tuossa sattui pikku bugi, muuttujan nimessä yksi t-kirjain liikaa.

     if ($s==0)
  {
   fclose($ylarivit);
   }

Pitääpä muuttaa tuo tiedot.txt muuttujanimi erottumaan muista...

arcatan [14.05.2003 07:31:14]

#

Mutta. Koska siis haluat poistaa taulukosta yhden rivin, kannattaa käyttää funktiota array_splice.

Esimerkki (Variningvarning, testaamatonta koodia *virn*):

Funktio, joka poistaa tiedostosta tiedot.txt rivin $rivi.

<?php
function poistaTiedoistaRivi($rivi) {
  $taulu = file("tiedot.txt");
  $taulu = array_splice($taulu, $rivi, 1);
  $fp = fopen("tiedot.txt", "w");
  foreach ($taulu as $t) {
    fwrite($fp, $t);
  }
  fclose($f);
}
?>

Edit: oli nuo kooditagit vähän päin mäntyä

pistemies [14.05.2003 13:34:03]

#

.

<?php
function poistaTiedoistaRivi($rivi) {
  $taulu = file("tiedot.txt");
  $taulu = array_splice($taulu, $rivi, 1);
  $fp = fopen("tiedot.txt", "w");
  foreach ($taulu as $t) {
    fwrite($fp, $t);
  }
  fclose($f);
}
?>

Kiitos. Tuo tallentaa testissä tiedostosta ensimmäisen rivin ilman virheilmoituksia ( kun lisää tuon $f => $fp).
Mikä mahtaa olla tuo loppu 1 tuossa arrayssa? Katselin PHP-sivuilta, siellä käytettiin korvaavia $x ja $y muuttujia, joista en älynnyt kunnolla, kun ei tuo englannin kieli ole kovin päässä pysynyt. Ilmeisesti rivin poistoonkin on suunniteltu oma array, luulisi sen olevan sen verran tarpeellinen toimenpide. (Ellei PHP satsaa mysqliin tällaisissa asioissa)

pistemies [14.05.2003 21:55:07]

#

Toimivuus tällä hetkellä: Olen saanut kaikki säilytettävät rivit tallentumaan oikein tiedostoihin ylärivit.txt ja alarivit.txt. Jostakin syystä homma toimii kuitenkin hitaasti. Sallittu 30 sekuntia ei riitä siirtämään säilytettäviä rivejä takaisin tiedot.txt tiedostoon. Onko ideaa tähän tai tuohon array-hommaan?

leftover [15.05.2003 08:06:39]

#

Mitenkäs onnistuisi jotenkin näin:

<?php
function poistaTiedoistaRivi($rivi) {
   $taulu = file("tiedot.txt");
   unset($taulu[$rivi]);
   $kaikki = implode("", $taulu);
   $fp = fopen("tiedot.txt", "w");
   fwrite($fp, $kaikki);
   fclose($fp);
   }
?>

En ehtinyt testaamaan, mutta tuon pitäisi toimia eikä olisi turhia looppejakaan.

pistemies [15.05.2003 10:07:23]

#

Tuo oli lyhyt ja selkeä koodi. Kiitoksia paljon!

function poistaTiedoistaRivi($s) {
   $taulu = file("tiedot.txt");
   unset($taulu[$s]);
   $kaikki = implode("", $taulu);
   $fp = fopen("testi.txt", "w");
   fwrite($fp, $kaikki);
   fclose($fp);
   }

poistaTiedoistaRivi($s);

Testasin sitä tuolla skriptillä ja toimi täydellisesti ja nopeasti!


Sivun alkuun

Vastaus

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

Tietoa sivustosta