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; }
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.
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
Luulen, että sen pitäisi olla näin:
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.
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...
lainaus:
ja tässä rivin poisto:
Löysin viestistä 997 tuollaisen snakarin koodin. Se tyhjentää koko tiedoston. Mikä tuossa mahtaa olla tuo $r? Saako tuota toimimaan?
Taitaa olla testaamatonta koodia...
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.
Tuossa sattui pikku bugi, muuttujan nimessä yksi t-kirjain liikaa.
if ($s==0) { fclose($ylarivit); }
Pitääpä muuttaa tuo tiedot.txt muuttujanimi erottumaan muista...
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ä
.
<?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)
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?
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.
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!
Aihe on jo aika vanha, joten et voi enää vastata siihen.