Chciałbym się dowiedzieć w jaki sposób zmienić jedną linię w pliku txt mającym kilkaset linii. W tym pliku znajduję się prosta baza danych. Próbowałem z fpusts() ale to zmienia cały plik.
Ładujesz cały plik do tablicy. Każda linia to element w tablicy, usuwasz linię, zapisujesz tablicę do pliku. To chyba najprostszy sposób.
A wiesz która to linijka bez otwierania pliku? Może każdy rekord powinien być w osobnym pliku?
@Ktoś Nieznany: Pytanie jest inne, czy nie lepiej zamienić plik tekstowy na bazę SQLite (wspomniałeś coś w swoim poście o MySQL - SQLite jest o wiele prostsze, żadnej konfiguracji, po prostu tworzysz plik z bazą i do niego zapisujesz). Roboty wcale dużo więcej nie będziesz z tym miał (osoba średnio wtajemniczona w pół godziny ogarnie temat), a wiele rzeczy i problemów Ci odpadnie. Przykładowo - zamiast kombinować z plikiem, wczytywać go, szukać odpowiedniej linii, zamieniać, zapisywać ponownie itp, dałbyś jedno polecenie SQL typu UPDATE (https://www.w3schools.com/sql/sql_update.asp) i po sprawie.
A nie lepiej pobrać linijkę po linijce cały plik (pętla) i porównywać każdą linijkę po kolei. Jeżeli jest taka sama, którą chcesz podmienić to podmieniasz i tyle.
Ktoś Nieznany napisał(a):
Chciałbym się dowiedzieć w jaki sposób zmienić jedną linię w pliku txt mającym kilkaset linii. W tym pliku znajduję się prosta baza danych. Próbowałem z fpusts() ale to zmienia cały plik.
Najpierw musisz wiedziec ktora linie chcesz zastapic nowa trescia. Azeby to wiedziec [w przypadku kiedy nie wiesz ile jest tych linii] musisz wstawic caly plik w petle. W tym przykladzie podalem konkretna linie.
<?php
$linia = '7'; // która linia do zamiany. należy pamietac ze indeksy w tablicy licza sie od 0 nie od 1.
$nowa_tresc = 'Ala ma kota'; // nowa tresc do zapisu
$plik = 'data.txt'; // to chyba wiadomo
function podmien_linie($ktora, $gdzie, $co)
{
$tab = file($gdzie);
$tab[$ktora] = $co . "\r\n";
$f = fopen($gdzie,'w');
flock($f, LOCK_EX);
fwrite($f,str_replace("","\r\n",join('',$tab)));
flock($f ,LOCK_UN);
fclose($f);
}
podmien_linie($linia, $plik, $nowa_tresc);
#######################
# to ponizej tylko zeby wyswietlic zawartosc pliku
$t = file($plik);
for($i=0; $i<count($t); $i++)
{
print @$t[$i] . '<br />';
}
#######################
?>
Tutaj przyklad ktory zczyta Ci caly plik i podstawi wartosci w pole wyboru select. Obok masz pole text do wpisania nowej wartosci.
<?php
function wyswietl_formularz()
{
print "<form action=" . $_SERVER['SCRIPT_NAME'] . " method=post>";
print "Wybierz linie do podmiany:<select name=\"linia\">";
$tt = file('data.txt');
for($n=0; $n<count($tt); $n++)
{
print '<option value=' . $n . '>' . $tt[$n] . ' [linia =>' . $n . ']</option>';
}
print '</select>';
print "Wpisz nowa tresc: <input type=\"text\" name=\"nowatresc\" />";
print "<input type=\"submit\" value=\"Podmien dane\" name=\"sub\"/></form>";
};
$plik = 'data.txt'; // to chyba wiadomo
function podmien_linie($ktora, $gdzie, $co)
{
$tab = file($gdzie);
$tab[$ktora] = $co . "\r\n";
$f = fopen($gdzie,'w');
flock($f, LOCK_EX);
fwrite($f,str_replace("","\r\n",join('',$tab)));
flock($f ,LOCK_UN);
fclose($f);
header('location: ' . $_SERVER['SCRIPT_NAME']);
}
((!@$_POST['sub'])||(!$_POST['nowatresc'])) ? wyswietl_formularz() : podmien_linie(@$_POST['linia'], $plik, @$_POST['nowatresc']);
$t = file($plik);
for($i=0; $i<count($t); $i++)
{
print 'Index tablicy: ' . $i . ' ' . @$t[$i] . '<br />';
}
?>
Mam nadzieje ze o to chodzilo ??
KrisKros123 napisał(a):
A nie lepiej pobrać linijkę po linijce cały plik (pętla) i porównywać każdą linijkę po kolei. Jeżeli jest taka sama, którą chcesz podmienić to podmieniasz i tyle.
A zes wymyslil