webmaster webmastering webdesign

Jesteś tutaj: webmade.org >> porady >> php + mysql

Baza danych oparta na plikach

autor: Mateusz Bogolubow, ostatnia modyfikacja: 2007-03-27

szukaj: baza danych baza danych pliki pliki PHP 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.

Dodawanie danych

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ć.

Odczytywanie danych

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).

Usuwanie danych

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

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.

Sortowanie danych

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.

Przeszukiwanie danych

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.

Podsumowanie

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

Osoby czytające tę publikację przeglądały również:

Chcesz zostać programistą?

Poznaj 6 kroków do efektywnej
nauki programowania!

 

valid XHTML
valid CSS
© 2004-2008 copyright by webmade.org