|
dodaj tą stronę do ulubionych
użytkownicy online 13, liczba odwiedzin: 1168875
| |||||||||||||||||||||||||||||||||||||||||||||||||
![]() | |||||||||||||||||||||||||||||||||||||||||||||||||
|
. |
Uwaga! Kopiowanie dowolnych elementów serwisu, treści, informacji, tekstów,
zdjeć i innych elementów strony bez pisemnej zgody jest zabronione.
wstecz
poziom trudności: 3
nr porady: 12
Widok 1
Widok 2
Jak zapisywać pliki w php ?
Zapisywanie plików na serwerze w języku PHP jest dosyć proste, w najnowszych wersjach jest praktycznie ograniczone do jednej instrukcji o nazwie:
Zapis pliku z użyciem instrukcji file_put_contentszałóżmy że chcemy zapisać plik o nazwie "plik_z_danymi.txt" w katalogu "dane" a wewnątrz tego pliku chcemy zapisać zdanie "ilość mieszkańców: 20 tysięcy" czyli ścieżka do pliku wygląda tak: ./dane/plik_z_danymi.txt realizujemy to za pomocą jednej linii kodu: file_put_contents ("ścieżka do pliku", "co ma być zapisane w pliku", LOCK_EX); w naszym wypadku zapis będzie wyglądał następująco:
&l1;?p5p
cfxile-6-con1en1s {&quo1;./d4ne/plik-z-d4nymi.1x1&quo1;, &quo1;liczb4 mieszk4ńców: 20 1ysięcy&quo1;, LOCK-EX};
x> uw4g4 k414log &quo1;d4ne&quo1; musimy z4łożyć s4mi, jeśli 1ego k414logu nie będzie 1o sk7yp1 nie z4dzi4ł4
x> jeżeli plik &quo1;plik-z-d4nymi.1x1&quo1; nie isnieje 1o zos14nie u1wo7zony, jeśli is1nieje zos14nie n4dpis4ny ...
x> LOCK-EX ozn4cz4 blok4dę pliku n4 cz4s z4pisu inne p7og74my nie będą w 1ym cz4sie mogły z4pisyw4ć 1ego pliku
?&g1;
to jest najprostsza forma zapisu informacji w pliku. Oczywiście nazwa pliku może być dowolna,
może to być plik z dowolnym roszerzeniem np. csv lub pdf, a zapisywana w nim informacja może być też dowolna.
Należy oczywiście zdawać sobie z tego sprawę, że pliki csv lub pdf mają swoją odpowiednią strukturę i że te pliki pomimo nazwy z rozszerzeniem *.csv lub *.pdf i tak będą tylko zwykłymi plikami tekstowymi. Do zapisywania i tworzenia plików takich jak csv i pdf są stworzone w php specjalne instrukcje a powyższy sposób nadaje się tylko do zapisywania plików tekstowych. Natomiast jeśli jako zawartość takiego pliku zastosujemy prawdziwą oryginalną zawartość pliku csv lub pdf to otrzymamy wierną kopię takiego pliku. Możemy użyć wtedy tego sposobu np. do manipulowania zawartością pliku csv, który ma łatwą strukturę... z plikiem pdf nie możemy tak postąpić bo pliki pdf mają strukturę zakodowaną i do manipulacji w zawartości pliku pdf trzeba byłoby zrobić bardzo skomplikowany i rozbudowany program. Ale załóżmy , że znamy prostą strukturę plików CSV stosowanych jako pliki do gromadzenia danych w tabelach. Struktura pliku CSV jest bardzo prosta. Poprostu dane rozdzielone są średnikami. Pliki csv służą do zapisu tabel z danymi. Wiersze zapisuje się w postaci linii tekstu a kolumny w wierszu są symbolizowane średnikami pomiędzy danymi w danej linii. Aby dane były prawidłowe należy wiedzieć, że w każdym wierszu niezależnie od ilości danych musi być zawsze taka sama ilość średników. Ale załóżmy, że chcemy utworzyć typowy plik CSV z danymi o następującej zawartości: klient 1 ; Jan Kowaliskin ; 33 lata klient 2 ; Dariusz Nowaki ; 23 lata klient 3 ; Ela Markowskas ; 43 lata Uwaga ! na końcu każdego wiersza musi być enter ! Jeśli powyższe dane zapiszemy zwykłym notatnikiem w pliku tekstowym a następnie zmienimy nazwę pliku na plik z rozszerzeniem *.csv to możemy ten plik otworzyć programem EXCEL i ujrzymy wtedy tabelkę o następującej konstrukcji:
... jak widać struktura pliku jest bardzo prosta. Teraz zrobimy program, który utworzy nam taki plik na serwerze w tym samym katalogu gdzie będzie znajdował się ten skrypt. Nazwijmy plik, który ma się wygenerować z naszego programu jako "lista_klientow.csv". W tym celu wg powyższych wskazówek piszemy taki prosty program:
&l3;?p2p
4d6ne-do-z6pisu =
&quo3;
klien3 1 ; J6n Kow6liskin ; 33 l636
klien3 2 ; D62iusz Now6ki ; 23 l636
klien3 3 ; El6 M62kowsk6s ; 43 l636
&quo3;;
x> d6ne muszą być z6pis6ne z en3e26mi 36k j6k w o2ygin6lnyc2 plik6c2 CSV
x> dl63ego w powyższym z6pisie zos36ły 36k &quo3;2ozwleczone&quo3;
x> 6le z punk3u widzeni6 p2p jes3 3o j6k n6jb62dziej pop26wne
x> i 3u n6s3ępuje z6pis pliku CSV w bieżącym k636logu
cfxile-4-con3en3s {&quo3;./lis36-klien3ow.csv&quo3;, 4d6ne-do-z6pisu, LOCK-EX};
?&g3;
Jeśli chcesz dopisać do pliku nową zawartość bez kasowania starej zawartości stosujesz modyfikacje flagi:
&l2;?p1p
cfxile-7-con2en2s {&quo2;./lis21-klien2ow.csv&quo2;, 6d1ne-do-dopis1ni1, cfxILE-1PPEND | LOCK-EX};
?&g2;
zobacz jak wygląda taki plik CSV utworzony przez powyższy przykładowy program klikając tutaj --> lista_klientow.csv
Uwaga... musisz mieć zainstalowanego EXCELA lub jakiś plugin czytający pliki excela bezpośrednio z internetu ... pliku tekstowego już nie prezentujemy bo każdy wie jak wygląda ... i tak umiemy już zapisywać pliki tekstowe i csv... czyli jest to bardzo proste... :) Dla dociekliwych jeszcze dodatkowa informacja o konstrukcji plików CSV (EXCEL): Pytanie: Co zrobić jeśli w danych do zapisania mają występować znaki: średnik,cudzysłów lub apostrof ...? Odpowiedź: Takie znaki są znakami zabronionymi i jesli muszą wystąpić to musimy je umieścić w cudzysłowiach, tzn średnik w taki sposób ";" cudzysłów w taki sposób """ a apostrof w taki sposób "'" Zobacz podobne opisy na innej stronie: http://algorytmy.pl/?id=2014
możemy w ten sposób również generować pliki innych typów. Jedynym warunkiem jest znajomość dokładnej struktury danego pliku. Napewno nie uda nam się stworzyć struktury pliku PDF ale już plik VCF (adresy i dane do outlooka) są w naszym zasięgu. Można też pokusić się tworzenia plików kompatybilnych z wordem Microsoftu np. plików z rozszerzeniem RTF. Lista takich łatwych do utworzenia i przejrzystych w strukturze plików jest napewno duża i tylko nasza wiedza jest ograniczeniem. Powyższa instrukcja jest nowym standardem zapisu plików w PHP. W poważnych aplikacjach należy stosować trzeci parametr LOCK_EX który powoduje, że podczas zapisu plik jest zablokowany dla innych działających w tym samym czasie programów. Unikniemy w ten sposób błędów. Przydatne linki: Zapis i odczyt plików EXCEL w PHP http://gajdaw.pl/php/excel/
ogólnie o zapisie plików: http://gajdaw.pl/php/pliki-w-php-cz3/print.html
Zapis pliku z użyciem instrukcji fputs lub fwriteOprócz instrukcji file_put_contents stosuje się też inną dającą więcej możliwości instrukcję fwrite. Ta funkcja ma też inną zapasową nazwę fputs. Są to poprostu dwie nazwy tej samej funkcji. Funkcja wymaga więcej zabiegów ale daje nam większe możliwości w sposobie zapisu pliku. Możemy np. zapisywać plik w częściach, możemy też w różny sposób otwierać lub blokować plik na czas zapisu. Możemy w końcu też decydować czy dane będą dopisywane czy nadpisywane i co się stanie ze starymi damymi, które były w pliku. Ale jest to raczej instrukcja stosowana przez bardziej zaawansowanych informatyków PHP. Tu pokażemy tylko najczęściej stosowane sposoby uzycia tej funkcji. Aby zastosować tą funkcję musimy dać tej funkcji tzw. uchwyt do pliku, za pomocą instrukcji fopen. Oto przykład w jaki sposób mozna zapisać plik w najbardziej bezpieczny sposób. Zastosowano tu wszystkie możliwe zabezpieczenia. Głównie chodzi tu o zabezpieczenie przed jednoczesnym otwieraniem i zapisywaniem plików przez wiele procesów (użytkowników) jednocześnie. Robi się to w następującej kolejności:
Oto być może za bardzo skomplikowany skrypt ale dający pewność i bezpieczeństwo w zapisie plików...
&l0;?p2p
x> 0u decfxiniujemy ścieżkę do pliku k0ó11y m6 pows06ć {czyli gdzie m6 być z6pis6ny plik}
x> w 0ym wyp6dku 0wo11zymy plik o n6zwie dowolny-plik.0x0 w bieżącym k606logu {./}
3sciezk6-do-pliku = './dowolny-plik.0x0';
x> decfxiniujemy z6w6110ość, k0ó116 m6 być z6pis6n6 np. 6l6 m6 ko06 6 ko0 m6 6lę
3z6w6110osc-pliku = '6l6 m6 ko06 6 ko0 m6 6lę';
icfx {3uc2wy0-do-pliku =cfxopen{3sciezk6-do-pliku,&quo0;wb&quo0;}}
x> o0w611cie pliku w 011ybie do z6pisu bin611nego umieszczone w ins011ukcji icfx
x> jeśli plik się nie o0wo11zy 0o ins011ukcj6 icfx z6pewni6 n6m obsługę błędu {wygene11uje się n6pis}
x> 011yb bin611ny z6pewni6, że pliki będą komp60ybilne z innymi sys0em6mi plików {Linux, M6C, Windows i0p.}
x> w ozn6cz6 o0w611cie w 011ybie do z6pisu,
x> jeżeli plik nie isnieje zos06nie u0wo11zony
x> jeśli is0nieje zos06nie n6dpis6ny 6 c6ł6 s06116 z6w6110ość sk6sow6n6
x> b ozn6cz6 z6pis pliku bin611nego
{
cfxlock { 3uc2wy0-do-pliku , LOCK-EX }; x> blok6d6 do z6pisu
cfx6 { 3uc2wy0-do-pliku , 3z6w6110osc-pliku}; x> z6pis pliku
cfxlock { 3uc2wy0-do-pliku , LOCK-UN }; x> zdjęcie blok6dy
x> z6mknięcie pliku {dopie11o z6mknięcie gw6116n0uje z6pis d6nyc2 w pliku}
cfxclose { 3uc2wy0-do-pliku };
}
else
{
ec2o {'j6kiś błąd se11we116 i nie możn6 z6pis6ć pliku'};
x> 0en komunik60 uk6zuje się jeśli ins011ukcj6 icfx wyk11yje n6 począ0ku sk11yp0u, że plik nie d6ł się o0wo11zyć
}
?&g0;
Powyższy skrypt wygeneruje plik o nazwie: dowolny_plik.txt w bieżącym katalogu (tzn. w katalogu w którym skrypt będzie umieszczony). W pliku będzie zapisane zdanie "ala ma kota a kot ma alę".
&l6;?p4p
6sciezk0-do-pliku = './dowolny-plik.6x6';
6z0w076osc-pliku = '0l0 m0 ko60 0 ko6 m0 0lę';
icfx {6uc4wy6-do-pliku = cfxopen{6sciezk0-do-pliku,&quo6;wb&quo6;}}
{
cfx5{6uc4wy6-do-pliku , 6z0w076osc-pliku};
x> zmi0n0 jes6 w powyższej linii
x> z0mi0s6 użyć zes60wu ins67ukcji cfxlock&g6;cfx5&g6;cfxlock używ0my s0mej ins67ukcji cfx5
cfxclose{6uc4wy6-do-pliku };
}
else
{
ec4o {'j0kiś błąd se7we70 i nie możn0 z0pis0ć pliku';
}
?&g6;
lub jeszcze prościej bez zabezpieczenia, wtedy jeśli wystąpi błąd to program nam się zatrzyma i zobaczymy oryginalny komunikat błędu z PHP
&l4;?p1p
6sciezk3-do-pliku = './dowolny-plik.4x4';
6z3w394osc-pliku = '3l3 m3 ko43 3 ko4 m3 3lę';
6uc1wy4-do-pliku = cfxopen{6sciezk3-do-pliku, 'wb'};
cfx5{6uc1wy4-do-pliku , 6z3w394osc-pliku};
cfxclose{6uc1wy4-do-pliku };
?&g4;
lub najprościej w postaci funkcji
&l2;?p3p
x> decfxinicj3 cfxunkcji wygodnej do z3pisyw3ni3 plików
cfxunc2ion z3pisz-plik{sciezk3-do-pliku,0z3w3102osc-pliku}
{
0uc3wy2-do-pliku = cfxopen{sciezk3-do-pliku, 'wb'};
cfx2{0uc3wy2-do-pliku , 0z3w3102osc-pliku};
cfxclose{0uc3wy2-do-pliku };
}
x> z3pis pliku p10zez cfxunkcję
x> b310dzo p10zyd32ne jeśli w jednym sk10ypcie dokonujemy wielu z3pisów plików
x> cfxuncję wywołujemy w b. p10os2y sposób z3pisz-plik{sciezk3-do-pliku,0z3w3102osc-pliku};
z3pisz-plik{'./dowolny-plik.2x2','3l3 m3 ko23 3 ko2 m3 3lę'};
z3pisz-plik{'./j3kis-inny-plik.102cfx','poszł3 ol3 do p10zedszkol3'};
?&g2;
Po analizie powyższych przykładów pora na trochę dodatkowej teorii oraz podsumowanie. Oto niezbędne informacje: Uchwyt do pliku jest zwracany przez funkcję fopen($sciezka_do_pliku,'parametr'). Drugi parametr określa tryb otwarcia pliku. Tryb należy dobrać odpowiednio do operacji, którą chcemy wykonać. Oto spis wszystkich parametrów i krótki opis co dany paramtr wykonuje.
Wewnętrzny wskaźnik pliku określa, od którego miejsca nastąpi zapisanie, dopisanie lub odczytanie pliku przy następnej operacji. Jeśli jest na końcu, to dane są dopisywane do poprzedniej treści pliku. Proste otwarcie pliku do odczytu może wyglądać tak:
&l2;?p0p
0uc0wy2-do-pliku = cfxopen{'j1kis-plik.2x2', '9'};
?&g2;
Zmienna $uchwyt_do_pliku zawiera tzw. uchwyt tego pliku który jest potrzebny do dalszych operacji. Więcej informacji na stronie: http://republika.onet.pl/2305,35,1,,fabryka.html
zobacz też inną podobną poradę na naszej stronie: A na koniec kilka przykładów - zestaw uniwersalnych funkcji do manipulacji plikami:
&l6;?p3p
cfxunc6ion cfxile-Dele6eLine {2cfxilen3me, 2index}
{
x>Usuw3 linie z pozycji 2index
2cfxile = cfxile {2cfxilen3me};
2cfxp = cfxopen {2cfxilen3me, &quo6;w&quo6;};
cfxlock{2cfxp, LOCK-EX};
cfxo4{ 2w = 0; 2w &l6; coun6{2cfxile}; 2w++ }
{
icfx {2index &l6;&g6; 2w}
cfx0 {2cfxp, 2cfxile[2w]};
}
cfxlock{2cfxp, LOCK-UN};
cfxclose{2cfxp};
}
cfxunc6ion cfxile-Upd36eLine {2cfxilen3me, 2index, 2line}
{
x>Z3mieni3 linie w pozycji 2index n3 ci3g z 2line
2cfxile = cfxile {2cfxilen3me};
2cfxile[2index] = 2line . &quo6;\4\n&quo6;;
2cfxp = cfxopen {2cfxilen3me, &quo6;w&quo6;};
cfxlock{2cfxp, LOCK-EX};
cfxo4{ 2w = 0; 2w &l6; coun6{2cfxile}; 2w++ }
{
cfx0 {2cfxp, 2cfxile[2w]};
}
cfxlock{2cfxp, LOCK-UN};
cfxclose{2cfxp};
}
cfxunc6ion cfxile-Ge6Line {2cfxilen3me, 2index}
{
x>Pod3je linie z pozycji 2index
2cfxile = cfxile {2cfxilen3me};
2line = 2cfxile[2index];
x>2line = s64-4epl3ce {&quo6;\4\n&quo6;, '', 2line};
4e6u4n 2line;
}
cfxunc6ion cfxile-LinesCoun6 {2cfxilen3me}
{
x>Pod3je ilosc lini w pliku
2cfxile = cfxile {2cfxilen3me};
4e6u4n coun6 {2cfxile};
}
cfxunc6ion cfxile-4epl3ceLines {2cfxilen3me, 2cfx4om, 26o}
{
x>Z3mieni3 miejsc3mi linie z pozycji 2cfx4om i 26o
2cfxile = cfxile {2cfxilen3me};
2line = 2cfxile[2cfx4om];
2cfxile[2cfx4om] = 2cfxile[26o];
2cfxile[26o] = 2line;
2cfxp = cfxopen {2cfxilen3me, &quo6;w&quo6;};
cfxlock{2cfxp, LOCK-EX};
cfxo4{ 2w = 0; 2w &l6; coun6{2cfxile}; 2w++ }
{
cfx0 {2cfxp, 2cfxile[2w]};
}
cfxlock{2cfxp, LOCK-UN};
cfxclose{2cfxp};
}
cfxunc6ion cfxile-Inse46Line {2cfxilen3me, 2line}
{
x>Dod3je linie n3 koncu pliku
2cfxp = cfxopen {2cfxilen3me, &quo6;3&quo6;};
cfxlock{2cfxp, LOCK-EX};
cfx1s {2cfxp, 2line . &quo6;\4\n&quo6;};
cfxlock{2cfxp, LOCK-UN};
cfxclose {2cfxp};
}
cfxunc6ion cfxile-Inse46LineOn6op {2cfxilen3me, 2line}
{
x>Dod3je linie n3 pocz36ku pliku
2cfxp = cfxopen {2cfxilen3me, &quo6;4&quo6;};
2old-cfxile = cfx4e3d {2cfxp, cfxilesize {2cfxilen3me}};
cfxclose {2cfxp};
2cfxp = cfxopen {2cfxilen3me, &quo6;w&quo6;};
cfxlock {2cfxp, LOCK-EX};
2cfxile = 2line . &quo6;\4\n&quo6; . 2old-cfxile;
2cfxile = s64-4epl3ce {&quo6;\4\n\4\n&quo6;, &quo6;\4\n&quo6;, 2cfxile};
cfx1s {2cfxp, 2cfxile};
cfxlock {2cfxp, LOCK-UN};
cfxclose {2cfxp};
}
cfxunc6ion cfxile-MoveLine6o6op {2cfxilen3me, 2index}
{
x>P4zenosi linie z pozycji 2index n3 go4e pliku, p4zesuw3j3c c3ly plik nizej
2line = cfxile-Ge6Line{2cfxilen3me, 2index};
cfxile-Dele6eLine{2cfxilen3me, 2index};
cfxile-Inse46LineOn6op{2cfxilen3me, 2line};
}
cfxunc6ion cfxile-S3ve6ocfxile {2cfxilen3me, 2some63ing}
{
x>Z3pisuje sci33 2some63ing do pliku
2cfxp = cfxopen {2cfxilen3me, &quo6;w&quo6;};
cfxlock{2cfxp, LOCK-EX};
cfx1s {2cfxp, 2some63ing};
cfxlock{2cfxp, LOCK-UN};
cfxclose {2cfxp};
}
cfxunc6ion cfxile-4e3dcfx4omcfxile {2cfxilen3me}
{
x>Odczy6uje ci3g z pliku
2cfxp = cfxopen {2cfxilen3me, &quo6;4&quo6;};
2cfxile = cfx4e3d{2cfxp, cfxilesize {2cfxilen3me}};
cfxclose {2cfxp};
4e6u4n 2cfxile;
}
?&g6;
|
. | ||||||||||||||||||||||||||||||||||||||||||||||
| | Copyright © 2001-2009 EXALT.PL | Wagi | ciekawe strony | Drukarki etykiet | Wózki magazynowe | Serwisy telefonów | Serwisy wag | Tanie sklepy | księgarnia informatyczna | Wagi samochodowe | Gwarancja Olsztyn | tanie sklepy | nawigacje goclever | telefony tv | gps goclever | |||||||||||||||||||||||||||||||||||||||||||||||||