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

Usunięta treść Dodana treść
Beau (dyskusja | edycje)
sprzątanie kodu
Nie podano opisu zmian
 
Linia 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.
 
<sourcesyntaxhighlight lang="php"><?php
define('WPISY', './wpisy.txt');
Linia 27:
$autor = trim($autor);
$www = trim($www);
$tresc = trim($tresc);</sourcesyntaxhighlight>
 
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ę.
 
<sourcesyntaxhighlight lang="php"> // Kontrola danych
if(strlen($tytul) < 3)
Linia 55:
$www = 'http://'.$www;
}
}</sourcesyntaxhighlight>
 
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 61:
Jeżeli któraś z informacji nie będzie prawidłowo podana, funkcja zwróci do skryptu wartość '''false'''.
 
<sourcesyntaxhighlight lang="python"> // Dodawanie
$f = fopen(WPISY, 'a');
Linia 76:
fclose($f);
return true;
} // end dodajWpis();</sourcesyntaxhighlight>
 
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 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:
 
<sourcesyntaxhighlight lang="php">$tresc = htmlspecialchars($tresc);
$tresc = nl2br($tresc);
$tresc = base64_encode($tresc);</sourcesyntaxhighlight>
 
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 97:
Przyszła kolej na funkcję pobierającą wpisy.
 
<sourcesyntaxhighlight lang="python"> function pobierzWpisy()
{
$wpisy = array_reverse(file(WPISY));
$i = 1;
$rezultat = array();</sourcesyntaxhighlight>
 
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.
 
<sourcesyntaxhighlight lang="python"> foreach($wpisy as $wpis)
{
$wpis = explode('|', trim($wpis));
Linia 123:
} // end pobierzWpisy();
?></sourcesyntaxhighlight>
 
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 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:
 
<sourcesyntaxhighlight lang="python"><!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
Linia 142:
<?php
require('./dane.php');</sourcesyntaxhighlight>
 
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:
 
<sourcesyntaxhighlight lang="python"> if($_SERVER['REQUEST_METHOD'] == 'POST')
{
// Dodawanie wpisu
Linia 158:
}
echo '<p><a href="ksiega.php">Powrót</a></p>';
}</sourcesyntaxhighlight>
 
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 164:
Jeżeli nie dodajemy aktualnie żadnego nowego wpisu, wyświetlamy te, które już mamy:
 
<sourcesyntaxhighlight lang="python"> else
{
// Wyświetlanie wpisów
Linia 181:
}
?><hr /></sourcesyntaxhighlight>
 
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 187:
Ostatnim akordem będzie dodanie formularza HTML:
 
<sourcesyntaxhighlight lang="php"> <form method="post" action="ksiega.php">
<table border="0" width="50%">
<tr>
Linia 217:
?>
</body>
</html></sourcesyntaxhighlight>
 
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.