Programy CGI dla baz danych



Podobne dokumenty
Programy CGI dla baz danych

Formularze HTML. dr Radosław Matusik. radmat

LABORATORIUM 2 WSTĘP DO SIECI TELEINFORMATYCZNYCH TABELE I FORMULARZE

Bazy Danych i Usługi Sieciowe

Umieszczanie kodu. kod skryptu

Tworzenie stron internetowych z wykorzystaniem HTM5, JavaScript, CSS3 i jquery. Łukasz Bartczuk

Formularze w PHP dla początkujących

ZAAWANSOWANE BAZY DANYCH I HURTOWNIE DANYCH MySQL, PHP

FORMULARZE. G. Przęczek

Wykład 03 JavaScript. Michał Drabik

Wprowadzenie do Internetu Zajęcia 5

TIN Techniki Internetowe zima

Bazy danych postgresql programowanie i implementacja

FORMULARZE Formularz ma formę ankiety, którą można wypełnić na stronie. Taki formularz może być np. przesłany pocztą elektroniczną .

Aplikacje internetowe - laboratorium

Dokument hipertekstowy

Formularze Pobierają dane od użytkownika strony i wysyłają je do przetworzenia na serwerze (gdzie potrzebne są skrypty,któredaneprzetworzą najczęściej

Laboratorium 1 Wprowadzenie do PHP

Aplikacje WWW - laboratorium

obecnie tabeli nie stosuje się do budowy struktury witryny (stosuje się za to pozycjonowanie elementów i warstwy) faktycznie wymagają

Bazy danych i strony WWW

Podstawy JavaScript ćwiczenia

Aplikacje internetowe

Język PHP. Studium Podyplomowe Sieci Komputerowe i Aplikacje Internetowe. v1.7, 2007/11/23

Format HTML. Wybrane działy Informatyki Stosowanej. Definicja i przeznaczenie Struktura dokumentu Znaczniki Formularze i komponenty

Wybrane znaczniki HTML

Dane - pobieranie, przekazywanie i przechowywanie. dr Beata Kuźmińska-Sołśnia

Aplikacje WWW - laboratorium

Zaawansowane bazy danych i hurtownie danych studia zaoczne II stopnia, sem. I

Na początku utworzymy formularz w czystym języku HTML i przetestujemy go za pomocą przeglądarki WWW.

Aplikacje WWW - laboratorium

6. Bezpieczeństwo przy współpracy z bazami danych

Aplikacje WWW - laboratorium

PHP może zostać rozszerzony o mechanizmy dostępu do różnych baz danych:

BAZY DANYCH. Obsługa bazy z poziomu języka PHP. opracowanie: Michał Lech

SSK - Techniki Internetowe

Ćwiczenie 7 - Formularze

Bazy Danych i Usługi Sieciowe

Programowanie w Sieci Internet Blok 2 - PHP. Kraków, 09 listopada 2012 mgr Piotr Rytko Wydział Matematyki i Informatyki

Dokumentacja smsapi wersja 1.4

Programowanie CGI. Jolanta Bachan Informatyka

Systemy internetowe. Wykład 3 PHP. West Pomeranian University of Technology, Szczecin; Faculty of Computer Science

Tworzenie witryn internetowych PHP/Java. (mgr inż. Marek Downar)

HTML ciąg dalszy. Listy, formularze

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Zajęcia 10 obsługa formularzy w PHP

Języki skryptowe - PHP. PHP i bazy danych. Paweł Kasprowski. pawel@kasprowski.pl. vl07

Lekcja 10. Uprawnienia. Dołączanie plików przy pomocy funkcji include() Sprawdzanie, czy plik istnieje przy pmocy funkcji file_exists()

PHP: bloki kodu, tablice, obiekty i formularze

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

Baza danych do przechowywania użytkowników

Ćwiczenie: JavaScript Cookies (3x45 minut)

Wykład 5: PHP: praca z bazą danych MySQL

Komponent Formularz. Rys. 1. Strona programu Joomla - Rys. 2. Instalacja komponentu

Internetowe bazy danych

GroupWise WebAccess Basic Interface

Funkcje i instrukcje języka JavaScript

Być może jesteś doświadczonym programistą, biegle programujesz w Javie,

Aplikacje WWW - laboratorium

Podstawy technologii WWW

Referat z przedmiotu Technologie Internetowe SPIS TREŚCI

INSTALACJA I KONFIGURACJA SERWERA PHP.

Skrypty powłoki Skrypty Najcz ciej u ywane polecenia w skryptach:

Zajęcia 4 - Wprowadzenie do Javascript

Przedmiot: Programowanie usług internetowych - Delphi Przygotował: K. Strzałkowski Rok V. Semestr IX. Wydział ZiMK

Obiektowe bazy danych

Szablon główny (plik guestbook.php) będzie miał postać:

Autor: Joanna Karwowska

CGI (Common Gateway Interface)

Sprawdzenie czy połączenie przebiegło poprawnie if (mysqli_connect_errno()) { echo Błąd; Połączenie z bazą danych nie powiodło się.

Napisy w PHP. Drukowanie napisów instrukcją echo

Zajęcia 13 wykorzystanie MySQL w PHP cz. 2

Internetowe bazy danych

Sieci i systemy operacyjne I Ćwiczenie 1. Podstawowe polecenia systemu Unix

Dynamiczne przetwarzanie stron. dr Beata Kuźmińska-Sołśnia

SIECI KOMPUTEROWE I BAZY DANYCH

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Programowanie internetowe

Formularze. 1. Formularz HTML

Wydział Elektrotechniki, Informatyki i Telekomunikacji Instytut Informatyki i Elektroniki

Dokumentacja systemu NTP rekrut. Autor: Sławomir Miller

Systemy internetowe Wykład 3 PHP

Podstawy programowania III WYKŁAD 2

SYSTEM ZARZĄDZANIA DANYMI OSOBOWYMI - INSTRUKCJA UŻYTKOWNIKA

14. POZOSTAŁE CIEKAWE FUNKCJE

Specyfikacja instalacji usługi SMS Premium w Przelewy24.pl

Laboratorium 7 Blog: dodawanie i edycja wpisów

Programowanie w języku Python. Grażyna Koba

Kontrola sesji w PHP HTTP jest protokołem bezstanowym (ang. stateless) nie utrzymuje stanu między dwoma transakcjami. Kontrola sesji służy do

Rozpoczynamy import Kreator uruchamiamy przyciskiem Z tekstu, znajdującym się na karcie Dane, w grupie Dane zewnętrzne.

JavaScript - wykład 4. Zdarzenia i formularze. Obsługa zdarzeń. Zdarzenia. Mysz. Logiczne. Klawiatura. Beata Pańczyk

Języki skryptowe - PHP. Podstawy PHP. Paweł Kasprowski. pawel@kasprowski.pl. vl07

JAVAScript w dokumentach HTML (2)

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Budowa aplikacji ASP.NET współpracującej z bazą dany do obsługi przesyłania wiadomości

Pracownia internetowa w szkole ZASTOSOWANIA

Forte Zarządzanie Produkcją Instalacja i konfiguracja. Wersja B

Projekt Hurtownia, realizacja skojarzeń dostawców i produktów

Hyper Text Markup Language

Budowa aplikacji ASP.NET współpracującej z bazą danych do obsługi przesyłania wiadomości

Transkrypt:

Programy CGI dla baz danych Zbigniew Jurkiewicz Instytut Informatyki UW 6 maja 2014 Dodawać poniższą instrukcję error_reporting(e_all) do skryptów PHP, żeby serwer WWW raportował wszystkie błędy. 1 WWW i bazy danych: programy CGI Uwaga: zakładamy pewną minimalną znajomość HTML. Z wyjatkiem formularzy nie jest to dokumentacja HTML jest mnóstwo tutoriali w sieci. 1.1 Wprowadzenie Program CGI jest to program wywoływany przez serwer WWW. Program CGI otrzymuje dane od serwera i produkuje w wyniku stronę, wysyłaną przez serwer do przeglądarki. Interfejs używany przy komunikacji między takimi programami a serwerem WWW nosi nazwę CGI (Common Gateway Interface). Serwer WWW interpretuje komunikaty HTTP pochodzące z przeglądarki. Niektóre w tych komunikatów zawierają żądanie uruchomienia programu (CGI). Część komunikatu określa nazwę programu i jego położenie, a inna część jego argumenty. To, jakie adresy URL są traktowane jako programy CGI, zależy od serwera WWW i jego administratora. Czasem muszą one być zapisane w ustalonym katalogu, np. cgi-bin, a ich adres ma wtedy postać np. 1

http://www.foo.org/cgi-bin/nazwa-programu. Takie programy często są uruchamiane z prawami użytkownika nobody, a więc nie wolno w nich używać ścieżek względnych. Model komunikacji oparty na WWW jest bardzo ograniczony: Ponieważ program CGI musi zakończyć pracę zanim serwer będzie mógł odpowiedzieć na żądanie, dialog o n interakcjach musi po stronie serwera być implementowany n niewielkimi programami. Programy te muszą się jednak jakoś komunikować. Z uwagi na ograniczenia protokołu HTTP nie daje się użyć architektury Model- View-Controller (MVC), stosowanej w klasycznym GUI. Szczególne kłopoty sprawia możliwość klonowania stron w przeglądarce. Programy CGI działają jak typowe filtry w systemie Unix: wczytuja dane ze standardowego wejścia i wypisują wyniki na standardowe wyjscie. 2 Generowanie HTML z programów w PHP Programy CGI można pisać w każdym języku programowania, nasze przykłady zapiszemy w PHP. Jest to skryptowy język programowania, którego bloki można zanurzać bezpośrednio w strony HTML (trochę podobnie do ASP Microsofta). Jest to produkt bezpłatny, główna strona to www.php.net. Krótki opis: Nazwy zmiennych rozpoczynają się znakiem $, nie trzeba ich deklarować. Można jednak deklarować zmienne jako static, aby były wspólne dla wszystkich bloków PHP na danej stronie (w przeciwnym razie będą lokalne). Standardowe typy danych to liczby całkowite i rzeczywiste, napisy, tablice, tablice acocjacyjne i (o zgrozo) obiekty. Konstrukcje sterujące są podobne do C. Komentarze poprzedza się znakami # lub //, można je też otaczać przez /*...*/. Instrukcje należy kończyć średnikiem. Można definiować własne funkcje, składnia definicji i wywołania jest podobna jak w C. 2

Wartości zmiennych z formularza HTML są przekazywane jako elementy tablicy asocjacyjnej $POST[]. Program w PHP może być wykonywany w dwóch trybach, zależnie od użytego interpretera. Serwer WWW automatycznie wywołuje interpreter dla interfejsu CGI, automatycznie generującego nagłówki stron itp. Będziemy o tym mówić dalej. Na razie zajmiemy się interpreterem dla wiersza poleceń (CLI - Command Line Interface). Ułatwia on testowanie programów PHP. Aby sprawdzić, czy jest on zainstalowany w naszym systemie, możemy wywołać program php z opcją -v: [zbyszek@katastrofa2 ~]$ php -v PHP 5.3.2 (cli) (built: Mar 6 2010 08:33:02) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies 2.1 PHP z linii poleceń Prosty program możemy wpisać bezpośrednio. Należy pamiętać, że musi on być otoczony znacznikami <?php i?>, np. [zbyszek@katastrofa2 ~]$ php <?php echo "Witaj świecie\n"; exit(0);?> Witaj świecie Po wpisaniu programu i naciśnięciu CTRL-D zostanie on wykonany. 2.2 CGI w PHP Najprostszy przykład to skrypt nie pobierający żadnych danych wejściowych. Powinien on wypisać na standardowe wyjście nagłówek HTTP, a następnie zawartość strony zapisaną w HTML. Jeśli nie zażądamy inaczej, to PHP wypisze automatycznie standardowy nagłówek HTTP. Zamiast tego możemy w skrypcie umieścić instrukcję 3

<?php header("content-type: image/png");?> Musi to być pierwsza linia skryptu, nie może być nawet poprzedzona pustą linią. Zawartość strony można generować w różny sposób. Najprościej jest użyć standardowych funkcji wyjścia w PHP. W pierwszym przykładzie wygenerujemy stronę z nieśmiertelnym komunikatem. <html> <?PHP echo "<html><head>"; echo "<title>pierwszy przykład</title></head>"; echo "<body><h1>witaj świecie!</h1></body>";?> </html> Do wypisywania poszczególnych wierszy HTML użyliśmy funkcji echo. 3 Programowe generowanie stron Użycie wyrażeń PHP pozwala na prostsze generowanie skomplikowanych stron. Popatrzmy na prostą pętlę zwiększającą licznik i wypisującą każdorazową wartość licznika: <html> <?PHP echo "<html><head>"; echo "<title>"ślad licznika"</title></head>"; echo "<body>"; for ($n = 0; $n <= 10; $n++) { echo "<P>Bieżąca wartość n wynosi $n</p>"; } echo "</body>";?> </html> Programy nie pobierające danych wejściowych są zwykle bezużyteczne. Z programami CGI sprawa ma się inaczej, ponieważ mogą one wyświetlać informację, która 4

ulega częstym zmianom, na przykład pochodzić z bazy danych czy skrytki pocztowej użytkownika. Napiszemy teraz program podający, jakie gatunki zwierzaków znajdują się w naszej zoologicznej bazie danych. Użyjemy wbudowanego w PHP interfejsu do Postgresa: <html> <head> <title>test</title> </head> <body bgcolor="white"> <?php $link = pg_connect("host=labdb dbname=bd user=scott password=tiger"); $result = pg_exec($link, "select distinct gatunek from Zwierzaki"); $numrows = pg_numrows($result);?> <h2 align=center>nasze gatunki</h2> <table border="1" align=center> <tr> <th>gatunek</th> </tr> <?php // Przechodzimy po wierszach wyniku. for($ri = 0; $ri < $numrows; $ri++) { echo "<tr>\n"; $row = pg_fetch_array($result, $ri); echo " <td>". $row["gatunek"]. "</td> </tr> "; } pg_close($link);?> </table> </body> </html> 5

4 Dostęp do bazy danych Standardowe biblioteki PHP obejmują wiele funkcji do komunikacji z bazami danych. W naszych przykładach ograniczymy się do PostgreSQL. Zaczynamy jak zwykle od połączenia się z bazą danych. pg_connect Służy do tego funkcja $link = pg_connect("host=labdb dbname=mrbd user=scott password=tiger"); Zwraca ona deskryptor połączenia, który należy zachować na zmiennej. Gdy dostęp do bazy danych przestanie nam być potrzebny, należy zamknąć połączenie funkcją pg_close. pg_close($link); Pora na zadawanie zapytań. Funkcja pg_execwykonuje polecenie SQL i zwraca deskryptor wyniku. $result = pg_exec($link, "select * from Gatunki"); Po sprawdzenie, czy nie było błędu, poszczególne wiersze można pobierać funkcją pg_fetchrow. Liczbę wierszy w wyniku podaje funkcja pg_numrows. $numrows = pg_numrows($result); for($ri = 0; $ri < $numrows; $ri++) { $row = pg_fetch_array($result, $ri); echo $row["gatunek"]. "<br>" } 5 Programy CGI z argumentami Znacznie ciekawsze są programy CGI, których wyniki zależą od otrzymanych danych wejściowych. Najczęściej użytkownik wypełnia formularz WWW i naciskając przycisk potwierdzenia powoduje wysłanie tej informacji (odpowiednio zapisanej). Serwer przekazuje tę informację do programu CGI określonego w formularzu. 6

5.1 Pobieranie informacji od użytkownika Dane do programów CGI pobiera się używając formularzy HTML. Mogą one zawierać pola tekstowe, rozmaite przyciski, przewijane tablice itp. Pobieranie informacji składa się z dwóch kroków: należy przygotować dokument HTML zawierający odpowiednie formularze, a następnie w programie CGI zanalizować wczytane dane i określić akcję do wykonania. 5.1.1 Formularze Formularze umieszcza się w dokumencie HTML używając elementu <form>: <FORM METHOD="POST" ACTION="http://form.url.com/cgi-bin/cgiprogram">... Zawartość formularza... </FORM> Adres URL podany atrybutem ACTION powinien wskazywać na program CGI. Atrybut METHOD podaje sposób przekazania danych z formularza do programu CGI. W powyższym przykładzie użyto zalecanej metody "POST", inna możliwość to metoda "GET", lecz zwykle jej użycie jest bardziej kłopotliwe. W metodzie GET informacje z formularza przekazuje się do programu CGI poprzedzając je znakiem zapytania i doklejając do podanego adresu akcji. Dla metody POST są one umieszczane w treści komunikatu HTTP i programu CGI będzie mógł jest odczytać ze standardowego wejścia. W przypadku metody POST zamiast uruchamiać program CGI możemy zawartość formularza przesłać pocztą elektroniczną. Atrybut ACTION powinien wtedy mieć postać mailto:ktoś-tam@gdzieś-tam Wewnątrz formularza można umieścić dowolny element z wyjątkiem innego formularza. Elementy służace do komunikacji z użytkownikiem to INPUT, SELECT i TEXTAREA. Najprostsze są elementy INPUT: <INPUT TYPE="text" NAME="napis" VALUE="domyślna" SIZE=10 MAXLENGTH=20> <INPUT TYPE="checkbox" NAME="thisbox" VALUE="on" CHECKED> 7

<INPUT TYPE="radio" NAME="radio1" VALUE="1"> <INPUT TYPE="radio" NAME="radio1" VALUE="2" CHECKED> <INPUT TYPE="submit" VALUE="gotowe"> Atrybut TYPE określa typ obiektu używanego do komunikacji, dozwolone wartości to "text", "password", "checkbox", "radio", "image", "hidden", "submit" i "reset". Dwa ostatnie pełnią role przycisków wysyłających zawartość formularza do serwera i czyszczących formularz. Każdy z pozostałych typów ma atrybut NAME podający nazwę zmiennej, z którą zostanie związana wartość w polu podczas przekazywania zawartości do programu CGI program. Poszczególne typy mają następującą postać "text" proste pole do wprowadzania tekstu. Atrybut VALUE podaje wartość domyślną (początkową), atrybut SIZE to rozmiar pola (domyślnie 20), zaś atrybut MAXLENGTH podaje maksymalną liczbę znaków do wpisania w pole (domyślnie bez ograniczeń). "password" działa tak samo jak pole tekstowe, ale nie wyświetla wpisywanych znaków. "checkbox" określa przełącznik, który może zostać wciśnięty ( włączony ). Atrybut VALUE określa napis przekazywany do programu CGI gdy przełącznik jest wciśnięty (wartość domyślna to "on"). "radio" określa przełącznik, który może być grupowany z innymi dając listę alternatywnych wyborów. Grupę tworzą przełączniki o tej samej wartości atrybutu NAME. Element SELECT służy do tworzenia menu i przewijalnych list wyboru. <SELECT NAME="menu"> <OPTION>wybór 1 <OPTION>wybór 2 <OPTION>wybór 3 <OPTION SELECTED>wybór 4 <OPTION>wybór 5 <OPTION>wybór 6 <OPTION>wybór 7 </SELECT> 8

<SELECT NAME="scroller" MULTIPLE SIZE=7> <OPTION SELECTED>wybór 1 <OPTION SELECTED>wybór 2 <OPTION>wybór 3 <OPTION>wybór 4 <OPTION>wybór 5 <OPTION>wybór 6 <OPTION>wybór 7 </SELECT> Atrybut SIZE określa, czy będzie to rozwijalne menu czy lista wyboru. Jeśli jest pominięty lub ma wartość 1, to domyślnie jest to menu. Jeśli jest większy niż 1, to otrzymamy listę przewijaną z widocznymi SIZE elementami. Obecność opcji MULTIPLE automatycznie wybiera listę przewijaną z wieloma wyborami. Element OPTION podaje nazwy i wartości dla każdego pola i pozwala określić pocją SELECTED, czy jest ono domyślnie wybrane. Element TEXTAREA słuzy do wprowadzania tekstów w wielu wierszach: <TEXTAREA NAME="area" ROWS=5 COLS=30> Mary had a little lamb. A little lamb? A little lamb! Mary had a little lamb. It s fleece was white as snow. </TEXTAREA> Atrybut NAME to nazwa zmiennej, zaś ROWS i COLS określają rozmiar widocznej częsci tekstu. Początkową (domyślną) zawartość podaje się wewnątrz elementu. Spacje są respektowane, podobnie znaki nowej linii (jak w elemencie <PRE>). Spróbujmy napisać usługę, pobierającą nazwę użytkownika i hasło, a następnie sprawdzającą ich poprawność. Zaczniemy od formularza: <html> <title>drzwi wejściowe</title> <body> <h3 align="center">logowanie</h3> <form action=".../loguj.php" method="post"> <center> Login: <input type="text" name="kto"><br> 9

Hasło: <input type="password" name="klucz"><br> <input type="submit" value="loguj"> </center> </form> </body> </html> Strona ta oprócz tytułu zawiera jedynie formularz (element form), zawierający trzy elementy input. Pierwsze dwa określają pola tekstowe do wprowadzenia identyfikatora użytkownika (w postaci linii tekstu) i jego hasła (bez ujawniania). Trzeci element to przycisk zatwierdzenia, po jego naciśnięciu zawartość formularza jest przesyłana do programu, którego nazwa jest podana jako atrybut action formularza. Oprócz nazwy programu formularz powinien podawać metodę przekazania wartości zmiennych (w tym przykładzie są dwie zmienne kto i klucz), pobranych z formularza. Dwie główne metody to get (domyślna, informacje są przekazywane przez zmienną środowiskową QUERY_STRING) i post (informacje są przekazywane przez standardowe wejście programu CGI). Do określenia metody służy atrybut method w tym przypadku jego wartością jest post. Informacja o użytej metodzie zostaje przez serwer WWW zapisana w zmiennej środowiskowej REQUEST_METHOD i może być odczytana przez program CGI (wartości to "GET" i "POST"). 5.1.2 Wczytywanie po stronie serwera CGI Zawartość formularza jest przesyłana w postaci zapytania napisu o specjalnej postaci. Dla metody GET napis ten staje się wartością zmiennej środowiska QUERY_STRING. Serwer otrzymuje go bowiem jako fragment URL, na przykład: http://students.mimuw.edu.pl/~ab123456/aa?thisinput=default&thisbox=on&radio1= Zapytanie znajduje się po znaku zapytania (? ). Niezależnie od przyjętej metody, wartości zmiennych formularza sa przekazywane jako ciąg par nazwa/wartość, oddzielanych znakiem &. Nazwy od wartości oddziela się znakiem równości =. Ewentualne spacje w wartościach są zastępowane znakiem +, zaś wszystkie inne znaki nie alfanumeryczne trójznakową sekwencją zaczynająca się znakiem procenta %, po którym zapisany jest dwoma cyframi szesnastkowymi kod znaku, np. napis "20% + 30% = 50%, &c." 10

będzie zapisany jako "20%25+%2b+30%25+%3d+50%25%2c+%26c%2e" W metodzie POST postać zapytania jest taka sama, ale program CGI otrzymuje je przez standardowe wejście. Nie otrzymamy jednak końca pliku. Zamiast tego długość napisu zapytania podawana jest w zmiennej środowiska CONTENT_LENGTH, którą można odczytać funkcją getenv. Pora na program CGI do naszego przykładu. <?php $kto = $_POST["kto"]; $klucz = $_POST["klucz"]; $link = pg_connect("host=labdb dbname=mrbd user=scott password=tiger"); $wynik = pg_exec($link, "SELECT upraw FROM users WHERE login = $kto AND password = $klucz "); $ile = pg_numrows($wynik); if ($ile == 0) { echo "<center><strong>nie ma takiego użytkownika</strong></center>"; } else { echo "<center><strong>ok</strong></center>"; }?> Uwaga: programu zapisanego w powyższej uproszczonej wersji nie należy umieszczać na serwerze nie jest on bezpieczny. Złośliwy użytkownik mógłby wpisać w przeglądarce po kluczu apostrof, a następnie dowolne wyrażenie SQL lub średnik i dowolne polecenia SQL (np. OR a = a). Poprawna pełna wersja powinna najpierw sprawdzić wprowadzone wartości, np. usuwając niedozwolone znaki. 5.2 Zwracanie odpowiedzi dla użytkownika Dokument HTML stanowiący odpowiedź tworzy się dynamicznie na podstawie odpowiedzi na zapytanie użytkownika. Można wykorzystać dowolne techniki formatowania dostępne w HTML. 11

5.2.1 CGI Output Programy CGI zwracają skonstruowany dokument HTML przez standardowe wyjście, można więc w PHP po prostu używać funkcji echo. 12