Jesteś tutaj: webmade.org >> porady >> php + mysql
autor: Mateusz Bogolubow, ostatnia modyfikacja: 2007-03-27
baza danych
pliki
PHP 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ż:
blog
porady
artykuły
recenzje
wiadomości

© 2004-2008 copyright by webmade.org