Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Zapis danych do pliku, ale na początku
Forum PHP.pl > Forum > Przedszkole
zagi195
Witam

Zrobiłem dodawanie newsów zapisywanych w pliku .txt i mam taki problem, kolejne dodawane newsy są dodawane na koniec pliku txt i co za tym idzie nowsze są wyświetlane pod starszymi a ja chcę żeby było odwrotnie.

Jest możliwość żeby php dopisywało kolejne newsy na początku pliku a nie na końcu, a starsze przesuwało niżej?

Pozdrawiam
jacek.e3
Witam,

fopen ma flagi do otwierania plików do zapisu (w, w+, a, a+), ale żadna z nich nie ustawia wskaźnika na początku pliku, co oznacza, że masz 3 wyjścia:

- wczytać zawartość poprzez file_get_contents, potem fwrite dopisać nowego newsa, a następnie resztę pliku

- przesunąć wskaźnik na początek pliku (fseek(), rewind())

- dopisywać na końcu pliku, a newsy wyświetlać od końca;-)


pozdrawiam
TheSnake
a file_put_contents? dopisuje na początku pliku
@edit, a nie nie tongue.gif
Wczytujesz plik do zmiennej np. file_get_contents, potem zapisujesz file_put_contents swoj tekst + zmienna (np. file_put_contents('Moj tekst' . $zmienna, $plik); )
zagi195
Cytat(jacek.e3 @ 2.02.2010, 12:36:27 ) *
- przesunąć wskaźnik na początek pliku (fseek(), rewind())


Próbuje tymi opcjami zrobić ale nie wychodzi mi, to ma być przed zapisem do pliku a po otwarciu go, tak?

mam coś takiego:


  1. // otwarcie pliku w celu dopisywania
  2. @ $wp = fopen("news.txt", 'a');
  3.  
  4. flock($wp, LOCK_EX);
  5.  
  6. if (!$wp) {
  7. echo "<p><strong> Zamówienie Państwa nie może zostać przyjęte w tej chwili.
  8. Proszę spróbować później.</strong></p></body></html>";
  9. }
  10.  
  11. fwrite($wp, $ciagwyjsciowy, strlen($ciagwyjsciowy));
  12. flock($wp, LOCK_UN);
  13. fclose($wp);
TheSnake
Spróbuj z:
Kod
$wp = fopen("news.txt", 'a');

rewind($wp); // ustawienie wskaźnika na początku pliku

fwrite($wp, $ciagwyjsciowy, strlen($ciagwyjsciowy));
zagi195
nie idzie sad.gif


no nie umiem zrobić tego, pomóżcie :/
raak07
Może tak
Kod
   $plik="nazwa_pliku.txt";
             $fp=fopen($plik, "r+");
             $dane=$dane.fread($fp, filesize($plik));
             rewind($fp);
             flock($fp, 2);
             fwrite($fp, $dane);
             flock($fp, 3);
             fclose($fp);

pozdrawiam
zagi195
róbiłem już coś takiego, ale to dodaje treść na początku pliku tylko że pozostałej nie przesuwa dalej tylko ją zamienia.... jeszcze jakiś propozycję?
kchrapa
Witam !

1. Raczej nie ma koniecznosci zapisywac tego w odwrotnej kolejnosci - lepiej po prostu
zapisuj po kolei - a tylko zmien kolejnosc przy wyswietlaniu.
2. Jak sadze, zapisujesz kolejne wpisy w kolejnych liniach (po usunieciu enterow z wpisu) ?
3. Jesli tak robisz , to najsensowniej bedzie przy odczycie:

<?php

$a_wiersze=file("wpisy.txt"); //wczytaj w postaci tablicy, gdzie kluczami sa numerki 0,1,2 a wartosciami wiersze

$a_wiersze=array_reverse($a_wiersze); //odwroc kolejnosc

//wyswietl kolejne wiersze
foreach($a_wiersze as $v_wiersz){
echo "<p> $v_wiersz </p>" ;
}

?>

Jesli masz dane jednak rozdzielane np. '@@' (choc to wyzej jest sensowniejsze ;-) ):

<?php
$v_tresc=file_get_contents("dane.txt"); //wczytaj calosc


$a_wiersze=array_reverse(explode("@@",$v_tresc)); //rozbij na tablice (explode) po czym odwroc kolejnosc

//wyswietl
foreach($a_wiersze as $v_wiersz){
echo "<p>$v_wiersz </p>";
}
?>

A jesli mocno sie upierasz przy zapisie :

<?php
$a_wiersze=file("dane.txt"); //wczytaj plik jako tablice (zakladamy, ze ostatnie sa juz na poczatku)
$a_wiersze=array_reverse($a_wiersze);//odwroc kolejnosc ( teraz ostatnie na koniec)
$a_wiersze[]='To jest nowy wpis'; //dodaj wpis na koniec tablicy
$a_wiersze=array_reverse($a_wiersze); //ustaw ponownie - ostatnie na poczatek

$v_plik=fopen("dane.txt","w"); //otworz plik do nadpisania
fwrite($v_plik, implode("\n",$a_wiersze) ); //polacz elementy tablicy enterami/separatorem i wpisz do pliku
fclose($v_plik); //zamknij plik

?>

A tak ogolnie - to proponuje jakis bezplatny hosting z baza SQL (najpredzej mysql) i po problemie ;-)


Pozdrawiam serdecznie,
Kacper

========================================

Szkolenia PHP , Warszawa
http://www.AplikacjeInternetowe.pl

?>
raak07
Hej
Na końcu wstawianej wiadomości wstaw znak końca linii "\n".
Każda wiadomość to nowy "rekord".
Pozdrawiam
jacek.e3
pomysł z przesuwaniem wskaźnika jednak jest błędny.

fopen z flagami r i r+ otwiera plik tylko do odczytu
z flagami w i w+ zeruje zawartość,
a z flagami a i a+ i tak doda na koniec w/g http://php.net/manual/pl/function.rewind.php nie ma sensu przesuwać wskaźnika

pozdrawiam
zagi195
heh... i tak nie wiem jak to zrobić...
dane nie są tylko w 1 wierszu
raak07
Kod
<?php                        
            $plik="historia.txt";
            $dane = date("Y-m-d H:i:s",strtotime("now"))." jakaś treść "."\n";            
            $fp=fopen($plik, "r+");
            $dane=$dane.fread($fp, filesize($plik));
            rewind($fp);
            flock($fp, 2);
            fwrite($fp, $dane);
            flock($fp, 3);
            fclose($fp);
?>
pyro
Według mnie wystarczy po prostu (nie czytałem wszystkich postów, więc sorry jeśli kogoś nadpisuję):

  1. $dane = 'blablabla';
  2. file_put_contents('plik.txt', $dane.PHP_EOL.file_get_contents('plik.txt'));
Romskey
Odbierasz nowe dane metoda POST jak sądzę.
Zapisujesz je jako np.
$nowe_dane
Pobierasz zawartość pliku np.
$stare_dane=file_get_contents("plik.txt","r");

Tworzysz nową zmienną składającą się z nowego wpisu i starych danych np.:

$dane_do_zapisu=$nowe_dane.$stare_dane;

zapisujesz :

$plik = fopen("plik.txt","w");
fputs($plik,$dane_do_zapisu);
fclose($plik);


oczywiście użyj nl2br aby zachować formatowanie i problem z głowy. Prościej chyba nie da się.
zagi195
pyro Twoja opcja działa biggrin.gif dziękuje.
nospor
@zagi195 a wiesz co jest najlepsze? Ze juz na samym początku padlo dokladnie to samo co podał pyro
Cytat
Wczytujesz plik do zmiennej np. file_get_contents, potem zapisujesz file_put_contents swoj tekst + zmienna (np. file_put_contents('Moj tekst' . $zmienna, $plik); )
Tak od wczoraj sie zastanawiałem kiedy ktoś to powieli i wkoncu moze to zastosujesz
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.