Jesteś tutaj: webmade.org >> porady >> php + mysql
autor: Mateusz Bogolubow, ostatnia modyfikacja: 2007-03-27
W tej poradzie przedstawię sposób przechowywania danych w plikach - ich zapisywanie, odczytywanie, usuwanie, edytowanie, sortowanie oraz przeszukiwanie. Baza będzie przechowywać imię, nazwisko i miejsce zamieszkania.
Trzeba jednak jasno powiedzieć, że nie jest to najlepszy pomysł jeśli chodzi o efektywność (bardzo obciąża serwer), ale jeśli danych nie ma dużo to nie ma co się tym bardzo przejmować.
Na początek stwórz plik db.txt, w którym będą przechowywane nasze dane i nadaj mu chmod o wartości 666.
Tworzymy plik dodaj.php i wprowadzamy do niego kod:
<?php if ($_POST['button'] == "wyslij") { /* sprawdzam czy dane zostały wysłane z formularza */ $plik = "db.txt"; if (is_writeable($plik)) { /* sprawdzam czy plik jest do zapisu */ if (!$handle = fopen($plik, "a")) echo "Nie mogę otworzyć pliku..."; if (fwrite($handle, $_POST['imie']." || ".$_POST['nazwisko']." || ".$_POST['miejscowosc']." ") === FALSE) echo "Nie mogę zapisać danych do pliku..."; else echo "Dane zostały dodane..."; fclose($handle); } else echo "Plik nie istnieje lub jest nie do zapisu..."; } ?> <form action="dodaj.php" method="post"> Imię: <input type="text" name="imie" /><br /> Nazwisko: <input type="text" name="nazwisko" /><br /> Miejscowość: <input type="text" name="miejscowosc" /><br /> <input type="submit" name="button" value="wyslij" /> </form>
Sądzę, że kod jest jasny (jeśli nie to proponuje zapoznać się z poradą zapis i odczyt z pliku) - pobieramy dane z formularza za pomocą $_POST i zapisujemy je do pliku. Warto jednak zauważyć w jaki sposób jest to robione. Każda wartość jest oddzielona separatorem (" || ") zaś na końcu znajduje się znak nowej linii, co jest bardzo istotna rzeczą, która bardzo ułatwi nam w dalszej części odpowiedni odczyt danych.
Proponuje przetestować kod na swoim serwerze i dodać parę pozycji, aby móc w dalszej części je odczytać.
Do pliku pokaz.php dodaj kod
<?php $plik = "db.txt"; $dane = file($plik); /* pobieram dane z pliku i zapisuje do tablicy (linia = rekord) */ for($i=0;$i<count($dane);$i++) { /* przeszukuję tablicę */ list($imie[$i], $nazwisko[$i], $miejscowosc[$i]) = explode(" || ", $dane[$i]); /* dziele linię na tablicę i zapisuje dane do odpowiednich zmienncyh */ } for($i=0;$i<count($imie);$i++) /* przeszukuję tablicę */ echo $imie[$i]." ".$nazwisko[$i].", ".$miejscowosc[$i]."<br />"; /* wyświetlam dane */ ?>
Dane z pliku są odczytywane za pomocą funkcji file() tworzącej tablicę, której elementami są odpowiednie linie z pliku. Tak więc każdy element tablicy jest naszym osobnym rekordem bazy.
Następnie za pomocą funkcji explode() dzielimy jeden element tablicy $dane na kolejną tablicę, gdzie elementem dzielącym będzie nasz separator " || ". Odpowiednie jej elementy przypisujemy zmiennym $imie, $nazwisko, $miejscowość, które również są tablicami. Może brzmi to trochę zawile, ale sądzę ze efekt, który ukaże się w przeglądarce wszystko wyjaśni. Ważne w tym wszystkim jest to, aby wszystkie te tablicę miały ten sam klucz($i).
Plik usun.php:
<?php $plik = "db.txt"; if ((isset($_POST['usun'])) AND (is_numeric($_POST['usun']))) { /* sprawdzam czy zmienna $_POST['usun'] zostala zainicjonowana i czy jest cyfrą */ $dane = file($plik); /* pobieram dane z pliku */ unset($dane[$_POST['usun']]); /* usuwam wybrany rekord tablicy */ $f = fopen($plik, "w"); /* nawiązuje połączenie z plikiem i kasuje jego zawartosc */ foreach($dane as $linia){ fputs($f, $linia); /* wprowadzam linie po linii do pliku */ } fclose($f); /* zamykam polączneie z plikiem */ } ?> <form action="usun.php" method="post"> <select name="usun"> <?php $dane = file($plik); for($i=0;$i<count($dane);$i++) { list($imie[$i], $nazwisko[$i], $miejscowosc[$i]) = explode(" || ", $dane[$i]); } for($i=0;$i<count($imie);$i++) echo '<option value="'.$i.'">'.$imie[$i]." ".$nazwisko[$i].", ".$miejscowosc[$i]."</option>"; ?> </select> <input type="submit" value="usun" /> </form>
W większości kod się powtarza. W formularzu tworzymy pole select wykorzystując odczyt danych z pliku. Każdy rekord z bazy ma swój unikalny numer. Po wybraniu rekordu z bazy jego numer zostaje przesłany do skryptu. Funkcja unset usuwa dany element z bazy. Za pomocą konstrukcji foreach usuwamy pusty element tablicy $dane, a resztę zapisujemy do pliku.
Edycja danych jest niczym innym jak usunięciem odpowiedniego rekordu z naszej bazy i dopisanie nowego "poprawionego". Sądzę ze w ramach praktyki można zrobić to samemu.
Plik sortowanie.php:
<?php $plik = "db.txt"; $dane = file($plik); /* pobieram dane z pliku i zapisuje do tablicy (linia = rekord) */ for($i=0;$i<count($dane);$i++) { /* przeszukuję tablicę */ list($imie[$i], $nazwisko[$i], $miejscowosc[$i]) = explode(" || ", $dane[$i]); /* dzielę linię na tablicę i zapisuje dane do odpowiednich zmienncyh które równiez są tablicami */ } rsort($nazwisko); /* sortownie w porządku odwrotnym do alfabetycznego */ $i=0; while($i < count($nazwisko)) { echo $imie[$i]." ".$nazwisko[$i].", ".$miejscowosc[$i]."<br />"; $i++; } ?>
Uważa, że nie ma tu wiele do tłumaczenia. Jedyne co jest tu nowe to funkcja rsort(), która sortuje tablicę po wartościach w porządku odwrotnym do alfabetycznego(sort()).
Jeśli chcesz wyświetlić jedynie 10 pierwszych wyników sortowania to podmień count($nazwisko) na cyfrę 10.
Plik sortuj.php
<form action="szukaj.php" method="post"> Podaj szukane nazwisko: <input type="text" name="nazw" /> <input type="submit" name="button" value="szukaj" /> </form> <?php $plik = "db.txt"; $dane = file($plik); /* pobieram dane z pliku i zapisuje do tablicy (linia = rekord) */ if ((isset($_POST['nazw'])) AND (trim($_POST['nazw']) != "")) { /* sprawdzam czy zmienna została zainicjonowana i czy jej wartość nie jest pusta */ for($i=0;$i<count($dane);$i++) /* przeszukuję tablicę */ list($imie[$i], $nazwisko[$i], $miejscowosc[$i]) = explode(" || ", $dane[$i]); /* dziele linię na tablicę i zapisuje dane do odpowiednich zmienncyh */ for($i=0;$i<count($nazwisko);$i++) if (strpos($nazwisko[$i],$_POST['nazw']) !== false) /* sprawdzam czy szukany ciąg znaków znajduje się w zmiennej $nazwisko[$i] */ echo $imie[$i]." ".$nazwisko[$i].", ".$miejscowosc[$i]."<br />"; /* wyświetlam dane w ktore spelnialy powyzszy warunek */ } ?>
Dla ułatwienia i zmniejszenia objętości skryptu wprowadziłem pewne ograniczenie - przeszukujemy jedynie według nazwiska.
Przejdźmy może od razu do sedna sprawy czyli ostatniej pętli for. Funkcja strpos() przeszukuje zawartość zmiennej podanej w pierwszym argumencie w poszukiwaniu ciągu znaków podanym w drugim argumencie i zwraca pozycje, na której on się znajduje. Jeśli szukany ciąg znaków nie został odnaleziony funkcja zwraca FALSE.
Sposoby jakie tu przedstawiłem, są zapewne jednymi z wielu. Chciałem jednak pokazać pewne rozwiązania, które można pod szlifować i cieszyć się własną bazą danych opartą na plikach. Mam nadzieje, że skrypty są wystarczająco objaśnione.
Mateusz Bogolubow
szukaj: baza danych pliki PHP
Osoby czytające tę publikację przeglądały również:
© 2004-2008 copyright by webmade.org