home_site

Lab03 - Aplikacja WWW [ lab:17.06.2023, ver. SPN.2023.06.16.003 ]

Zawartość strony

Cel zajęć

W ramach zajęć opracujemy skrypty w języku PHP do zarządzania bazą danych - BIBLIOTEKA. Aplikacja będzie składała się z części serwerowej i części klienta. Po stronie serwera zostaną opracowane skrypty pobierające dane z bazy danych, modyfikujące jej zawartość oraz interfejs główny komunikacji z użytkownikiem naszej aplikacji. Do komunikacji z bazą danych wykorzystany zostanie interfejs PDO (PHP Data Objects). Część klienta będzie zawierała następujące pliki: dokumenty HTML5, plik CSS oraz plik z funkcjami JavaScript sprawdzającymi poprawność wprowadzonych danych w formularzach.

Na rys. 1 przedstawiono schematycznie strukturę tworzonej aplikacji. Realizacja zadania została przedstawiona w przykładowych skryptach w ramach laboratorium. Na rys.2 zaprezentowano końcowy efekt realizacji zadań w ramach laboratorium.


Lab04_Diagram
Rys.1 Diagram prezentujący komponenty aplikacji
Lab04_Appl
Rys.2 Aplikacja obsługująca bazę danych Biblioteka

Kolejne etapy realizacji aplikacji.

  1. Opracowanie skryptu PHP komunikującego się z bazą danych i przedstawiającego wyniki działania polecenia SELECT na dowolnej tabeli [1].
  2. Opracowanie uniwersalnego skryptu PHP umożliwiającego realizację dowolnego zapytania SELECT i przedstawiającego wyniki w postaci tabeli HTML [1].
  3. Opracowanie formularza do przetwarzania zapytań parametrycznych [2].
  4. Opracowanie skryptu PHP umożliwiającego odczytanie danych z formularza HTML i zapisanie ich do bazy danych [2].
  5. Modyfikacja formularza HTML o skrypt w języku JavaScript sprawdzający poprawność wprowadzonych danych, opracowanie stylów CSS [3].
  6. Powiązanie opracowanych skryptów w jedną aplikację.

Tematyka zajęć:

  1. Podstawowe formularze HTML i skrypty php
  2. Aplikacja wykorzystująca opracowane skrypty
  1. Skrypty php obsługujące bazę danych

    1. Połączenie z relacyjną bazą danych.

      Połączenie z bazą danych zostanie zrealizowane poprzez interfejs PDO dostępny w PHP od wersji 5.0. W wcześniejszych wersjach PHP była to dołączana zewnętrzna biblioteka. Interfejs PDO umożliwia podłączenie do większości relacyjnych baz danych i udostępnia ten sam zestaw funkcji (metod) do obsługi zapytań i poleceń SQL. W czasie połączenia z bazą danych i powodzenia operacji tworzony jest obiekt klasy PDO. Kod źródłowy skryptu przedstawiający polecenia tworzące połączenie z bazą danych zawarto w dwóch skryptach.

    2. Test połączenia z bazą danych - plik konfiguracyjny conf.php.

      W celu łatwiejszego zarządzania aplikacją, utworzymy plik z danymi konfiguracyjnymi realizującymi połączenie z bazą danych, który będziemy dołączać do tworzonych przez nas skryptów przetwarzających dane z bazy danych. Plik ten będzie dołączany poprzez instrukcję include() do kolejnych skryptów realizowanych w ramach zadania. Dane konfiguracyjne tworzące połączenie z bazą danych ElephantSQL przedstawiono w pliku conf.php.

      Skrypt conf.php ( [listing dokumentu] [link do dokumentu]

         <?php
      /*
      	Plik: conf.php
      */
      /*
      $host = 'qdjjtnkv.db.elephantsql.com'; // adres serwera bazodanowego
      $port = '5432'; // port dostepu do bazy danych - domyślnie postgresql 5432
      $username = 'haxyqkyi'; // konto  uzytkownika
      $password = '****************'; // haslo do bazy danych
      $database = 'haxyqkyi'; // nazwa bazy danych
      */
      $host = 'pascal.fis.agh.edu.pl'; // adres serwera bazodanowego
      $port = '5432'; // port dostepu do bazy danych - domyślnie postgresql 5432
      $username = '--users--'; // konto  uzytkownika
      $password = '****************'; // haslo do bazy danych
      $database = '--user--'; // nazwa bazy danych
      ?>
        
    3. Test połączenia z bazą danych - skrypt test2.php.

      Interfejs PDO umożliwia wyświetlenie informacji o błędach. W ramach języka php dostępna jest struktura poleceń try {} oraz catch {} umożliwiająca przechwycenie błędów (w tym wypadku wyjątków). Informacja ta może zostać przekazana do użytkownika lub zapisana w odpowiednim pliku. Kod źródłowy skryptu umożliwiającego połączenie z bazą danych i przekazującego użytkownikowi informacji o błędzie interfejsu PDO przedstawiono w skrypcie test2.php.

      Skrypt test2.php ( [listing dokumentu] [link do dokumentu] )

      <?php
      /*
      	Plik test2.php
      */
      include ('conf.php'); 
       
      try {
      $pdo = new PDO('pgsql:host='.$host.'; dbname='.$database.'; port='.$port, $username, $password );
            echo 'Połączenie poprawnie nawiązane! ';
      } catch(PDOException $e){
              echo 'Połączenie nie zostało utworzone. '.$e->getMessage().'<br />';
      }
      ?>
        
    4. Wydruk listy czytelników - skrypt test3.php.

      Interfejs PDO umożliwia wysłanie zapytań SQL – SELECT do bazy danych na dwa sposoby. Przy użyciu:

      1. metody – query(),
      2. zestawu metod – prepare() i execute().

      Druga forma przetwarzania zapytań jest bezpieczniejsza i dlatego zostanie ona poniżej omówiona i zastosowana. Po poprawnym połączeniu z bazą danych posiadamy obiekt połączenia klasy PDO. Poprzez metodę prepare() przygotujemy zapytanie do bazy danych. Kolejna metoda execute() wykona to polecenie tworząc obiekt zawierający zwrócone rekordy (lub pojedyncze wartości) z bazy danych.

      Do przeglądnięcia rekordów wykorzystamy pętlę foreach. Pętla foreach będzie pobierała kolejne rekordy z zbioru wynikowego $stmt i umieszczała w tabeli asocjacyjnej $row[]. Kluczami w tej tabeli są nazwy atrybutów tabeli bazodanowej. Wartości atrybutów są zgodne z wartościami w tabeli bazodanowej.

      Istotną metodą wykorzystaną w skrypcie jest metoda closeCursor() zamykająca zbiór wyników. Przedstawiony poniżej skrypt test3.php realizuje odczyt wyników dla przykładowego zapytania SQL do tabeli CZYTELNIK przez omówione powyżej metody.

      Skrypt test3.php ( [listing dokumentu] [link do dokumentu] )

      <?php
      /*
      	Plik: test3.php
      */
      include ('conf.php');
       
      try {
      $pdo = new PDO('pgsql:host='.$host.'; dbname='.$database.'; port='.$port, $username, $password );
            echo 'Połączenie poprawnie nawiązane! ';
            $stmt = $pdo -> prepare('SELECT nazwisko, imie FROM bibl.czytelnik');
            $stmt -> execute() ;
            echo '<ul>';
            foreach($stmt as $row)
            {
                echo '<li>'.$row['nazwisko'].': '.$row['imie'].'</li>';
            }
            $stmt -> closeCursor();
            echo '</ul>';
      
      } catch(PDOException $e){
              echo 'Połączenie nie zostało utworzone. '.$e->getMessage().'<br />';
      }
      ?>
        
    5. Wydruk listy czytelników w tabeli html - skrypt test4.php.

      W ramach tego punktu opracujemy skrypt formatujący wyniki zapytania do tabeli HTML. Przy pomocy polecenia echo tworzymy zbiór wynikowy formatując dane wynikowe przy pomocy odpowiednich elementów HTML ( <table>, <tr>, <th> i <td>). Zadanie zrealizowano w skrypcie test4.php dla tabeli CZYTELNIK.

      Skrypt test4.php ( [listing dokumentu] [link do dokumentu] )

      <?php
      /*
      	Plik: test4.php
      */
      include ('conf.php');
      try {
      $pdo = new PDO('pgsql:host='.$host.'; dbname='.$database.'; port='.$port, $username, $password );
            echo 'Połączenie poprawnie nawiązane! ';
      
            $stmt = $pdo -> prepare('SELECT nazwisko, imie FROM bibl.czytelnik');
            $stmt -> execute() ;
      
            echo  '<table border=1 >';
            // drukowanie wiersza naglowkowego tabeli
            echo  "<tr><th>Nazwisko</th><th>Imie</th></tr>\n";
      
            echo '</tr>';
            // drukowanie danych 
            foreach ($stmt as $row){
              echo '<tr><td>'.$row['nazwisko'].'</td><td>'.$row['imie'].'</td></tr>';
            }
            // zamkniecie tabeli
            echo '</table>';
      
            $stmt -> closeCursor();
      
      }catch(PDOException $e){
              echo 'Połączenie nie zostało utworzone. '.$e->getMessage().'<br />';
      }
      ?>
        
    6. Uniwersalny skrypt generujcy tabelę html dla dowolnych danych - zapytanie.php.

      W poprzednim zadaniu otrzymaliśmy wynik zapytania w postaci tabeli HTML. Jednak opracowany skrypt daleki jest od uniwersalności. Przy zmianie zapytania SELECT musimy każdorazowo modyfikować ilość kolumn w tabeli, jak również wiersz nagłówkowy zawierający nazwy kolumn. Kolejną modyfikacją naszego skryptu będzie automatyzacja tworzenia wiersza nagłówkowego oraz liczby kolumn w tworzonej tabeli. Informacja o nazwach kolumn i ich liczbie jest zapisana w tabeli wynikowej zwracanej przez bazę danych. Pozostaje nam tylko odczytanie tej informacji i właściwe opracowanie skryptu wykorzystującego tę informację.

      Kod źródłowy realizujący zadanie został przedstawiony w skrypcie zapytanie.php.

      Zrealizujemy to tworząc funkcję, którą każdorazowo będziemy powoływać do realizacji zapytania. Parametrem funkcji jest kod zapytanie SQL. W ramach skryptu wykorzystamy dwie nowe metody: setFetchMode() (linia kodu 15) oraz fetchAll() (linia kodu 17). Metoda setFetchMode() - informuje interfejs o przesłaniu wynikowych danych jako tablicy asocjacyjnej o budowie ”nazwa atrybutu”:”wartość atrybutu”, natomiast fetchAll() - pobiera wyniki zapytania do lokalnej tabeli $result[].

      Wykorzystując polecenia foreach przetwarzamy tabelę $result[] dwukrotnie. Pierwszy raz w celu odczytania nazw atrybutów i umieszczeniu ich w wierszu nagłówkowym (linie kodu 22 i 23). W zmiennej $key znajduje się nazwa kolumny (atrybutu bazodanowego). Pętla foreach będzie czytała po kolei wszystkie kolumny. Drugi raz czytamy tablicę $result[] pobierając kolejne rekordy danych (linia kodu 27). Pętla foreach pobiera kolejne rekordy wynikowe tworząc tabelę asocjacyjną $row[]. Wykorzystując kolejny raz polecenie foreach (linia kodu 29) odczytujemy kolejne elementy tablicy $row[] umieszczając wartości w zbiorze wynikowym.

      Skrypt zapytanie.php ( [listing dokumentu] [link do dokumentu] )

      <?php
      /*
      	Plik: zapytanie.php
      */
      
      function ZapytanieHTML($sql,$lp)
      {
        include ('conf.php') ;
        try {
            $pdo = new PDO("pgsql:host=".$host."; dbname=".$database."; 
                            port=".$port, $username, $password );
            echo "Połączenie poprawnie nawiązane! ";
      
            $stmt = $pdo -> prepare($sql);
            $stmt -> setFetchMode(PDO::FETCH_ASSOC);
            $stmt -> execute() ;
            $result = $stmt -> fetchAll() ;
            // print_r($result);
            echo  "<table border=1 >\n";
            // drukowanie wiersza naglowkowego tabeli
            echo "<tr>\n" ;
            foreach ($result[0] as $key => $useless){
               print "<th>$key</th>";
            }
            echo "</tr>\n";
            // drukowanie danych 
            foreach ($result as $row){
               echo "<tr>";
               foreach ($row as $key => $val){
                  print "<td>$val</td>"; }
               echo "</tr>\n"; 
            }
            // zamkniecie tabeli
            echo "</table>\n";
      
            $stmt -> closeCursor();
      
        }catch(PDOException $e){
              echo "Połączenie nie zostało utworzone. ".$e->getMessage()."<br />";
        }
      }
        
    7. Sprawdzenie poprawności skryptu "zapytanie.php" - skrypt test5.php.

      Skrypt sprawdzający poprawność opracowanej funkcji ZapytanieHTML() do prezenatacji wyników zapytań.

      Skrypt test5.php ( [listing dokumentu] [link do dokumentu] )

      <?php
      /*
      	Plik: test5.php
      */
      
      include ('zapytanie.php');
      
      $sql = "SELECT imie, nazwisko FROM bibl.czytelnik";
      echo "<h3>Lista czytelnikow biblioteki</h3>" ;
      ZapytanieHTML($sql) ;
      ?>
        
    8. Zapytanie parametryczne - skrypt zapytanie_par.php.

      Kolejnym etapem rozbudowy naszej aplikacji jest opracowanie skryptu, dzięki któremu możemy zadawać zapytania parametryczne. Pytanie parametryczne jest to zapytanie do bazy danych w którym użytkownik może zmieniać wartości warunku WHERE – jest to parametr. Przykładowe zapytanie parametryczne przedstawiono poniżej:

        
      SELECT * FROM czytelnik WHERE nazwisko LIKE ‘xxx’ ;
      

      gdzie wartość ‘xxx’ jest dowolną wartością podawaną przez użytkownika.

      W ramach interfejsu PDO udostępniono możliwość tworzenia zapytań parametrycznych. Realizujemy to przez odpowiednie przygotowanie zapytania dla metody prepare(), a następnie przekazanie wartości parametrów w ramach metody execute() lub poprzez metodę bindValue(). Realizację w skrypcie PHP zapytania paramaterycznego SQL z wykorzystaniem metody bindValue() przedstawia poniższy kod.

      $par = "K%";
      $sql = "SELECT imie, nazwisko FROM czytelnik WHERE nazwisko LIKE :par ";
      $stmt = $pdo -> prepare($sql);
      $stmt -> bindValue(":par",$par,PDO::PARAM_STR);
      $stmt -> setFetchMode(PDO::FETCH_ASSOC);
      $stmt -> execute() ;
      
      Przekazanie wartości parametru przez metodę execute() przedstawiono w poniższym kodzie.
       
      $par = "K%";
      $sql = "SELECT imie, nazwisko FROM czytelnik WHERE nazwisko LIKE :par ";
      $stmt = $pdo -> prepare($sql);
      $stmt -> setFetchMode(PDO::FETCH_ASSOC);
      $stmt -> execute( array(":par" => $par) ) ;
      

      W ramach realizacji zadania obsługę zapytań parametrycznych zrealizujemy wykorzystując technikę z metodą execute() jako bardziej uniwersalną. W ramach poniższego skryptu przedstawiono funkcję obsługującą dowolne zapytania sparametryzowane.

      Skrypt zapytanie_par.php ( [listing dokumentu] [link do dokumentu] )

      <?php
      /*
      	Plik: zapytanie_par.php
      */
      
      function ZapytanieParHTML($sql,$par,$lp)
      {
        include ("conf.php") ;
       
        try {
            $pdo = new PDO("pgsql:host=".$host."; dbname=".$database."; 
                            port=".$port, $username, $password );
            // echo "Połączenie poprawnie nawiązane! ";
      
            $stmt = $pdo -> prepare($sql);
            $stmt -> setFetchMode(PDO::FETCH_ASSOC);
            $stmt -> execute($par) ;
            $result = $stmt -> fetchAll() ;
            // print_r($result);
            echo  "<table border=1 >\n";
            // drukowanie wiersza naglowkowego tabeli
            echo "<tr>\n" ;
            foreach ($result[0] as $key => $useless){
               print "<th>$key</th>";						
            }
            echo "</tr>\n";
            // drukowanie danych 
            foreach ($result as $row){
               echo "<tr>";
               foreach ($row as $key => $val){
                  print "<td>$val</td>"; }
               echo "</tr>\n"; 
            }
            // zamkniecie tabeli
            echo "</table>\n";
      
            $stmt -> closeCursor();
      
        }catch(PDOException $e){
              echo "Połączenie nie zostało utworzone. ".$e->getMessage()."<br />";
        }
      }
      
      ?>
        
    9. Formularz do realizacji zapytania parametrycznego - skrypt test7f.php

      W celu wykorzytsania pytania parametrycznego należy zrealizaowć kilka zadań, dla przyskładu - wyszukanie książek wypożyczonych przez konkretnego czytelnika:

      1. należy przygotować odpowiedni formularz, przy pomocy którego wybierzemy tego czytelnika
      2. możemy podać identyfikator czytelnika lub jego nazwisko w formularzu, ale lepiej wybrać czytelnika z listy
      3. w przypadku listy należy opracować formularz umożliwiający wybór czytelnika z listy (wykorzystujemy element <select> z formularza HTML).
      4. zwrócony identyfikator czytelnika wykorzystać do wyszukania książek
      5. wykorzystać utworzoną uniwersalną funkcję tworzącą tabele HTML dla zapytań parametrycznych

      Skrypt przedstawiony w tym punkcie realizuje powyższe punkty.

      Skrypt test7f.php ( [listing dokumentu] [link do dokumentu] )

      <?php
      /*
      	Plik: test7f.php
      */
        include ('conf.php');
        try {
            $pdo = new PDO("pgsql:host=".$host."; dbname=".$database."; 
                            port=".$port, $username, $password );
            // echo "Połączenie poprawnie nawiązane! ";
            $sql = "SELECT id_czytelnik, nazwisko, imie FROM bibl.czytelnik ORDER BY nazwisko";
            $stmt = $pdo -> prepare($sql);
            $stmt -> setFetchMode(PDO::FETCH_ASSOC);
            $stmt -> execute() ;
            $result = $stmt -> fetchAll() ;
      
            echo "<form name=\"form\" action=\"test7.php\" method=\"post\" >";
            echo "<select name=\"id\"  >"; 
            foreach ($result as $row){
               echo "<option value='".$row[id_czytelnik]."' >".$row[nazwisko]." ".$row[imie]."</option>"; 
            }
            echo "</select>";
            $stmt -> closeCursor();
            echo "<input type=\"submit\" value=\"Wyslij\" >";
            echo "</form>";  
      
        }catch(PDOException $e){
              echo "Połączenie nie zostało utworzone. ".$e->getMessage()."<br />";
        }
      
      ?>
        
    10. Realizacja zapytania parametrycznego - skrypt test7.php

      W ramach tego punktu przedstawiono skrypt realizujący funkcjonalność formularza przedstawionego w punkcie 9.

      Skrypt test7.php ( [listing dokumentu] [link do dokumentu] )

      <?php
      /*
      	Plik: test7.php
      */
      include ("zapytanie_par.php");
      $val = $_POST["id"] ;
      $sql = "SELECT k.tytul, k.autor FROM bibl.ksiazka k JOIN bibl.egzemplarz e ON k.id_ksiazka = e.id_ksiazka 
                                                     JOIN bibl.wypozyczenie w ON e.id_egzemplarz=w.id_egzemplarz WHERE w.id_czytelnik = :id ";
      $par = array( ":id" => $val ) ; 
      echo "<h3>Lista ksiazek wypozyczonych przez czytelnika</h3>" ;
      ZapytanieParHTML($sql,$par) ;
      ?>
        
    11. Wprowadzanie czytelnika do bazy danych - formularz test8.html

      Realizacja przykładowego skryptu wprowadzającego dane do bazy danych - formularz HTML umożliwiający wprowadzenie danych czytelnika.

      Skrypt test8.html ( [listing dokumentu] [link do dokumentu] )

      <!--
           Plik: test8.html
      -->
      <form name="czytelnik" action="test8.php" method="post" >
      
      <table>
        <tr><td>Nazwisko:    </td><td><input type="text" name="nazwisko" id="nazwisko" /></td></tr>
        <tr><td>Imie:        </td><td><input type="text" name="imie" id="imie" /></td></tr>
        <tr><td>Kod pocztowy:</td><td><input type="text" name="kod" id="kod" /></td></tr>
        <tr><td>Miasto:      </td><td><input type="text" name="miasto" id="miasto" /></td></tr>
        <tr><td>Adres:       </td><td><input type="text" name="adres" id="adres" /></td></tr>
        <tr><td>E-mail:      </td><td><input type="text" name="email" id="email" /></td></tr>
        <tr><td>             </td><td><input type="submit" value="Wyslij dane" /></td></tr>
      </table>
      
      </form>
      
        
    12. Skrypt wprowadzający czytelnika do bazy - formularz test8.php

      Skrypt realizujący funkcjonalność formularza przedstawionego w punkcie 11.

      Skrypt test8.php ( [listing dokumentu] [link do dokumentu] )

      <?php
      /*
      	Plik: test8.php
      */
      
      // odczyt danych przeslanych z formularza test8.html
      
      $nazwisko = $_POST['nazwisko'] ;
      $imie     = $_POST['imie'] ;
      $kod      = $_POST['kod'] ;
      $miasto   = $_POST['miasto'] ;
      $adres    = $_POST['adres'] ;
      $email    = $_POST['email'] ;
      
      // Zapytanie SQL zapisujące dane do bazy danych
      
      $sql = "INSERT INTO bibl.czytelnik (nazwisko, imie, kod_pocztowy, miasto, adres, email) VALUES ( ?, ?, ?, ?, ?, ?)" ;
      $dane = array($nazwisko,$imie,$kod,$miasto,$adres,$email) ;
      include ('conf.php') ;
      try {
            $pdo = new PDO('pgsql:host='.$host.'; dbname='.$database.'; port='.$port, $username, $password );
            //echo 'Polaczenie poprawnie nawiazane! ';
      
            $stmt = $pdo -> prepare($sql);
            $stmt -> execute($dane) ;
            $count = $stmt -> rowCount();
            if ($count !== false) { echo "Do bazy zostal dodany nowy rekord." ; }
            else { echo "Blad podczas wprowadzania danych." ; }
      
      
      
      }catch(PDOException $e){
            echo 'Połączenie nie zostało utworzone. '.$e->getMessage().'<br />';
      }
      
      ?>  
    13. Wypożyczenie - formularz wybierający czytelnika i książkę - formularz test9f.php

      W ramach tego skryptu wybieramy czytelnika oraz książkę, którą czytelnik pożycza. W obu przypadkach tworzymy listy na podstawie tabel bazodanowych CZYTELNIK i EGZEMPLARZ, z którycych wybieramy interesujące nas rekordy. Dodatkowo w czasie wyboru książki sprawdzamy czy jest dostępna do wypożyczenia. Po odczytaniu identyfikatorów wysyłamy odpowiednie dane do skryptu, który zapiszę wypożyczoną pozycję w odpowiednich tabelach w bazie danych.

      Skrypt test9f.php ( [listing dokumentu] [link do dokumentu] )

      <?php
      /*
      	Plik: test9f.php
      */
        include ('conf.php');
        try {
            $pdo = new PDO("pgsql:host=".$host."; dbname=".$database."; 
                            port=".$port, $username, $password );
            // echo "Połączenie poprawnie nawiązane! ";
      
      
            echo "<form name=\"form\" action=\"test9.php\" method=\"get\" >";
              // czytelnik 
              $sql = "SELECT id_czytelnik, nazwisko, imie FROM bibl.czytelnik ORDER BY nazwisko";
              $stmt = $pdo -> prepare($sql);
              $stmt -> setFetchMode(PDO::FETCH_ASSOC);
              $stmt -> execute() ;
              $result = $stmt -> fetchAll() ;
              echo "<select name=\"id_czytelnik\"  >"; 
              foreach ($result as $row){
                echo "<option value='".$row[id_czytelnik]."' >".$row[nazwisko]." ".$row[imie]."</option>"; 
              }
              echo "</select><br />";
              $stmt -> closeCursor();
              // ksiazka
              $sql = "SELECT e.id_egzemplarz, k.tytul, k.autor FROM bibl.egzemplarz e JOIN bibl.ksiazka k ON e.id_ksiazka = k.id_ksiazka WHERE e.status=0 ORDER BY tytul";
              $stmt = $pdo -> prepare($sql);
              $stmt -> setFetchMode(PDO::FETCH_ASSOC);
              $stmt -> execute() ;
              $result = $stmt -> fetchAll() ;
              echo "<select name=\"id_egzemplarz\"  >"; 
              foreach ($result as $row){
                echo "<option value='".$row[id_egzemplarz]."' >".$row[tytul]." : ".$row[autor]."</option>"; 
              }
              echo "</select><br />";
              $stmt -> closeCursor();
      
              echo "<input type=\"submit\" value=\"Wyslij\" >";
            echo "</form>";  
      
        }catch(PDOException $e){
              echo "Połączenie nie zostało utworzone. ".$e->getMessage()."<br />";
        }
      
      ?>
        
    14. Wypożyczenie - zapisanie do bazy danych - formularz test9.php

      Skrypt realizuje zapis do bazy danych faktu wypożyczenia książki, dane przesłane są z skryptu z punktu 13.

      Skrypt test9.php ( [listing dokumentu] [link do dokumentu] )

      <?php
      /*
      	Plik: test9.php
      */
      include ("conf.php");
      $id_cz = $_GET["id_czytelnik"] ;
      $id_eg = $_GET["id_egzemplarz"] ;
      
      $date = "2013-2-8" ;
      
      $sql1 = "UPDATE  bibl.egzemplarz SET  status=1 WHERE id_egzemplarz= ? AND status=0" ;
      $par1 = array( $id_eg ) ;
      $sql2 = "INSERT INTO bibl.wypozyczenie (id_czytelnik, id_egzemplarz, data_pozyczenie, status) VALUES ( ?, ?, ?, ?)" ;
      $par2 = array( $id_cz, $id_eg, $date, 1 ) ;
      
       
      try {
            $pdo = new PDO('pgsql:host='.$host.'; dbname='.$database.'; port='.$port, $username, $password );
            //echo 'Polaczenie poprawnie nawiazane! ';
      
            try {
               $pdo -> beginTransaction();
               $stmt1 = $pdo -> prepare($sql1);
               $stmt1 -> execute($par1) ;
               if ( $stmt1 -> rowCount() == 0 )  $pdo -> rollBack() ;
               $stmt2 = $pdo -> prepare($sql2);
               $stmt2 -> execute($par2) ;
               $pdo -> commit();
      
               //if ($count !== false) { echo "Do bazy zostal dodany nowy rekord." ; }
               //else { echo "Blad podczas wprowadzania danych." ; }
               echo "Ksiazka zostala pozyczona.";
            } catch (Exception $e) {
               // If something raised an exception in our transaction block of statements,
               // roll back any work performed in the transaction
               print '<p>Niemozliwe zrealizowanie wypozyczenia !</p>';
               $pdo -> rollBack();
            }
      
      
          }catch(PDOException $e){
             echo 'Polaczenie nie zostało utworzone. '.$e->getMessage().'<br />';
      }
      
      ?>
        
  2. Aplikacja obsługująca bazę danych

    1. Skrypt zarządzający aplikacją - index.php

      Skrypt index.php ( [listing dokumentu] [link do dokumentu]

      <?php
      
      // wczytanie zmiennej informującej, do której strony odwołuje się nasze żądanie
      // format żadania http - index.php?page='main' (odwołanie do strony głównej)
      
      // Wykaz stron dostępnych w serwisie {main, page1, page2, page3}
      $portal = array('main', 
                      'page1', 'view11', 'view11a', 
                      'page2', 'view21', 'view21a', 
                      'page3', 'view31', 'view31a', 
                      'page4', 'view1', 'view2', 'view3', 'view4', 'view5', 'view6', 'view7' ) ;
      
      // Pobranie identyfikatora strony i zapis w zmiennej $page
      if ( isset($_GET['page']) ) { $page =  $_GET['page'] ; } else { $page = 'main' ; }
      
      
      // W przypadku identyfikatora do strony wyświetlamy błąd HTTP 404.
      if ( ! in_array($page,$portal) ) {
          header('HTTP/1.0 404 Not Found');
          echo "<h1>404 Not Found</h1>";
          echo "The page that you have requested could not be found.";
          exit();
      }
      
      $add_file = 'true' ;
      // wczytanie nagłówka strony (identyczny dla każdej generowanej strony) 
      include "header.php" ;
      // wczytanie menu naszego serwisu identyczny dla kadej generowanej strony)
      include "menu.php" ;
      // wczytanie zawartości określonych stron
      switch ($page)
      {
          case 'main':    
            //  wczytanie zawartości strony głównej
            include "main.php" ;      
            break ;      
          case 'page1':        
            // wczytanie zawartości kolejnej strony
            include "page1.php" ;      
            break ; 
          case 'view11':        
            // wczytanie zawartości kolejnej strony
            include "view11.php" ;      
            break ; 
          case 'view11a':        
            // wczytanie zawartości kolejnej strony
            include "view11a.php" ;      
            break ;                    
          case 'page2':        
            // wczytanaie zawartości kolejnej strony
            include "page2.php" ;      
            break ;   
          case 'view21':        
            // wczytanie zawartości kolejnej strony
            include "view21.php" ;      
            break ; 
          case 'view21a':        
            // wczytanie zawartości kolejnej strony
            include "view21a.php" ;      
            break ;         
          case 'page3':        
            // wczytanaie zawartości kolejnej strony
            include "page3.php" ;      
            break ;  
          case 'view31':        
            // wczytanie zawartości kolejnej strony
            include "view31.php" ;      
            break ; 
          case 'view31a':        
            // wczytanie zawartości kolejnej strony
            include "view31a.php" ;      
            break ;       
          case 'page4':        
            // wczytanaie zawartości kolejnej strony
            include "page4.php" ;      
            break ;               
          case 'view1':        
            // wczytanaie zawartości kolejnej strony
            include "view1.php" ;      
            break ;
          case 'view2':        
            // wczytanaie zawartości kolejnej strony
            include "view2.php" ;      
            break ;
          case 'view3':        
            // wczytanaie zawartości kolejnej strony
            include "view3.php" ;      
            break ;
          case 'view4':        
            // wczytanaie zawartosci kolejnej strony
            include "view4.php" ;      
            break ;
          case 'view5':        
            // wczytanaie zawartosci kolejnej strony
            include "view5.php" ; 
            break ;     
          case 'view6':        
            // wczytanaie zawartosci kolejnej strony
            include "view6.php" ;      
            break ;
          case 'view7':        
            // wczytanaie zawartosci kolejnej strony
            include "view7.php" ;      
            break ;      
      }
      // wczytanie stopki naszej strony identyczny dla kadej generowanej strony)
      //include "footer.php" ;
      ?>
      
      		  
    2. Arkusze styli formatujące stronę - main.css

      Skrypt main.css ( [listing dokumentu] [link do dokumentu]

      body  { width:860px; }
      header { width:858px; height: 80px; text-align:center }
       
      nav { height : 500px; width:200px; float:left;  }
      nav p { padding:5px; margin:0px }
      
      section { display:block; float:left; height:500px; width:656px; color:navy; }
      section header { font-weight: bold;  text-align:center; width:656px; height:20px; }
      section h1 { color:navy; font-size:12pt; text-align:center }
      section h2 { color:green; font-size:12pt; text-align:center}
      section p.italic { font-style:italic }
      
      footer { clear:both; text-align:center; color:blue }
      
      dt { font-weight: bold; }
      dd { font-style: italic; }
      div.main { padding-left: 15px; }
      p.point { font-weight: bold; }
      p.text { padding-left: 30px; }   
    3. Nagłówek aplikacji - header.php

      Skrypt header.php ( [listing dokumentu] [link do dokumentu]

      <?php
      // sprawdzenie czy plik jest częścia wywołania przez plik zawierający zmienną $add_file
      if ( ! $add_file ) exit ;
      
      ?>
      
      <!doctype html>
      <html>
        <head>  
          <title>Bazy danych - HTML5, php i baza danych</title>    
          <link rel="stylesheet" href="main.css" type="text/css" media="screen" > 
        </head>  
        <body>  
           <header>       
              <p><span style="font-weight: bold;">Prosty system biblioteczny</span><br></p>
           </header>  
    4. Stopka aplikacji - footer.php

      Skrypt footer.php ( [listing dokumentu] [link do dokumentu]

      <?php
      // sprawdzenie czy plik jest częścią wywołania przez plik zawierający zmiennš $add_page
      if ( ! $add_file ) exit ;
      
      ?>
      
            <footer> 
      	      Wersja 1.05, SPN 2023 Kraków 
            </footer>  
          <!-- </div> -->
        </body> 
      </html>  
    5. Lista wyboru aplikacji - menu.php

      Skrypt menu.php ( [listing dokumentu] [link do dokumentu]

      <?php
      // sprawdzenie czy plik jest częścią wywołania przez plik zawierający zmiennš $add_page
      if ( ! $add_file ) exit ;
      
      ?>
      
      <nav>
      
      <a href="index.php?page=main" >Strona główna</a><br/>
      <a href="index.php?page=page1" >Wprowadzanie danych</a><br />
      <a href="index.php?page=view11" >-- Czytelnicy </a><br />
      <a href="index.php?page=page2" >Wypożyczenie książki</a><br /> 
      <a href="index.php?page=view21" >-- Wypożyczenie książki </a><br />
      <a href="index.php?page=page3" >Oddanie książki</a><br />
      <a href="index.php?page=view31" >-- Oddanie książki </a><br />
      <a href="index.php?page=page4" >Raporty</a><br />
      <a href="index.php?page=view1" >-- Czytelnicy </a><br />
      <a href="index.php?page=view2" >-- Książki</a><br />
      <a href="index.php?page=view3" >-- Czytelnicy - książki</a><br />
      <a href="index.php?page=view4" >-- Czytelnicy - bez książek</a><br />
      <a href="index.php?page=view5" >-- Czytelnicy - nie pożyczali</a><br />
      <a href="index.php?page=view6" >-- Książki - pożyczone</a><br />
      <a href="index.php?page=view7" >-- Książki - w bibliotece</a><br />
      
      </nav>
      
      
        
    6. Strona główna aplikacji - main.php

      Skrypt main.php ( [listing dokumentu] [link do dokumentu]

      <?php
      // sprawdzenie czy plik jest częścia wywołania przez plik zawierający zmienną $add_page
      if ( ! $add_file ) exit ;
      
      ?>
      
      
      <section>
      <header>Obsługa bazy danych poprzez interfejs WWW</header>
      
      <br />
      <p>W ramach niniejszej strony przedstawiony zostanie mały serwis obsługujący bazę danych BIBLIOTEKA. 
         W kolejnych punktach przedstawione zostaną skrypty umożliwiające wprowadzanie danych do bazy danych,
         przeglądanie gotowych zestawień oraz tworzenie zestawień opartych o zapytania parametryczne.</p>
      
      <div class="main">
      <dl>
        <dt>Formularze wprowadzajace dane</dt>
        <dd>
            Wprowadzanie danych do tabel DZIAL i CZYTELNIK jest niezależne od danych zawartych w innych tabelach. 
            W tabelach tych brak jest kluczy obcych. <br/>
            Wprowadzanie danych do pozostałych tabel wymaga już odpowiednich danych w tabelach powiązanych.
            I tak wprowadzanie do tabeli KSIAZKA wymaga danych z tabeli DZIAL. Wprowadzanie danych do tabeli EGZEMPLARZ 
            wymaga informacji z tabeli KSIAZKA. Wprowadzanie danych do tabeli WYPOZYCZENIE wymaga danych z tabel EGZEMPLARZ 
            i CZYTELNIK. 
        </dd>
      
        <dt>Skrypt wyswietlajacy z dane tabel lub widoków</dt>
        <dd>
            Przedstawiony w ramach tego punktu skrypt umożliwia wyświetlenie danych zawartych w dowolenj tabeli wynikowej. 
        </dd>
      
        <dt>Formularze obsługujące skrytpy parametryczne.</dt>
        <dd>
            W ramach tego rozdziału podane zostaną zapytania parametryczne.
        </dd>
      </dl> 
      </div>
      
      </section>
        
    7. Raport: lista czytelników w bazie - view1.php

      Skrypt view1.php ( [listing dokumentu] [link do dokumentu]

      <?php
      // sprawdzenie czy plik jest częścia wywołania przez plik zawierający zmienną $add_page
      if ( ! $add_file ) exit ;
      ?>
      
      <section>
      
      <header>
      Tabela wszystkich czytelników w bibliotece.
      </header>
      
      <?php
      include ('zapytanie.php');
      
      $sql = "SELECT imie, nazwisko FROM bibl.czytelnik";
      ZapytanieHTML($sql) ;
      ?>
      
      </section>
        
    8. Raport: lista książek w bazie - view2.php

      Skrypt view2.php ( [listing dokumentu] [link do dokumentu]

      <?php
      // sprawdzenie czy plik jest częścia wywołania przez plik zawierający zmienną $add_page
      if ( ! $add_file ) exit ;
      ?>
      
      <section>
      
      <header>
      Tabela wszystkich książek dostępnych w bibliotece.
      </header>
      
      <?php
      include ('zapytanie.php');
      
      $sql = "SELECT tytul, autor FROM bibl.ksiazka";
      ZapytanieHTML($sql) ;
      ?>
      
      </section>  
    9. Raport: liczba książek wypożyczona przez poszczególnych czytelników - view3.php

      Skrypt view3.php ( [listing dokumentu] [link do dokumentu]

      <?php
      // sprawdzenie czy plik jest częścia wywołania przez plik zawierający zmienną $add_page
      if ( ! $add_file ) exit ;
      ?>
      
      <section>
      
      <header>
      Liczba książek pożyczonych przez czytelnikow.
      </header>
      
      <?php
      include ('zapytanie.php');
      
      $sql = "SELECT * FROM bibl.v_czytelnik_wypozyczenia";
      ZapytanieHTML($sql) ;
      ?>
      
      </section>
      
      
         
    10. Raport: lista czytelników, którzy nie mają pożyczonych książek - view4.php

      Skrypt view4.php ( [listing dokumentu] [link do dokumentu]

      <?php
      // sprawdzenie czy plik jest częścia wywołania przez plik zawierający zmienną $add_page
      if ( ! $add_file ) exit ;
      ?>
      
      <section>
      
      <header>
      Lista czytelnikow bez pożyczonych książek.
      </header>
      
      <?php
      include ('zapytanie.php');
      
      $sql = "SELECT * FROM bibl.v_czytelnik_brak_wypozyczen";
      ZapytanieHTML($sql) ;
      ?>
      
      </section>
        
    11. Raport: lista czytelników, którzy nigdy nie pożyczyli książek - view5.php

      Skrypt view5.php ( [listing dokumentu] [link do dokumentu]

      <?php
      // sprawdzenie czy plik jest częścia wywołania przez plik zawierający zmienną $add_page
      if ( ! $add_file ) exit ;
      ?>
      
      <section>
      
      <header>
      Lista czytelnikow, ktorzy nie pożyczyli książek.
      </header>
      
      <?php
      include ('zapytanie.php');
      
      $sql = "SELECT * FROM bibl.v_czytelnik_nie_pozyczal";
      ZapytanieHTML($sql) ;
      ?>
      
      </section>
        
    12. Raport: lista pożyczonych książek - view6.php

      Skrypt view6.php ( [listing dokumentu] [link do dokumentu]

      <?php
      // sprawdzenie czy plik jest częścia wywołania przez plik zawierający zmienną $add_page
      if ( ! $add_file ) exit ;
      ?>
      
      <section>
      
      <header>
      Lista książek pożyczonych.
      </header>
      
      <?php
      include ('zapytanie.php');
      
      $sql = "SELECT * FROM bibl.v_ksiazki_pozyczone";
      ZapytanieHTML($sql) ;
      ?>
      
      </section>
      
      
         
    13. Raport: lista książek w bibliotece - view7.php

      Skrypt view7.php ( [listing dokumentu] [link do dokumentu]

      <?php
      // sprawdzenie czy plik jest częścia wywołania przez plik zawierający zmienną $add_page
      if ( ! $add_file ) exit ;
      ?>
      
      <section>
      
      <header>
      Lista książek w bibliotece.
      </header>
      
      <?php
      include ('zapytanie.php');
      
      $sql = "SELECT * FROM bibl.v_ksiazki_w_bibliotece";
      ZapytanieHTML($sql) ;
      ?>
      
      </section>
        
    14. Dodanie czytelnika: formularz - view11.php

      Skrypt view11.php ( [listing dokumentu] [link do dokumentu]

      <?php
      // sprawdzenie czy plik jest częścia wywołania przez plik zawierający zmienną $add_page
      if ( ! $add_file ) exit ;
      ?>
      
      <section>
      
      <header>
      Wprowadzanie danych czytelnika.
      </header>
      
      <br />
      
      <form name="czytelnik" action="index.php?page=view11a" method="post" >
      
      <table>
        <tr><td>Nazwisko:    </td><td><input type="text" name="nazwisko" id="nazwisko" /></td></tr>
        <tr><td>Imie:        </td><td><input type="text" name="imie" id="imie" /></td></tr>
        <tr><td>Kod pocztowy:</td><td><input type="text" name="kod" id="kod" /></td></tr>
        <tr><td>Miasto:      </td><td><input type="text" name="miasto" id="miasto" /></td></tr>
        <tr><td>Adres:       </td><td><input type="text" name="adres" id="adres" /></td></tr>
        <tr><td>E-mail:      </td><td><input type="text" name="email" id="email" /></td></tr>
        <tr><td>             </td><td><input type="submit" value="Wyslij dane" /></td></tr>
      </table>
      
      </form>
      
      </section>
        
    15. Dodanie czytelnika: skrypt dodajacy do bazy - view11a.php

      Skrypt view11a.php ( [listing dokumentu] [link do dokumentu]

      <?php
      // sprawdzenie czy plik jest częścia wywołania przez plik zawierający zmienną $add_page
      if ( ! $add_file ) exit ;
      ?>
      
      <section>
      
      <header>
      Raport dodanie czytelnika.
      </header>
      
      <?php
      $nazwisko = $_POST['nazwisko'] ;
      $imie     = $_POST['imie'] ;
      $kod      = $_POST['kod'] ;
      $miasto   = $_POST['miasto'] ;
      $adres    = $_POST['adres'] ;
      $email    = $_POST['email'] ;
      
      // Zapytanie SQL zapisujące dane do bazy danych
      
      $sql = "INSERT INTO bibl.czytelnik (nazwisko, imie, kod_pocztowy, miasto, adres, email) VALUES ( ?, ?, ?, ?, ?, ?)" ;
      $dane = array($nazwisko,$imie,$kod,$miasto,$adres,$email) ;
      include ('conf.php') ;
      try {
            $pdo = new PDO('pgsql:host='.$host.'; dbname='.$database.'; port='.$port, $username, $password );
            //echo 'Polaczenie poprawnie nawiazane! ';
      
            $stmt = $pdo -> prepare($sql);
            $stmt -> execute($dane) ;
            $count = $stmt -> rowCount();
            if ($count !== false) { echo "Do bazy zostal dodany nowy rekord." ; }
            else { echo "Blad podczas wprowadzania danych." ; }
      
      
      
      }catch(PDOException $e){
            echo 'Połączenie nie zostało utworzone. '.$e->getMessage().'<br />';
      }
      ?>
      
      </section>
        
    16. Wypozyczenie ksiazki: formularz - view21.php

      Skrypt view21.php ( [listing dokumentu] [link do dokumentu]

      <?php
      // sprawdzenie czy plik jest częścia wywołania przez plik zawierający zmienną $add_page
      if ( ! $add_file ) exit ;
      ?>
      
      <section>
      
      <header>
      Wypożyczenie książki.
      </header>
      
      <?php
      
        include ('conf.php');
        try {
            $pdo = new PDO("pgsql:host=".$host."; dbname=".$database."; 
                            port=".$port, $username, $password );
            // echo "Połączenie poprawnie nawiązane! ";
      
      
            echo "<form name=\"form\" action=\"index.php?page=view21a\" method=\"post\" >";
              // czytelnik 
              $sql = "SELECT id_czytelnik, nazwisko, imie FROM bibl.czytelnik ORDER BY nazwisko";
              $stmt = $pdo -> prepare($sql);
              $stmt -> setFetchMode(PDO::FETCH_ASSOC);
              $stmt -> execute() ;
              $result = $stmt -> fetchAll() ;
              echo "<select name=\"id_czytelnik\"  >"; 
              foreach ($result as $row){
                echo "<option value='".$row[id_czytelnik]."' >".$row[nazwisko]." ".$row[imie]."</option>"; 
              }
              echo "</select><br />";
              $stmt -> closeCursor();
              // ksiazka
              $sql = "SELECT e.id_egzemplarz, k.tytul, k.autor FROM bibl.egzemplarz e JOIN bibl.ksiazka k ON e.id_ksiazka = k.id_ksiazka WHERE e.status=0 ORDER BY tytul";
              $stmt = $pdo -> prepare($sql);
              $stmt -> setFetchMode(PDO::FETCH_ASSOC);
              $stmt -> execute() ;
              $result = $stmt -> fetchAll() ;
              echo "<select name=\"id_egzemplarz\"  >"; 
              foreach ($result as $row){
                echo "<option value='".$row[id_egzemplarz]."' >".$row[tytul]." : ".$row[autor]."</option>"; 
              }
              echo "</select><br />";
              $stmt -> closeCursor();
      
              echo "<input type=\"submit\" value=\"Wyslij\" >";
            echo "</form>";  
      
        }catch(PDOException $e){
              echo "Połączenie nie zostało utworzone. ".$e->getMessage()."<br />";
        }
      
      ?>  
      
      </section>
        
    17. Wypozyczenie ksiazki: skrypt dodajacy do bazy - view21a.php

      Skrypt view21a.php ( [listing dokumentu] [link do dokumentu]

      <?php
      // sprawdzenie czy plik jest częścia wywołania przez plik zawierający zmienną $add_page
      if ( ! $add_file ) exit ;
      ?>
      
      <section>
      
      <header>
      Raport wypozyczenia ksiazki.
      </header>
      
      <?php
      
      include ("conf.php");
      $id_cz = $_POST["id_czytelnik"] ;
      $id_eg = $_POST["id_egzemplarz"] ;
      
      $date = "2013-2-8" ;
      
      $sql1 = "UPDATE  bibl.egzemplarz SET  status=1 WHERE id_egzemplarz= ? AND status=0" ;
      $par1 = array( $id_eg ) ;
      $sql2 = "INSERT INTO bibl.wypozyczenie (id_czytelnik, id_egzemplarz, data_pozyczenie, status) VALUES ( ?, ?, ?, ?)" ;
      $par2 = array( $id_cz, $id_eg, $date, 1 ) ;
      
       
      try {
            $pdo = new PDO('pgsql:host='.$host.'; dbname='.$database.'; port='.$port, $username, $password );
            //echo 'Polaczenie poprawnie nawiazane! ';
      
            try {
               $pdo -> beginTransaction();
               $stmt1 = $pdo -> prepare($sql1);
               $stmt1 -> execute($par1) ;
               if ( $stmt1 -> rowCount() == 0 )  $pdo -> rollBack() ;
               $stmt2 = $pdo -> prepare($sql2);
               $stmt2 -> execute($par2) ;
               $pdo -> commit();
      
               //if ($count !== false) { echo "Do bazy zostal dodany nowy rekord." ; }
               //else { echo "Blad podczas wprowadzania danych." ; }
               echo "Ksiazka zostala pozyczona.";
            } catch (Exception $e) {
               // If something raised an exception in our transaction block of statements,
               // roll back any work performed in the transaction
               print '<p>Niemozliwe zrealizowanie wypozyczenia !</p>';
               $pdo -> rollBack();
            }
      
      
          }catch(PDOException $e){
             echo 'Polaczenie nie zostało utworzone. '.$e->getMessage().'<br />';
      }
      
      ?>
      
      </section>
        
    18. Oddanie ksiazek: formularz - view31.php

      Skrypt view31.php ( [listing dokumentu] [link do dokumentu]

      <?php
      // sprawdzenie czy plik jest częścia wywołania przez plik zawierający zmienną $add_page
      if ( ! $add_file ) exit ;
      ?>
      
      <section>
      
      <header>
      Oddanie książki.
      </header>
      
      <?php
      
        include ('conf.php');
        try {
            $pdo = new PDO("pgsql:host=".$host."; dbname=".$database."; 
                            port=".$port, $username, $password );
            // echo "Połączenie poprawnie nawiązane! ";
      
      
            echo "<form name=\"form\" action=\"index.php?page=view31a\" method=\"post\" >";
              // czytelnik 
              $sql = "SELECT u.nazwisko, u.imie, k.tytul, w.id_wypozyczenie 
                      FROM bibl.czytelnik u join bibl.wypozyczenie w ON u.id_czytelnik = w.id_czytelnik
                                            join bibl.egzemplarz e ON w.id_egzemplarz = e.id_egzemplarz
                                            join bibl.ksiazka k ON e.id_ksiazka = k.id_ksiazka
                      WHERE w.status=1 ORDER BY u.nazwisko";
              $stmt = $pdo -> prepare($sql);
              $stmt -> setFetchMode(PDO::FETCH_ASSOC);
              $stmt -> execute() ;
              $result = $stmt -> fetchAll() ;
              echo "<select name=\"id_wypozyczenie\"  >"; 
              foreach ($result as $row){
                echo "<option value='".$row[id_wypozyczenie]."' >".$row[nazwisko]." ".$row[imie].", ".$row[tytul]."</option>"; 
              }
              echo "</select><br />";
              $stmt -> closeCursor();
              echo "<input type=\"submit\" value=\"Wyslij\" >";
            echo "</form>";  
      
        }catch(PDOException $e){
              echo "Połączenie nie zostało utworzone. ".$e->getMessage()."<br />";
        }
      
      ?>  
      
      </section>
        
    19. Oddanie ksiazek: skrypt modyfikujacy w bazie danych - view31a.php

      Skrypt view31a.php ( [listing dokumentu] [link do dokumentu]

      <?php
      // sprawdzenie czy plik jest częścia wywołania przez plik zawierający zmienną $add_page
      if ( ! $add_file ) exit ;
      ?>
      
      <section>
      
      <header>
      Raport oddania ksiazki.
      </header>
      
      <?php
      
      include ("conf.php");
      $id_wyp = $_POST["id_wypozyczenie"] ;
      
      
      $date = "2017-5-13" ;
      
      $sql1 = "UPDATE  bibl.wypozyczenie SET (data_oddania,status) = ('2017-05-13',2) 
               WHERE id_wypozyczenie = ?" ;
      $par1 = array( $id_wyp ) ;
      $sql2 = "UPDATE bibl.egzemplarz SET status=0 
               WHERE  id_egzemplarz = (select id_egzemplarz FROM bibl.wypozyczenie WHERE id_wypozyczenie = ?)";
      $par2 = array( $id_wyp ) ;
      
       
      try {
            $pdo = new PDO('pgsql:host='.$host.'; dbname='.$database.'; port='.$port, $username, $password );
            //echo 'Polaczenie poprawnie nawiazane! ';
      
            try {
               //$pdo -> beginTransaction();
               $stmt1 = $pdo -> prepare($sql1);
               $stmt1 -> execute($par1) ;
               //if ( $stmt1 -> rowCount() == 0 )  $pdo -> rollBack() ;
               $stmt2 = $pdo -> prepare($sql2);
               $stmt2 -> execute($par2) ;
               //$pdo -> commit();
      
               //if ($count !== false) { echo "Ksiazka zostala oddana." ; }
               //else { echo "Blad podczas wprowadzania danych." ; }
               echo "Ksiazka zostala oddana.";
            } catch (Exception $e) {
               // If something raised an exception in our transaction block of statements,
               // roll back any work performed in the transaction
               print '<p>Niemozliwe zrealizowanie oddania !</p>';
               $pdo -> rollBack();
            }
      
      
          }catch(PDOException $e){
             echo 'Polaczenie nie zostało utworzone. '.$e->getMessage().'<br />';
      }
      
      ?>
      
      </section>