[PHP][MySQL] Jak wygenerować statyczny plik .html z bazy danych?
Chcesz stworzyć statyczny plik HTML zawierający informacje pobrane z bazy danych.
Jeżeli informacje w Twojej bazie danych nie zmieniają się zbyt często, a serwis ma bardzo dużą oglądalność, nie opłaca się za każdym razem pobierać danych z bazy i wypisywać ich na stronie. Dobrym przykładem są notowania walut, które ustalane są raz dziennie - można je umieścić w pliku HTML zamiast każdorazowo pobierać z bazy danych.
Połączenie z bazą danych i czas potrzebny na pobranie wyników w przypadku jednej osoby może okazać się znikomy, praktycznie niezauważalny. Natomiast gdy tą samą czynność będzie wykonywać tysiące osób przez cały dzień, a jeszcze gdy notowania będą widoczne na każdej stronie - wtedy pojawią się poważne problemy z wydajnością serwera, szczególnie gdy do bazy danych kierujesz skomplikowane pytania zawierające np. sortowanie rekordów.
Aby ustrzec się przed taką sytuacją, na podstawie danych z tabeli w bazie danych można stworzyć statyczny plik HTML, który będzie dołączany do każdej ze stron. Jego zawartość będzie zmieniana tylko wtedy gdy nastąpi aktualizacja bazy danych, a więc stosunkowo niewiele razy w ciągu dnia.
Ponieważ będzie on zawierał tylko HTML, łatwo można go podpiąć do dowolnej strony, a czas jego pobrania i pokazania na stronie będzie natychmiastowy, bez jakichkolwiek strat i obciążania serwera.
Stwórzmy przykładową tabelę z ogłoszeniami i zapiszmy z niej np. 3 ostatnio dodane ogłoszenia do pliku HTML, aby potem można go było włączyć do innych podstron. Niech nasza tabela ma prostą konstrukcję na potrzeby tego przykładu:
CREATE TABLE ogloszenia (
id INT NOT NULL PRIMARY KEY auto_increment,
nadawca CHAR(100) NOT NULL,
tresc TEXT NOT NULL
);
Teraz dodajmy kilka ogłoszeń:
INSERT INTO ogloszenia (nadawca,tresc)
VALUES ("Janek", "Sprzedam tokarke z 1965 r.");
INSERT INTO ogloszenia (nadawca,tresc)
VALUES ("Piotr", "Kupie uszkodzony samochod");
INSERT INTO ogloszenia (nadawca,tresc)
VALUES ("Anna", "Szukam pracy na stanowisku ksiegowej");
INSERT INTO ogloszenia (nadawca,tresc)
VALUES ("Arek", "Zamienie dom na apartament");
Co ostatecznie stworzy nam tabelę w takiej postaci:
id | nadawca | tresc
---+---------+---------------------------------------
1 | Janek | Sprzedam tokarke z 1965 r.
2 | Piotr | Kupie uszkodzony samochod
3 | Anna | Szukam pracy na stanowisku ksiegowej
4 | Arek | Zamienie dom na apartament
Najnowsze ogłoszenie ma numer 4, ponieważ pole ID jest typu auto_increment, a więc zwiększa się po dodaniu kolejnego ogłoszenia.
Chcemy pobrać trzy ostatnio dodane ogłoszenia i zapisać je do pliku. Należy to zrobić po każdym dopisaniu nowego ogłoszenia aby uaktualnić plik HTML. W ten sposób aby odczytać najnowsze ogłoszenia i pokazać je na wszystkich stronach serwisu wystarczy sięgać do bazy tylko tyle razy ile dodanych zostało ogłoszeń. W przeciwnym wypadku wciąż trzeba by było pobierać nowe rekordy, co w wypadku dużej ilości ogłoszeń i odwiedzających przeciążyłoby serwer.
Stwórzmy zatem skrypt, który zapisze do pliku ostatnio dodane ogłoszenia. Oczywiście w zależności od konstrukcji tabeli musisz zmodyfikować wygląd zapisywanych danych, ale jest to proste do zrobienia mając już gotowy szablon w postaci uniwersalnego przykładu:
<?
// połączenie z bazą i pobranie danych
$baza=mysql_connect("localhost", "user", "password");
mysql_select_db("baza1",$baza);
$wynik=mysql_query(
"SELECT * FROM ogloszenia ORDER BY id DESC LIMIT 3",$baza);
mysql_close($baza);
// formatowanie strony
$wierszy = mysql_num_rows($wynik);
$pol = mysql_num_fields($wynik);
$strona .= "<table border=1 cellpadding=5 cellspacing=1><tr>
<td><b>id</b></td><td><b>nadawca</b></td><td><b>ogłoszenie</b></td></tr>";
for ($i=0;$i<$wierszy;$i++) {
$wiersz = mysql_fetch_row($wynik);
$strona .= "<tr>";
for ($j=0;$j<$pol;$j++) $strona .= "<td>".$wiersz[$j]."</td>";
$strona .= "</tr>";
}
$strona .= "</table>";
// echo $strona; //aby wyświelić stworzony kod na stronie WWW
//zapisanie do pliku
$f=fopen("ogloszenia3.html","w");
fputs($f,"$strona\n");
fclose($f);
?>
W pierwszych linijkach skryptu łączymy się z bazą danych aby pobrać ogłoszenia spełniające nasze kryteria wyszukiwania. Ponieważ są to ogłoszenia dodane ostatnio, więc sortujemy wynik względem pola id w porządku odwróconym (ORDER BY id DESC), a więc od największej wartości id do najmniejszej. Ponieważ chcemy dostać tylko trzy ostatnie, dodajemy jeszcze ograniczenie ilości w wyniku do trzech (LIMIT 3).
Kolejny blok programu odpowiada za formatowanie elementów HTML i włożenie do kodu pobranych wyników. Cały utworzony tekst HTML zostaje dodawany do zmiennej $strona.
W pierwszym etapie konstruowania statycznej strony zamiast umieszczać wszystko w zmiennej lepiej zastosować od razu echo aby oglądać wynik na ekranie. Dopiero potem można wszystkie echo zamienić na zmienną, która będzie zawierać kod HTML z wynikami z tabeli.
W naszym przykładzie tworzę tabelę w HTML, gdzie zostają zapisane trzy rekordy. W takiej postaci statyczna strona będzie dołączana do innych stron w serwisie.
Przed ostatecznym zapisaniem kodu HTML możesz jeszcze podglądnąć, jak będzie on wyglądał za pomocą echo $strona. W tej chwili ta linijka jest komentarzem.
Na końcu tradycyjna procedura zapisania kodu HTML do pliku ogloszenia3.html. Mamy już trzy ostatnie ogłoszenia w statycznym HTMLu, więc można go umieścić na dowolnej stronie stosując zwykłego "includa":
include("ogloszenia3.html");
Jeżeli chcesz stworzyć niezależną stronę HTML, wtedy przed zapisaniem zmiennej $strona musisz dodać jeszcze nagłówek strony i stopkę, np. w ten sposób:
<?
$naglowek = '
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html><head><meta http-equiv="content-type"
content="text/html; charset=iso-8859-2">
<title>tytuł strony</title></head><body>';
$stopka = '</body></html>'
$strona = $naglowek.$strona.$stopka;
//zapisanie do pliku
$f=fopen("ogloszenia3.html","w");
fputs($f,"$strona\n");
fclose($f);
?>