PHP/Studium przypadku - Księga gości: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Ktoosiu (dyskusja | edycje)
Beau (dyskusja | edycje)
sprzątanie kodu
Linia 1:
{{podświetl|php}}
 
{{prognaw|PHP|[[../Korzystanie z dokumentacji/]]|[[../Ćwiczenia/Podstawy języka/|Ćwiczenia]]}}
 
Linia 20 ⟶ 18:
Plik ''dane.php'' zawierać będzie dwie funkcje: ''dodajWpis()'' oraz ''pobierzWpisy()'' zajmujące się wyłącznie operowaniem na danych. Będziemy go pisać po kawałku.
 
<nowikisource lang="php"><?php
define('WPISY', './wpisy.txt');
Linia 29 ⟶ 27:
$autor = trim($autor);
$www = trim($www);
$tresc = trim($tresc);</nowikisource>
 
Nazwę pliku zapisaliśmy za pomocą stałej. To na wypadek, gdyby zachciało nam się go kiedyś przenieść albo zmienić mu nazwę. Pierwszy etap obrabiania danych to ucięcie białych znaków (spacji, tabulatorów itp.) z początku i końca każdego ciągu. Nie są nam one do niczego potrzebne, a jedynie utrudniają nam sprawę.
 
<nowikisource lang="php"> // Kontrola danych
if(strlen($tytul) < 3)
Linia 57 ⟶ 55:
$www = 'http://'.$www;
}
}</nowikisource>
 
Tutaj zajmujemy się kontrolą danych. Tytuł i autor muszą mieć przynajmniej trzy znaki, a treść 10. Długość pobieramy funkcją ''strlen()''. Jeżeli podaliśmy adres WWW, za pomocą funkcji ''strpos()'' sprawdzamy, czy na jego początku jest na pewno dodany identyfikator protokołu. Zwróć uwagę na użyty operator: ''!==''. Wspomniana funkcja zwraca pozycję pierwszego znaku szukanego ciągu (liczoną od zera), a jeżeli go nie znajdzie, zwraca '''false'''. Normalnie ''0'' i '''false''' są równoważne, dlatego musimy wymusić sprawdzenie także typu, bowiem nam chodzi o ''0'' jako pozycję identyfikatora w adresie, a nie informację, że go nie ma.
Linia 63 ⟶ 61:
Jeżeli któraś z informacji nie będzie prawidłowo podana, funkcja zwróci do skryptu wartość '''false'''.
 
<nowikisource lang="python"> // Dodawanie
$f = fopen(WPISY, 'a');
Linia 78 ⟶ 76:
fclose($f);
return true;
} // end dodajWpis();</nowikisource>
 
Ostatni akord to zapisanie wpisu w pliku. Na początek otwieramy go w trybie dopisywania (parametr ''a''), następnie budujemy tablicę z danymi wpisu. Parametry przybyłe z formularza kodujemy w Base64, środkowa kolumna to czas dodania wpisu w sekundach od 1.1.1970. Dzięki takiemu jego zapisowi, będziemy go mogli później dowolnie formatować funkcją ''date()''. Przy przetwarzaniu tekstu użyliśmy jeszcze kilku funkcji:
Linia 91 ⟶ 89:
Oznacza ona, że najpierw zawartość zmiennej ''$tresc'' trafia do funkcji najbardziej w prawo, tj. ''htmlspecialchars()''. Z niej przechodzi do ''nl2br()'', a z niej do ''base64_encode()''. Alternatywne kursy preferują w tym miejscu czytelną, ale mniej wydajną formę zapisu:
 
<source lang="php">$tresc = htmlspecialchars($tresc);
<pre class="lang-php">
$tresc = htmlspecialchars($tresc);
$tresc = nl2br($tresc);
$tresc = base64_encode($tresc);</source>
</pre>
 
Nasz kod ma tę przewagę, że wynik jednej funkcji od razu trafia do drugiego, tymczasem powyżej po drodze trafia do zmiennej, co ma szczególnie negatywny wpływ na wydajność przy dużych danych. Ponadto zapis ten często nie jest opatrzony stosownym komentarzem i wyrabia złe nawyki tworzenia mnóstwa niepotrzebnych zmiennych tymczasowych, o czym już wspominaliśmy. Trzeba zapamiętać, że nawet podawany przez nas wariant konstrukcji księgi nie jest "tym jedynym słusznym". Istnieje jeszcze wiele innych sposobów jej zaprogramowania.
Linia 101 ⟶ 97:
Przyszła kolej na funkcję pobierającą wpisy.
 
<nowikisource lang="python"> function pobierzWpisy()
{
$wpisy = array_reverse(file(WPISY));
$i = 1;
$rezultat = array();</nowikisource>
 
Wpisy pobieramy funkcją ''file()'', która automatycznie rozbija nam plik na tablicę względem wierszy. Tam jednak najnowsze wpisy są na końcu, a my chcemy je wyświetlić w kolejności odwrotnej: najnowsze na górze. Dlatego od razu przepuszczamy wynik przez funkcję ''array_reverse()'' odwracającą tablicę. Następnie inicjujemy licznik wpisów ''$i'' oraz tablicę ''$rezultat'', do której będziemy pakować sformatowane odpowiednio wpisy. Ją później przekażemy księdze do wyświetlenia.
 
<nowikisource lang="python"> foreach($wpisy as $wpis)
{
$wpis = explode('|', trim($wpis));
Linia 127 ⟶ 123:
} // end pobierzWpisy();
?></nowikisource>
 
Po kolei formatujemy każdy wpis. Do ich pobierania wykorzystaliśmy pętlę ''foreach()''. Na wejściu przepuszczamy je przez funkcję ''trim()'', bowiem ''file()'' pozostawia w tablicach znaki zejścia do nowej linii. Dopiero po ich usunięciu możemy funkcją ''explode()'' rozbić ciąg z powrotem na tablicę (czyli wykonać operację odwrotną do ''implode()''). Wpis przepuszczamy przez ''base64_decode()'', aby zdekodować informacje, formatujemy datę i pakujemy to do tablicy ''$rezultat''. Później zwracamy ją.
Linia 134 ⟶ 130:
W pliku tym znajdzie się główna część funkcjonalna księgi. To jego powinniśmy uruchamiać z poziomu przeglądarki. Zaczynamy jego pisanie od nagłówka HTML oraz dołączenia uprzednio napisanego pliku:
 
<nowikisource lang="python"><!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
Linia 146 ⟶ 142:
<?php
require('./dane.php');</nowikisource>
 
Właściwy kod rozpocznie się instrukcją warunkową, która zadecyduje, czy wysłany został formularz dodawania, czy też wystarczy wyświetlić aktualną zawartość księgi. PHP zapisuje informację o użytej metodzie wysyłania żądania w specjalnej zmiennej ''$_SERVER['REQUEST_METHOD']'', która może przyjąć wartości '''POST''' (formularz) albo '''GET''' (zwyczajne żądanie). Z niej właśnie skorzystamy:
 
<nowikisource lang="python"> if($_SERVER['REQUEST_METHOD'] == 'POST')
{
// Dodawanie wpisu
Linia 162 ⟶ 158:
}
echo '<p><a href="ksiega.php">Powrót</a></p>';
}</nowikisource>
 
Kontrola danych jest realizowana w pliku ''dane.php'' i nie ma potrzeby jej tu powtarzać. Wprowadzamy do funkcji ''dodajWpis()'' poszczególne pola formularza i ifem sprawdzamy, jaki jest rezultat, aby móc wygenerować stosowny komunikat.
Linia 168 ⟶ 164:
Jeżeli nie dodajemy aktualnie żadnego nowego wpisu, wyświetlamy te, które już mamy:
 
<nowikisource lang="python"> else
{
// Wyświetlanie wpisów
Linia 185 ⟶ 181:
}
?><hr /></nowikisource>
 
Tablicę z wpisami dostajemy z funkcji ''pobierzWpisy()''. Skanujemy ją pętlą foreach i wyświetlamy każdy z elementów. Zauważ, że skrypt potrafi ominąć pole z adresem WWW, jeśli ten nie został podany. Po prostu funkcją ''strlen()'' sprawdzamy, czy jego długość jest większa od zera.
Linia 191 ⟶ 187:
Ostatnim akordem będzie dodanie formularza HTML:
 
<nowikisource lang="php"> <form method="post" action="ksiega.php">
<table border="0" width="50%">
<tr>
Linia 221 ⟶ 217:
?>
</body>
</html></nowikisource>
 
Formularz wysyłamy metodą '''POST''' do pliku ''ksiega.php''. Jego wysłanie spowoduje uaktywnienie się dodawania wpisów. Przed wysłaniem ostatnich znaczników musimy dodać jeszcze klamrę kończącą instrukcję warunkową, która decyduje, co należy wykonać. Umieszczenie jej w tym miejscu gwarantuje, że formularz pokaże się tylko podczas wyświetlania wpisów. Jeśli skrypt będzie wysyłać komunikat o dodaniu wpisu, nie zostanie on już dołączony.
Linia 227 ⟶ 223:
To już koniec naszej księgi gości. Utwórz teraz pusty plik ''wpisy.txt'' i zacznij korzystanie.
 
=== Co dalej? ===
Napisana tutaj księga nie jest wyrafinowanym szczytem techniki. Jej głównym zadaniem było pokazanie podstawowych mechanizmów tworzenia dynamicznych stron WWW w praktyce. Wraz z powiększaniem się twojej wiedzy o języku PHP możesz rozszerzać ją o nowe możliwości:
* Blokadę przed floodem.