PHP jest popularnym językiem programowania działającym po stronie serwera. Oznacza to, że aby móc korzystać z tego rozwiązania, potrzebny jest Serwer WWW z interpreterem PHP, czyli serwer „rozumiejący” jak wykonywać polecenia języka PHP.

Istnieją dwa proste sposoby, aby uzyskać dostęp do takiego serwera. Pierwszym jest zainstalowanie programu tworzącego serwer na naszym komputerze – przykładem takiego rozwiązania jest XAMPP. Drugą z metod jest uzyskanie dostępu do usługi hostingowej zapewniającej obsługę PHP – w tym wypadku można skorzystać z kilkunastodniowych okresów testowych. W praktyce najczęściej PHP współpracuje z serwerem Apache oraz relacyjnymi bazami danych MySQL, działając w środowisku Linux. Cały ten pakiet określany jest skrótowcem LAMP – Linux, Apache, MySQL, PHP. Wspomniany wyżej program XAMP umożliwia korzystanie Apache, MySQL, PHP w środowisku Windows tak, że korzystając z usługi hostingowej nie musimy się zbytnio orientować w systemie Linux. W tym artykule nie będziemy zajmować się głębiej bazami danych, nie są one konieczne, aby móc korzystać z PHP, niemniej jednak ich wykorzystanie w połączeniu z tym językiem programowania znacząco zwiększa jego możliwości.  

Jakie właściwie korzyści daje nam zastosowanie PHP na stronie internetowej? Przede wszystkim wprowadza typowe dla języków programowania takie elementy, jak zmienne, instrukcje warunkowe, pętle itp., pozwalające na sprawne przetwarzanie treści zawartych na stronie. Wyobraźmy sobie sytuację, że stworzyliśmy serwis internetowy posiadający 100 podstron, który ma jednolity szablon graficzny i układ informacji - przejście na podstronę powoduje wymianę jedynie tekstu artykułu w bloku centralnym strony, a reszta pozostaje bez zmian. Załóżmy, że po pewnym czasie stałaby się konieczna aktualizacja informacji kontaktowych na takiej stronie. W przypadku strony opartej wyłącznie na HTML i CSS, oznacza to ręczną aktualizację każdej z tych 100 podstron. Gdyby taka strona była napisana z wykorzystaniem PHP, a informacje kontaktowe przechowywane byłyby w zmiennej, ich aktualizacja wymagałaby jedynie modyfikacji treści jednej czy dwóch zmiennych. Oczywiście PHP daje o wiele więcej korzyści, o których łatwo przekonać się zestawiając stronę napisaną w HTML i CSS ze stroną opartą o system zarządzania treścią powstały na bazie PHP i relacyjnych baz danych. Już nawet sama możliwość zarządzania treścią strony z panelu administracyjnego zamiast każdorazowego ręcznego edytowania kodu, świadczy o użyteczności PHP.

PHP jest także niezwykle użyteczny w sytuacji, gdy chcemy wykorzystywać formularze i następnie przetwarzać dane uzyskane za ich pośrednictwem. W przeciwieństwie do języka Javascript działającego po stronie przeglądarki, PHP nie można po prostu wyłączyć, co sprawia, że język ten może np. zapewnić stałą weryfikację danych nadchodzących z formularzy zawartych na stronie.

Programowanie w PHP właściwie wymaga znajomości HTML, ponieważ ten język programowania został stworzony, aby dawać wynik swojego działania właśnie w postaci HTML. Warto przy tym pamiętać, że każdy dokument html może być również dokumentem php, wystarczy zmienić rozszerzenie pliku z html na php, w ten sposób zyskujemy plik, w którym możemy stosować polecenia języka programowania, o którym jest tu mowa. PHP, jak każdy język, posiada zdefiniowaną składnię, z którą można zapoznać się na http://php.net/manual/pl/ lub w formie bardziej przystępnej na http://www.w3schools.com/php/.

W celu zademonstrowania niektórych możliwości PHP napisałem prosty program, którego kod zawiera liczne komentarze o charakterze objaśnień. Program w uproszczeniu działa w ten sposób, że ze zdefiniowanej puli pytań losuje pytanie i umożliwia użytkownikowi podanie odpowiedzi, która następnie jest porównywana z poprawnymi odpowiedziami i finalnie wyświetlany jest wynik informujący czy udzielona odpowiedź jest poprawna, czy nie.


Kod programu

<!doctype html>
<html>

<head>
	<meta charset="utf-8">
	<title>Lekcja PHP</title>
</head>

<body>


<!--Instrukcje PHP wprowadzane są w kodzie HTML poprzez deklarację 
<?php 
/*i zamykane poleceniem: */
?>
-->


<?php 

/*---------------------Zdefiniowanie pustych zmiennych---------------------------------------------*/
/* Wstępnie ze względów bezpieczeństwa definiowane są puste zmienne. 
W dalszej części jest mowa o definiowaniu zmiennych  */


$odpowiedz_1 ="";
$odpowiedz_2 ="";
$odpowiedz_3 ="";

$pytanie_1="";
$pytanie_2="";
$pytanie_3="";

$dobra_odpowiedz="";
$zla_odpowiedz="";
$brak_odpowiedzi="";

$wylosowany_klucz="";
$wylosowane_pytanie_z_tablicy="";
$wylosowane_pytanie="";
$wpisana_odpowiedz_na_pytanie="";
$tablica=""; 
$zmienna="";


/*---------------------Definicja funkcji filtrującej---------------------------------------------*/
/*Tworzę funkcję filtrującą, sprawdzającą dane, które będą nadchodziły z formularza*/

/*Funkcje zasadniczo dzieli się na zdefiniowane odgórnie w PHP (stanowiące część tego języka)
oraz na funkcje tworzone przez programistów na potrzeby pisanych przez nich programów. 
Pierwsze z nich są dość dobrze opisane w dokumentacji, drugie często stanowią zespoły funkcji
przynaleznych PHP. W tym wypadku funkcja o nazwie filtrowanie przetwarza zmienne przekazane do
niej jako parametr i wykonuje na niej szereg operacji, których głównym celem jest oczyszczenie
danych z niepożądanych znaków - wzgląd na bezpieczeństwo. Formularze stanowią zawsze swoiste
punkty dostępowe do naszego programu i niekontrolowany wpływ informacji może doprowadzić do
poważnych konsekwencji. Jeżeli nie jest pisany z myślą o publikacji, to można do kwestii
bezpieczeństwa przykładać mniejszą wagę i skupić się na innych działaniach. Poniżej widoczna
jest jedynie definicja funkcji, coś na kształt modelu określonego działania. 
Tak zdefiniowaną funkcję trzeba wywołać aby móc wykorzystać jej możliwości. 
O wywoływaniu funkcji będzie mowa poniżej*/

function filtrowanie($zmienna) 
{
  $zmienna = trim($zmienna); // trim - usuwa z początku i końca ciągu puste znaki
  $zmienna = stripslashes($zmienna); // stripslashes - usuwa z ciągu '\'
  $zmienna = htmlspecialchars($zmienna); // usuwa kod html z ciągu;
  return $zmienna; // polecenie return zwraca przetworzoną powyższymi funkcjami zmienną
}

/* 

*Ciągiem w przypadku tego programu jest np. wpisana przez użytkownika odpowiedź na pytanie.


/*---------------------Zdefiniowanie pytań---------------------------------------------*/
/*Nasz program musi gdzieś przechowywać treść pytań, do tego celu wykorzystamy zmienne oraz tablicę.*/

/*Aby zdefiniować zmienną należy zastosować składnię widoczną poniżej. 
Nazwy zmiennych mogą być w zasadzie dowolne. 
Na potrzeby zwiększenia wyrazistości zastosowałem możliwie klarowne i opisowe ich nazewnictwo, 
nazywając zmienne a także funkcje, należy unikać tzw. polskich znaków.*/


$pytanie_1="W którym miesiącu zakończyła się definitywnie pierwsza wojna światowa? (nazwa miesiąca w mianowniku)";
$pytanie_2="W którym roku wybuchła rewolucja październikowa?";
$pytanie_3="Jak nazywa się miasto we Francji, w którego okolicach w roku 1916 
rozgrywała się długotrwała bitwa obliczona na wyniszczenie walczących stron?";

/*Zmienne można grupować w tablice i następnie przeprowadzać na takim uporządkowanym zbiorze operacje. 
Poniżej znajduje się składania tworząca prostą tablicę i przypisującą ją do zmiennej "tablica"*/
$tablica=array($pytanie_1, $pytanie_2, $pytanie_3); 

/*---------------------Zdefiniowanie odpowiedzi---------------------------------------------*/

/*Podobnie, jak w przypadku pytań, definiowane są zmienne odpowiedzi, 
nie będziemy jednak tworzyć dla nich tablicy - nie ma takiej potrzeby*/
$odpowiedz_1 = "listopad";
$odpowiedz_2 = "1917";
$odpowiedz_3 = "verdun";

/*---------------------Losowania pytania---------------------------------------------*/


/*Tablica zawierająca pytania jest zbiorem uporządkowanym na zasadzie przypisania każdej wartości, 
w tym wypadku treści konkretnego pytania, określonej pozycji nazywanej kluczem. 
Numeracja kluczy zaczyna się od 0 a nie od 1, w rezultacie pierwsze pytanie jest na pozycji zero w tablicy. 
Na danych w tablicy można przeprowadzić losowanie za pomocą specjalnej funkcji array_rand, 
która między innymi potrafi wylosować z tablicy klucz. 
Wynik działania funkcji przypisywany jest do zmiennej $wylosowany 
- sama funkcja przyjmuje dwa argumenty, pierwszym jest wskazanie tablicy, 
na której ma być przeprowadzone losowanie, drugim cyfra określająca jak wiele kluczy 
ma ta funkcja nam zwrócić jako wynik swojego działania*/
$wylosowany_klucz=array_rand($tablica, 1);

/*Mając wylosowany klucz możemy wskazać w tablicy konkretne przechowywane w niej pytanie 
i taką informację zawrzeć w zmiennej $wylosowane_pytanie_z_tablicy. 
Odczytanie wylosowanej pozycji dokonywane jest poprzez wskazanie tablicy 
i następnie odwołanie poprzez zdefiniowanie konkretnej pozycji, 
w tym wypadku wskazywany jest właśnie wylosowany uprzednio klucz, 
poprzez podstawienie w miejsce klucza (normalnie jest to wartość w postaci cyfry) zmiennej $wylosowany_klucz, 
która może przybrać wartość 0, 1 lub 2.*/
$wylosowane_pytanie_z_tablicy = $tablica[$wylosowany_klucz];


/*---------------------Formularz----------------------------------------------------*/
/*Następnie konstruujemy nasz formularz, dzięki któremu będziemy mogli wprowadzać do programu odpowiedzi, 
które będą w nim przetwarzane. Formularz zdefiniowany jest w html, który zawiera wstawki kodu PHP. 
Na uwagę zasługuje parametr action, który zawiera wywołanie "echo" zmiennej $_SERVER['REQUEST_URI'] 
z tablicy serwera ujęte w funkcje htmlspecialchars. Taka konstrukcja pozwala bezpiecznie wysłać dane z formularza do pliku, 
w którym on się znajduje, a nie gdzieś do innego pliku PHP. Formularz wysyła się więc niejako sam do siebie, 
co związane jest z tym, że jest jednocześnie przetwarzany w tym samym pliku, w którym został skonstruowany, 
takie rozwiązanie ułatwia działanie formularza. W przeciwnym razie kierowalibyśmy dane do innego pliku PHP, 
który wyświetlałby wynik naszych działań i przed ponownym ich podjęciem musielibyśmy powrócić do strony z formularzem. 
Na tym etapie najlepiej jest przyjąć istnienie takiego rozwiązania i nie przejmować się tym, że może być ono jakoś niejasne. 
Formularz korzysta z metody wysłania typu POST, jest to optymalny sposób wysyłania treści formularza, 
alternatywą jest GET, które jednak ze względów bezpieczeństwa nie powinno być tutaj stosowane. 
W formularzu znajduje się kilka poleceń echo - służą one do wyświetlania na ekranie treści zmiennych 
lub wprost zdefiniowanych ciągów znaków, echo może zawierać także znaczniki html. 
Ciągi znaków ujmujemy w tym poleceniu w "", natomiast zmienne mogą być podawane bez nich. 
Łączenie ciągów i zmiennych przeprowadza się za pomocą kropki. 
Za pomocą polecenia echo wywoływane jest w formularzu pytanie, 
które zostało uprzednio wylosowane. Jest ono także przekazywane jako wartość (value) ukrytego pola formularza 
- takie rozwiązanie pozwala nam przesłać istotną informację do późniejszego zweryfikowania odpowiedzi
- służy ono "zapamiętaniu" pytania na jakie została udzielona odpowiedź.
*/
?>

<form id="formularz" action="<?php echo htmlspecialchars($_SERVER['REQUEST_URI']);?>" method="post" enctype="multipart/form-data">
    
    <br/>
    
    <label for="pytanie">Proszę odpowiedzieć na poniższe pytanie:
    <p><?php echo $wylosowane_pytanie_z_tablicy; ?></p></label>
    <input type="text" name="odpowiedz_z_formularza">
   
    <br/>
    
    <input type="hidden" name="pytanie_zapamietane_z_formularza" value="<?php echo $wylosowane_pytanie_z_tablicy?>" />
    
    <br/>
    
    <input type="submit" value="Wyślij">
    
    <br/>
    <br/>
    
</form>
<hr/>
<?php


/*---------------------Przyjmowanie danych z formularza---------------------------------------------*/
/*
W momencie wpisania i wysłania wypowiedzi formularz, jak to już była mowa, przekazuje dane do pliku, 
którym sam został zdefiniowany. Dane przesyłane z formularza są przechowywane w tablicy POST, 
w której w przeciwieństwie do tablicy agregującej pytania, kluczami są pola "name" z formularza. 
Aby odebrać dane z formularza trzeba odwołać się do tablic POST 
i kluczy zdefiniowanych przez atrybuty name pól formularza. 
W tym celu tworzymy zmienne, które przechowywać będą odebrane dane - 
definiując je korzystamy z uprzednio zdefiniowanej funkcji filtrowanie, 
którą w tym miejscu wywołujemy, i która to oczyszcza napływające dane ze zbędnych znaków, 
mogących wchodzić w skład otrzymanych informacji. 
ywołanie funkcji polega na podaniu jej nazwy i przekazaniu jej zmiennej, 
w wypadku danych z formularza będzie to określony element tablicy $_POST wskazywany przez klucz 
np. odpowiedz_z_formularza (patrz parametr name w formularzu). Dodatkowo, w przypadku treści odpowiedzi, 
na taką konstrukcję nakładana jest funkcja strtolower, która sprawia, że ciąg znaków odpowiedzi 
jest przekształcany na małe litery, dzięki czemu nie trzeba przygotowywać później instrukcji sprawdzających 
czy odpowiedź została napisana z dużych czy z małych liter itp. 
*/


$wylosowane_pytanie=filtrowanie($_POST["pytanie_zapamietane_z_formularza"]); 

$wpisana_odpowiedz_na_pytanie=strtolower(filtrowanie($_POST["odpowiedz_z_formularza"]));

/* Dane otrzymane z formularza powinny być także zweryfikowane pod względem ich objętości. 
Aby to zrobić można zastosować funkcję mierzącą długość ciągu o nazwie strlen i wynik jej działania przypisać do zmiennej  */
$dlugosc_wpisanej_odpowiedzi_na_pytanie=strlen($wpisana_odpowiedz_na_pytanie);

/*Następnie trzeba sprawdzić, czy odpowiedź na pytanie z formularza ma odpowiednią długość, 
w tym konkretnym wypadku, czy nie jest dłuższa niż 10 znaków.
Aby wykonać tego rodzaju weryfikację, należy zastosować instrukcję warunkową if - po polsku,
należy ją tłumaczyć w ten sposób: Jeżeli (warunek) zostanie spełniony, to {wykonaj zdefiniowanie działania}. 
Dodatkowo często instrukcja ta uzupełniana jest przez else - w przeciwnym razie - {wykonaj następujące operacje}. 
Można także stworzyć bardziej skomplikowaną instrukcję warunkową if zawierającą w sobie inne warunki
w postaci serii poleceń else if {wykonaj następujące operacje}. Dzięki instrukcjom warunkowym możliwe 
jest sterowanie dzianiem programu. W przypadku sprawdzenia długości odpowiedzi instrukcja warunkowa 
obejmuje duży fragment kodu i kończy się niemal u samego jego końca. Dodatkowo dopełniania jest przez else.
Takie rozwiązanie pozwala zatrzymać przetwarzanie odpowiedzi, gdy jest ona zbyt długa i wyświetlić stosowny komunikat. 
Jeżeli odpowiedź spełnia warunek, to możliwe jest jej dalsze przetwarzanie. 
Sama instrukcja if zawiera w nawiasie okrągłym warunek skonstruowany ze zmiennej podlegającej sprawdzeniu, 
operator porównania mniejszość bądź równość <= oraz wartości liczbowej, 
do której długość ciągu jest porównywana. Natomiast w klamry ujęty jest kod służący, 
który ma się wykonać, gdy warunek zostanie spełniony.
*/

if ($dlugosc_wpisanej_odpowiedzi_na_pytanie <= 10 ) {

/*W tej instrukcji dokonywane jest sprowadzenie za pomocą funkcji empty czy dana zmienna jest pusta, 
jeżeli jest, to definiowana jest zmienna przechowująca o tym fakcie informację*/
if (empty($wpisana_odpowiedz_na_pytanie)) {
$brak_odpowiedzi="tak";
}


/*---------------------Weryfikacja poprawności odpowiedzi---------------------------------------------*/

/*Sprawdzenie poprawności odpowiedzi dokonywane jest przez serię instrukcji warunkowych. 
Odbywa się na zasadzie następujących po sobie porównań (operator równości ==), 
najpierw sprawdzane jest czy wylosowane pytanie odpowiada pytaniu z konkretnej pozycji 
w tablicy przechowującej pytanie($tablica[0], $tablica[1], $tablica[2]), jeżeli tak jest, 
to sprawdzany jest warunek czy wpisana odpowiedź jest tożsama z uprzednio zdefiniowaną 
poprawną odpowiedzą na konkretne pytanie. Jeżeli ten warunek jest spełniony, 
to definiowana jest zmienna o wartości 1, co oznacza prawdę, jeżeli warunek nie został spełniony, 
to wykonuje się polecenie zdefiniowane w else i definiowana jest zmienna odpowiedzialna 
za przechowywanie informacji o niepoprawnej odpowiedzi z wartością 0 (fałsz). 
 */



if ($wylosowane_pytanie==$tablica[0]) { 
	
	if ($wpisana_odpowiedz_na_pytanie==$odpowiedz_1)	{
		$dobra_odpowiedz=1;
	}
	else{
		$zla_odpowiedz=0;
	}
}


if ($wylosowane_pytanie==$tablica[1]) { 
	
	if ($wpisana_odpowiedz_na_pytanie==$odpowiedz_2)	{
		$dobra_odpowiedz=1;
	}
	else{
		$zla_odpowiedz=0;
	}
}


if ($wylosowane_pytanie==$tablica[2]) {
	
	if ($wpisana_odpowiedz_na_pytanie==$odpowiedz_3)	{
		$dobra_odpowiedz=1;
	}
	else{
		$zla_odpowiedz=0;
	}
}

/*---------------------Komunikaty---------------------------------------------*/

/* W tym miejscu znajduje się polecenie wyświetlające zawartość tablicy $_POST, 
dzięki czemu możliwe jest sprawdzenie, czy są w niej przechowywane jakieś informacje napływające z formularza*/
print_r($_POST);

echo "<hr/>";

/*Na tym etapie konieczne jest poinformowanie użytkownika o wynikach wcześniej przeprowadzonych porównań. 
W tym celu konieczne jest sformułowanie instrukcji warunkowych, które wyświetlą odpowiednie informacje, 
w tym wynik sprawdzenia odpowiedzi*/

/*
Przede wszystkim trzeba wyświetlić pytanie, którego odpowiedź dotyczy. Jest to konieczne, 
ponieważ program działa w ten sposób, że przesyłając odpowiedź, odświeża jednocześnie stronę, 
co sprawia, że wykonywany jest cały kod zawarty w pliku - takie rozwiązanie skutkuje tym, 
że niemal jednocześnie dokonywana jest weryfikacja odpowiedzi na pytanie oraz losowane kolejnego pytania, 
w rezultacie na stronie widoczne jest "stare" jak i "nowe" pytanie. 
Takie rozwiązanie zapewnia płynność działania programu, 
można zwyczajnie odpowiadać na nowe pytania i weryfikować poprawność odpowiedzi  
 */
echo "<p>Pytanie: ".$wylosowane_pytanie."</p>";


/*Poniższy kod służy wyświetleniu na ekranie podanej odpowiedzi lub, w przypadku gdy takiej odpowiedzi nie ma, 
zostaje podana stosowna informacja*/
?>
<p>Podana odpowiedź: 
<?php 

if (!$brak_odpowiedzi=="tak") { // W tym miejscu warty uwagi jest poprzedzający zmienną znak "!", 
który oznacza przeczenie - warunek ten należy czytać jeżeli zmienna !$brak_odpowiedzi nie równa się "tak", 
to wykonaj następujący kod, w przeciwnym razie (wykonaj) inny kod.
	echo $wpisana_odpowiedz_na_pytanie;
}
else {
	echo "Nie podano jeszcze odpowiedzi";
}

?> 
</p>
<?php

/*W tym miejscu zdefiniowane są instrukcje odpowiedzialne za wyświetlenie wyniku. 
Korzystają one z uprzednio zdefiniowanych w innych instrukcjach warunkowych zmiennych, 
które stanowią tutaj swoiste punkty odwołań */
if ($brak_odpowiedzi=="tak") {
echo '<p>Rezultat: Brak odpowiedzi.</p>';	
}
else if ($dobra_odpowiedz==1) {
echo '<p>Rezultat: Dobra odpowiedź.</p>';
}
else if ($zla_odpowiedz==0) {
echo '<p>Rezultat: Zła odpowiedź.</p>';
}


} /*Koniec instrukcji warunkowej sprawdzającej długość odpowiedzi */

else { /*Jeżeli długość odpowiedzi nie spełnia założonego warunku to: */
	echo "Zbyt długa odpowiedź";	
}
?>


</body>
</html>

Odsyłacz do działającego programu