Kada radite s malim količinama podataka u PHP-u, ponekad je lakše pohraniti ih u datoteke nego stvoriti bazu podataka i organizirati interakciju skripti s njom. U takvim slučajevima zadatak brisanja navedenih redaka iz tekstualne datoteke nije rijedak. Pogledajmo bliže najjednostavniji mogući način za to.
Potrebno
Osnovno znanje PHP-a
Instrukcije
Korak 1
Početni podaci:
- imamo tekstualnu datoteku allStrings.txt, koja sadrži brojne linije podataka
- potrebno je izbrisati red br. 44 iz datoteke
Algoritam za rješavanje problema bit će sljedeći: trebate otvoriti datoteku, pročitati linije koje se u njoj nalaze u niz nizova i prepisati postojeću datoteku sadržajem niza, preskačući redak koji se želi izbrisati.
Korak 2
Da bismo implementirali ovaj algoritam u skriptu, prvo dodjeljujemo vrijednosti varijablama koje će sadržavati ime izvorne datoteke i broj retka koji se briše: $ fileName = "allStrings.txt";
$ lineToKill = 44; Zatim pročitajmo datoteku u niz nizova: $ stringsArray = datoteka ($ fileName); Provjerimo sadrži li datoteka redak koji nam treba. Sav daljnji kôd izvršit će se samo ako uvjet $ lineToKill nije veći od broja linija u $ stringsArray nizu: if ($ lineToKill <= count ($ stringsArray)) {
// ovo će biti glavna petlja programa
} Ako uvjet nije ispunjen, tada nemamo što izbrisati. Neka skripta ispiše informativnu poruku o ovome: else echo "Broj redova u datoteci je manji od". $ LineToKill. "!"; Ako je uvjet ispunjen, trebali biste obrisati izvornu datoteku za novi unos: $ fileHandle = fopen ($ fileName, "w"); Sada bismo trebali organizirati petlju koja se ponavlja kroz sve elemente niza nizova. No, budući da indeksiranje niza započinje od nule, a broj linije za brojanje smo brojali od jednog, čak ćemo i prije početka petlje smanjiti vrijednost $ lineToKill za jedan, kako ne bismo ponavljali ovu operaciju u svakom koraku: $ lineToKill -; Za organiziranje petlje: foreach ($ stringsArray kao $ key => $ value) {
// ovdje je kôd svakog koraka petlje
} Varijabla $ key sadržavat će indeks trenutne linije u polju, a varijabla $ value sadržavat će vrijednost ove linije. Na svakom koraku petlje uspoređivat ćemo indeks retka u nizu s brojem koji treba izbrisati, a ako se ne podudaraju, vrijednost ovog retka zapisat ćemo u datoteku: if ($ key! = $ LineToKill) fwrite ($ fileHandle, $ value); A ako se podudaraju, nećemo pisati u datoteku, već ispisati poruku o uspješnom brisanju: else echo "Line". $ LineToKill. "Delete."; I na kraju ciklusa, po završetku pisanja u datoteku, pristojno ga zatvorite: fclose ($ fileHandle);
Korak 3
Kompletni kod će izgledati ovako: <? Php $ fileName = "allStrings.txt";
$ lineToKill = 44; $ stringsArray = datoteka ($ fileName);
if ($ lineToKill <= count ($ stringsArray)) {
$ fileHandle = fopen ($ fileName, "w");
$ lineToKill--;
foreach ($ stringsArray kao $ key => $ value) {
if ($ ključ! = $ lineToKill) fwrite ($ fileHandle, $ vrijednost);
else echo "Line". $ lineToKill. "izbrisano.";
}
fclose ($ fileHandle);
}?> Naravno, ovo je najjednostavniji kod u kojem nema zaštite od svih komplikacija koje se mogu pojaviti tokom rada skripte u stvarnim uvjetima. Na primjer, ako datoteka sadrži ogroman broj linija, onda će ih čitanje u niz odgristi dio koji je nedopustivo velik za jednu skriptu iz resursa poslužitelja. Naravno, rad s velikim količinama podataka treba organizirati putem baza podataka, a ne tekstualnih datoteka. Ali ipak, kao obrazovni primjer, dat ćemo kod koji rješava i ovaj problem. Ovdje će se algoritam razlikovati od prethodnog: kako ne bi pohranio ogroman broj linija u polje, skripta će čitati iz izvorne datoteke jedan po jedan redak i upisivati ih jednu po jednu u privremenu datoteku. Na kraju ovog postupka izvorna datoteka će se izbrisati, a privremena datoteka će se premjestiti na svoje mjesto.
Korak 4
Ova skripta započet će na isti način kao i prethodna:
$ fileName = "allStrings.txt";
$ lineToKill = 44;
Zatim trebate stvoriti privremenu datoteku za rad. Učinimo to u mapi "tmp" i dajmo isti prefiks privremenoj datoteci: $ tempFile = tempnam ("/ tmp", "tmp"); Pokušajmo sada otvoriti izvornu datoteku za čitanje: if ($ fileHandle = @fopen ($ fileName, "rb")) {
// ovaj kod će se izvršiti u slučaju normalnog otvaranja izvorne datoteke
} Ako ovo ne uspije - daljnji rad skripte nema smisla, ubijamo postupak izdavanjem odgovarajuće poruke: else die ("Izvorna datoteka ne postoji!"); Ako je datoteka normalno otvorena, tada ispisat će obavijest o tome i pokušati otvoriti prethodno stvorenu privremenu datoteku s odgovarajućom porukom: echo "Izvorna datoteka postoji";
if ($ tempHandle = fopen ($ tempFile, "w")) echo "Privremena datoteka je stvorena."; Sada je vrijeme da započnemo petlju čitanja redova iz izvorne datoteke, koja će se nastaviti sve dok ne pogodi kraj datoteka: while (! feof ($ fileHandle)) {
// ovdje će biti kod za rad s trenutnom linijom
} Na svakom koraku petlje čitat ćemo po jedan redak: $ lineToWrite = fgets ($ fileHandle); A ako ovo nije redak koji treba izbrisati, zapišite ga u privremenu datoteku. Brojač linija $ lineNum bit će izravno uvećan u operaciji upoređivanja: if ($ lineToKill! = (++ $ lineNum)) fwrite ($ tempHandle, $ lineToWrite); Kada crte ponestanu, zatvorite datoteku: fclose ($ fileHandle);
fclose ($ tempHandle); Konačno, preimenujte privremenu datoteku u originalnu. Ako je ova operacija uspješna, tada ćemo izdati odgovarajuću poruku: if (preimenovati ($ tempFile, $ fileName)) echo "Red $ lineToKill je izbrisan";
Korak 5
Potpuni kod:
<? php $ fileName = "allStrings.txt";
$ lineToKill = 44; $ tempFile = tempnam ("/ tmp", "tmp");
if ($ fileHandle = @fopen ($ fileName, "rb")) {
echo "Izvorna datoteka postoji";
if ($ tempHandle = fopen ($ tempFile, "w")) echo "Privremena datoteka je kreirana.";
}
else die ("Izvorna datoteka ne postoji!"); while (! feof ($ fileHandle)) {
$ lineToWrite = fgets ($ fileHandle);
if ($ lineToKill! = (++ $ lineNum)) fwrite ($ tempHandle, $ lineToWrite);
} fclose ($ fileHandle);
fclose ($ tempHandle);
if (preimenovati ($ tempFile, $ fileName)) echo "Line $ lineToKill uklonjen";?>