Filip Markiewicz webmaster freelancer

Spis monet II Rzeczypospolitej

Data dodania: 14 styczeń 2012r.

To pierwszy artykuł nie czysto informatyczny. Mianowicie opiszę teraz skrypt służący do prowadzenia własnego spisu posiadanych w kolekcji monet z okresu II Rzeczypospolitej. Do działania skryptu potrzebny jest dostęp do bazy danych MySQL. Monety wyświetlane są wg wielu rodzajów sortowania. Dodawanie nowych następuje poprzez elegancki formularzyk. Monety mozna oczywiście edytować i usuwać. Do powiększania zdjęć naszej kolekcji użyłem popularnego skryptu Lightbox 2. Jeśli ktoś nie chce z niego korzystać wystarczy zmienić linijkę 262 w pliku index.php, bo tam jest fragment kodu odpowiadający za wyświetlanie zdjęcia aktualnie przetwarzanej monety. W spisie każda moneta posiada następujące dane:

Jak to zainstalować?

Zanim przejdę do opisu kodu skryptu, wytłumaczę w paru prostych krokach jak zainstalować to sobie i korzystać z własnego spisu monet II Rzeczypospolitej, w przypadku, gdy ktoś nie miał nigdy do czynienia z tworzeniem stron internetowych. Kroki są napisane dośc ogólnie i jeśli ktoś będzie mieć problem to śmiało pisać – najlepiej w komen­tarzach, żeby rozwiązanie było na stronie.

  1. Musimy zainstalować na swoim komputerze serwer PHP, np. WebServ, albo skorzystać z np. darmowego hostingu cba.pl
  2. Gdy już mamy serwer, musimy skopiować wszystkie potrzebne pliki do głównego katalogu public_html i usunąć z niego plik index.html jeśli takowy istnieje. Należy także pamiętać, aby w pliku mysql_connect.php podać swoje dane do bazy danych, w linijce 3, gdzie jest kod:
    $db = mysql_connect("nazwa_serwera", "uzytkownik", "haslo") or die ("Nie można połączyć się z bazą danych...");
    
  3. Teraz należy zalogować się do panelu PHPMyAdmin'a i wpisać w zakładce SQL kod z nastepnego rozdziału – „Przygotowanie bazy danych”
  4. W zasadzie to już wszystko. Teraz musimy wejść na swoją stronę i możemy przystąpić do prowadzenia własnego spisu.

Przygotowanie bazy danych

Przejdźmy do bazy danych. Do działania skryptu potrzebne są dwie tabele – jedna przechowująca wszystkie monety w spisie i druga potrzebna do identyfikacji administratora (w końcu nie chcemy, aby osoba trzecia dodawała, albo usuwała nam monety ze spisu). Nazwy tabel są przykładowe, potem, w pliku config.php będzie trzeba podać ich nazwę (domyślnie jest to nazwa z poniższego kodu), więc może być ona dowolna, jaka nam pasuje.

Listing 1 Polecenia tworzące tabele w bazie danych.

CREATE TABLE `2rp` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `kod_nominal` tinyint(3) unsigned NOT NULL,
  `nazwa` tinytext,
  `rok` smallint(6) unsigned NOT NULL,
  `znak` tinyint(4),
  `srednica` float unsigned NOT NULL,
  `waga` float unsigned NOT NULL,
  `rant` tinytext NOT NULL,
  `cena` decimal(9,2) unsigned,
  `wysylka` tinyint(4),
  `miejsce_kupna` tinytext,
  `komentarz` text,
  `dzien_kupna` tinyint(32) unsigned,
  `miesiac_kupna` tinyint(3) unsigned,
  `rok_kupna` smallint(5) unsigned,
  `data_dodania` datetime NOT NULL,
  `ostatnia_edycja` datetime,
  PRIMARY KEY  (`id`)
  ) default charset = utf8 collate = utf8_polish_ci;

CREATE TABLE `admin` (
  `id` int(10) unsigned NOT NULL auto_increment PRIMARY KEY,
  `login` tinytext NOT NULL,
  `haslo` char(40) NOT NULL
  );

Najlepiej od razu do tabeli admin wprowadzić dane administratora, abyśmy potem spokojnie mogli przejść do dodawania monet do spisu.

Listing 2 Dodanie przykładowych danych administratora do bazy danych.

INSERT INTO admin VALUES(NULL, 'Twoj nick', sha1('Twoje haslo'));

Połączenie z bazą danych MySQL

Połączenie z bazą danych może wyglądać np. tak. W miejsce localhost musimy podać nazwę serwera; w miejsce root – nazwę użytkownika; w następnym, tutaj pustym miejscu, powinno znajdować się hasło. Natomiast funkcji mysql_select_db() przekazujemy nazwę naszej bazy danych (u mnie baza danych nazywa się „cms”).

Listing 3 mysql_connect.php – Połączenie z bazą danych.

<?php
$db = mysql_connect("localhost", "root", "") or die ("Nie można połączyć się z bazą danych...");

mysql_select_db("cms") or die ("Nieznana baza danych!");

mysql_query("SET NAMES utf8");
mysql_query("SET CHARACTER SET utf8");
mysql_query("SET collation_connection = utf8_polish_ci");
?>

W pliku config.php musimy podać nazwy stworzonych wcześniej tabel, nazwę folderu, gdzie mają być przechowywane zdjęcia, a także liczbę monet wyświetlanych na jednej stronie spisu (spis posiada stronnicowanie). Domyślnie tytuł strony to po prostu „Spis monet II Rzeczypospolitej”, ale można sobie to zmienić na np. „Spis monet Zbyszka” etc. ;]. Poza tym, dla wygody przyszłego użytkownika, nazwy wszystkich składowych plików skryptu są także „do ustawienia”. Nie osadziłem tych danych bezpośrednio w kodzie skryptu, bo wtedy byłby on mało elastyczny.

Listing 4 config.php – konfiguracja nazewnictwa tabel

<?php

$sciezka = pathinfo($_SERVER['SCRIPT_FILENAME']);
$plik = $sciezka['basename'];

// tytul spisu
$tytul_spisu = 'Spis monet II Rzeczypospolitej';

//nazwa tabeli, w ktorej maja byc przechowywane monety
$nazwa_tabeli = '2rp';

// nazwa tabeli, w ktorej sa dane admina
$admin_tabela = 'admin';

// nazwa katalogu, gdzie maja byc przechowywane zdjecia
$katalog_zdjecia = 'zdjecia';

// ilosc monet na stronie
$ilosc_na_stronie = 15;

// nazwa pliku glownego, w ktorym wyswietlane sa monety
$plik_glowny = 'index.php';

/* jesli korzystano ze stronnicowania to dodaj automatycznie do linkow odpowiednia strone, 
ktora jest zapisana w zmiennej sesji, o ile nie jestesmy na stronie wyswietlania monet */
if(isset($_SESSION['str']) && $plik != $plik_glowny)
{
$plik_glowny .= "?str=".$_SESSION['str'];
}

// nazwa pliku ze skryptem dodawania monety
$plik_dodaj = 'dodaj.php';

// nazwa pliku ze skryptem edycji monety
$plik_edytuj = 'edytuj.php';

// nazwa pliku ze skryptem usuwania zdjec
$plik_usun = 'usun.php';

// nazwa pliku ze skryptem logowania sie
$plik_zaloguj = 'zaloguj.php';

// nazwa pliku ze skryptem wylogowania
$plik_wyloguj = 'wyloguj.php';

// nazwa pliku ze skryptem tworzenia tabeli do wydruku
$plik_do_wydruku = 'do_wydruku.php';

?>

Funkcje powodzenia i błędu

Teraz podam kod dwóch najczęsciej używanych funkcji powodzenia lub blędu, których uzywam w tym skrypcie bardzo często. Funkcje Error i Correct przed przerwaniem skryptu (exit;) załączają plik foot.php, aby przed zatrzymaniem działania skryptu pokazała się stopka strony. Jeśli Twój plik nazywa się inaczej/nie masz takiego to zmień/usuń tą linijkę. Funkcja Warning wyświetla po prostu ostrzeżenie, gdy coś się nie powiodło w skrypcie, ale nie ma to większego znaczenia. Dlatego funkcja ta nie przerywa działania skryptu.

Listing 5.1 funkcje.php – funkcje powodzenia, błędu i ostrzeżenia

<?php

include('config.php');

function Error($tekst, $podstrona = 1)
{
 global $plik;
 global $plik_glowny;

 if($podstrona == 0)
 {
  $odsylacz = $plik;
 }
 else
 {
  $odsylacz = $plik_glowny;
 }

 echo "\n\n<p class=\"error_\">".$tekst." <a href=\"".$odsylacz."\">Powrót</a></p>\n\n";

 // wyswietlenie przed zakonczeniem skryptu stopki strony 
 include('foot.php');
 exit;
}

function Warning($tekst)
{
echo "\n\n<p class=\"error_\">".$tekst."</p>\n\n";
}

function Correct($tekst, $podstrona = 1)
{
 global $plik;
 global $plik_glowny;

 if($podstrona == 0)
 {
  $odsylacz = $plik;
 }
 else
 {
  $odsylacz = $plik_glowny;
 }
 
 echo "<p class=\"correct_\">".$tekst." <a href=\"".$odsylacz."\">Powrót</a></p>";

 // wyswietlenie przed zakonczeniem skryptu stopki strony 
 include('foot.php');
 exit;
}

Funkcje do przetwarzania daty

Do przetwarzania daty napisałem 3 funkcje. Pierwsza z nich dodaje zero poprzedzające numer miesiąca, jeśli jest to liczba mniejsza od 10. Jest to potrzebne aby zapisywać datę kupna w formie dd.mm.rrr, ponieważ ta data jest rozbita na 3 pola w bazie danych (nie jest obowiązkowe podanie dnia, bo nie zawsze jest on znany). Funkcja ta uzywana jest podczas tworzenia tabeli z posiadanymi monetami do wydruku.

Druga funkcja zamienia numer miesiąca na słowną jego nazwę – aby czytelniej się to prezentowało w spisie. Trzecia funkcja, pokazCzas, przyjmuje jako parametr datę w formacie RRRR-MM-DD GG:MM:SS (datetime w MySQL) i zwraca datę w formie DD nazwa-miesiaca RRRRr., wykorzystując funkcję Miesiac do zmiany numeru miesiąca na jego słowną nazwę. Ponadto przyjmuje drugi parametr, opcjonalny, dzięki któremu mozna pokazać datę z godziną (domyślnie) lub bez.

Listing 5.2 funkcje.php – funkcje przetwarzania daty

function dodajZero($liczba)
{

 if($liczba < 10 && $liczba > 0)
 {
  return '0'.$liczba;
 }
 else
 {
  return $liczba;
 }

}

function Miesiac($miesiac)
{

 switch($miesiac)
 {
  case 1:
  $miesiac = 'styczeń';
  break;

  case 2:
  $miesiac = 'luty';
  break;

  case 3:
  $miesiac = 'marzec';
  break;
 
  case 4:
  $miesiac = 'kwiecień';
  break; 

  case 5:
  $miesiac = 'maj';
  break;

  case 6:
  $miesiac = 'czerwiec';
  break;

  case 7:
  $miesiac = 'lipiec';
  break;

  case 8:
  $miesiac = 'sierpień';
  break;

  case 9:
  $miesiac = 'wrzesień';
  break; 

  case 10:
  $miesiac = 'październik';
  break;

  case 11:
  $miesiac = 'listopad';
  break; 

  case 12:
  $miesiac = 'grudzień';
  break;
 }
 
 return $miesiac;

}

function pokazCzas($czas, $parametr = 1)
{

$data_rozbita = explode(' ', $czas);

$dni = explode('-', $data_rozbita[0]);
$godziny = explode(':', $data_rozbita[1]);

$dzien = $dni[2];
$miesiac = Miesiac($dni[1]);
$rok = $dni[0];

$godzina = $godziny[0];
$minuty = $godziny[1];
$sekundy = $godziny[2];

 if($parametr == 1)
 {
  $data = $dzien.' '.$miesiac.' '.$rok.'r., '.$godzina.':'.$minuty;
 }
 else
 {
  $data = $dzien.' '.$miesiac.' '.$rok.'r.';
 }
 
 return $data;

}

Funckje potrzebne do dodawania monet

Teraz nadszedł czas na funkcje dodawania zdjęć, a także prostą funkcję, któa zmienia przecinek na kropkę, ponieważ w informatyce liczby zmiennoprzecinkowe muszą zawierać kropkę, a nie przecinek, jak zwykle się u nas pisze. Funkcja dodajZdjecie pobiera dwa parametry. Pierwszy z nich – $nazwa – powinien zawierać nazwę HTMLowego inputa typu file. Drugi argument pobiera liczbę, pod jakim numerem powinien zapisac zdjęcie.

Skrypt, który usuwa zdjęcie pobiera jako argument numer zdjęcia, które powinien usunąć. Następnie sprawdza czy zdjęcie pod takim numerem istnieje i, jeśli tak, to je usuwa.

Listing 5.3 funkcje.php – funkcje zdjęciowe i funkcja zmiany przecinka w kropkę dla liczb zmiennoprzecinkowych

function przecinek2kropka($zmienna)
{
$zmienna = str_replace(',', '.', $zmienna);
return $zmienna;
}

function dodajZdjecie($nazwa, $numer)
{
 
 global $katalog_zdjecia;
 
 if(isset($_FILES[$nazwa]['tmp_name']))
 {
 
  $dokument = $_FILES[$nazwa]['name'];

  if($_FILES[$nazwa]['error'] > 0)
  {
   if($_FILES[$nazwa]['error'] < 4)
   {
    switch($_FILES[$nazwa]['error'])
    {
     case 1: Warning('Za duży rozmiar pliku'); break;
     case 2: Warning('Za duzy rozmiar zdjęcia.'); break;
     case 3: Warning('Plik wysłany tylko czesciowo'); break;
    }
   }
  }
  else
  {
   if($_FILES[$nazwa]['type'] == 'image/jpeg' || $_FILES[$nazwa]['type'] == 'image/png' || $_FILES[$nazwa]['type'] == 'image/gif')
   {
   
    usunZdjecie($numer);
    $dane = pathinfo($dokument);
    $format = $dane['extension'];
    $lokalizacja = "./".$katalog_zdjecia."/zdjecie".$numer.'.'.$format;

    if(is_uploaded_file($_FILES[$nazwa]['tmp_name']))
    {
     if(!move_uploaded_file($_FILES[$nazwa]['tmp_name'], $lokalizacja) && !usunZdjecie($numer))
     {
      Warning('Problem, plik nie może być skopiowany do katalogu');
     }
    }
    else 
    {
     Warning('Problem: mozliwy atak podczas wysylania pliku');
    }
   }
   else
   {
    Warning('Złe rozszerzenie pliku &ndash; nie wysłano zdjęcia.');
   }
  }
 }
}

function usunZdjecie($numer)
{
 global $katalog_zdjecia;
 
 $sciezka = './'.$katalog_zdjecia.'/zdjecie'.$numer;
 
 $jpg = $sciezka.'.jpg';
 $png = $sciezka.'.png';
 $gif = $sciezka.'.gif';
 
 if(is_file($jpg))
 {
  $zdjecie = $jpg;
 }
 else if (is_file($png))
 {
  $zdjecie = $png;
 }
 else if(is_file($gif))
 {
  $zdjecie = $gif;
 }
 
 if(strlen($zdjecie) > 1)
 {
  if(!unlink($zdjecie))
  {
   Warning("Niestety, ale wystąpiły problemy podczas usuwania zdjęcia.");
  }
 }
}

Filtracja danych

Ustaliłem, że pewne dane muszą być obowiązkowe i przefiltrowane zanim moneta zostanie dodana do spisu. Funkcja filtrDanych() sprawdza poprawność wprowadzonych danych i jeśli wszystko jest w porządku, to zwraca odpowiednie zapytanie do bazy danych (zależnie od opcjonalnego parametru) dodające lub uaktualniające dane o monecie.

Listing 5.4 funkcje.php – filtrowanie danych

function filtrDanych($nazwa_tabeli, $kod_nominal, $nazwa, $rok_emisji, $znak, $srednica, $waga, $rant, $cena, $wysylka, $miejsce_kupna, $komentarz, $dzien, $miesiac, $rok, $parametr = 0)
{

  // nominal
	$kod_nominal = trim($kod_nominal);

  // nazwa
  $nazwa = trim($nazwa);

  if($nazwa == '0')
  {
   $nazwa = 0;
  }

  // rok emisji
  $rok_emisji = trim($rok_emisji);

  if(!is_numeric($rok_emisji) || strlen($rok_emisji) != 4)
  {
   Error("Rok musi być czterocyfrową liczbą naturalną!");
  }

  // znak mennicy
  if($znak != 1)
  {
   $znak = 0;
  }
	
  // srednica
  $srednica = przecinek2kropka(trim($srednica));  

  if(!is_numeric($srednica))
  {
   Error("Średnica to musi być liczba!");
  }

  // waga
  $waga = przecinek2kropka(trim($waga));  

  if(!is_numeric($waga))
  {
   Error("Waga to musi być liczba!");
  } 
	
  // rant
  $rant = trim($rant); 

  if(empty($rant))
  {
   Error("Wybierz rodzaj rantu!");
  }
	
  // cena kupna
  $cena = przecinek2kropka(trim($cena)); 

  if(strlen($cena) > 0)
  {
   if(!is_numeric($cena))
   {
    Error("Cena zakupu to musi być liczba rzeczywista!");
   }
  }
  else 
  {
   $cena = 0;
  }
	
  //wysylka
  $wysylka = trim($wysylka);
	
  if($wysylka != 1 || $cena == 0)
  {
   $wysylka = 0;
  }
	
  // miejsce zakupu
  $miejsce_kupna = mysql_real_escape_string(trim($miejsce_kupna));

  if(strlen($miejsce_kupna) == 0)
  {
   $miejsce_kupna = '';
  }
	
  // komentarz
  $komentarz = mysql_real_escape_string(trim($komentarz));

  if(strlen($komentarz) == 0)
  {
   $komentarz = '';
  }
	
  // data zakupu
  $rok = trim($rok);  

  if(strlen($rok) == 4 && is_numeric($rok))
  {

   $dzien = trim($dzien);

   if(!empty($dzien))
   {
    if(!is_numeric($dzien) || $dzien > 31 || $dzien < 1)
    {
     Error("Dzień to z reguły liczba od 1 do 31");
    }
   } 
   else
   {
    $dzien = 0;
   } 

   $miesiac =  trim($miesiac);

  }
  else
  {
   $rok = 0;
   $miesiac = 0;
   $dzien = 0;
  }
  
  if($parametr < 1)
  {

  $zapytanie = "INSERT INTO $nazwa_tabeli values(NULL, $kod_nominal, '$nazwa', $rok_emisji, $znak, $srednica, $waga, '$rant', $cena, $wysylka, '$miejsce_kupna', '$komentarz', $dzien, '$miesiac', $rok, ".date('Y-m-d H:i:s').", NULL)";
	
  }
  else
  {
  $zapytanie = "UPDATE $nazwa_tabeli set kod_nominal=$kod_nominal, nazwa='$nazwa', rok=$rok_emisji, znak='$znak', srednica='$srednica', waga='$waga', rant='$rant', cena='$cena', wysylka='$wysylka', miejsce_kupna='$miejsce_kupna', dzien_kupna='$dzien', miesiac_kupna=$miesiac, rok_kupna='$rok', komentarz='$komentarz', ostatnia_edycja=".date('Y-m-d H:i:s')." WHERE id=".$_GET['id']."";
  }
	
  return $zapytanie;
	
}

Funkcje formatujące dane przed wyświetleniem

Jako, że w bazie danych nominał jest trzymany w postaci kodu (liczby) to potrzebna jest funkcja, która zamieni kod nominału na odpowiedni nominał. Ta funkcja to kod2nominal(). Natomiast funkcja pokazDate() ładnie formatuje datę zakupu, zależnie parametru, który informuje czy miesiąc ma być w formie słownej czy liczby. Trzy ostatnie funkcje, pokazMiejsce(), pokazCene i pokazKomentarz sprawdzają, czy podano te dane i je odpowiednio formatują (np. czy do ceny należy doliczyć wysyłkę) lub wyświetlają informację, że nie podano tych danych.

Listing 5.5 funkcje.php – przygotowanie danych przed wyświetleniem

function kod2nominal($gdzie)
{
  switch($gdzie)
  {
   case 1:
   $nominal = '1 grosz';
   break;  

   case 2:
   $nominal = '2 grosze';
   break;

   case 3:
   $nominal = '5 groszy';
   break;

   case 4:
   $nominal = '10 groszy';
   break;

   case 5:
   $nominal = '20 groszy';
   break;

   case 6:
   $nominal = '50 groszy';
   break;

   case 7:
   $nominal = '1 złoty';
   break;

   case 8:
   $nominal = '2 złote';
   break;

   case 9:
   $nominal = '5 złotych';
   break;

   case 10:
   $nominal = '10 złotych';
   break;
  }
  
 return $nominal;
 
}

function pokazDate($dzien, $miesiac, $rok, $parametr = 1)
{
  if($dzien == 0)
  {
   $dzien = '';
  }
 
  if($parametr == 0)
  {
 
  $data = dodajZero($miesiac).".".$rok."r.";
  
   if(strlen($dzien) > 0)
   {
    $data = $dzien.".".$data;
   }
  
  }
  else if($parametr == 1)
  {
  $miesiac = Miesiac($miesiac);
	
  $data = $dzien." ".$miesiac." ".$rok."r.";
  }
	
  if($rok > 1)
  {
  return trim($data);
  }
  else
  {
  return 'nieznana';
  }
}

function pokazMiejsce($miejsce)
{
 if(strlen($miejsce) > 1)
 {
  return $miejsce;
 }
 else
 {
  return 'nieznane';
 }
}

function pokazCene($cena, $wysylka, $parametr = 1)
{
 if($cena > 0)
 {
  if($parametr == 0)
  {
   $wysylka_ = ' (w)';
  }
  else if($parametr == 1)
  {
   $wysylka_ = ' + wysyłka';
  }

  if($wysylka > 0)
  {
   return $cena.'zł'.$wysylka_;
  }
  else
  {
   return $cena.'zł';
  }
 }
 else
 {
  return 'nieznana';
 }
}

function pokazKomentarz($komentarz)
{
  if(strlen($komentarz) > 1)
  {
   return stripslashes($komentarz);
  }
  else
  {
   return 'Brak komentarza.';
  }
}

Sortowanie monet

Spis ten ma wiele opcji przesortowania monet. Funkcja rozpoznajSortowanie() przybiera dwa parametry – nazwę (a właściwie kod) metody, a także nazwę tabeli w bazie danych. Następnie dobiera zapytanie wg metody i je zwraca.

Listing 5.6 funkcje.php – funkcja przygotowująca zapytanie z odpowiednim przesortowaniem monet

function rozpoznajSortowanie($metoda, $tabela, $limit = 0, $od_ktorego = 1)
{

global $ilosc_na_stronie;

switch($metoda)
{
 case 'dodanie_asc':
 $zapytanie = "SELECT * FROM $tabela ORDER BY data_dodania";
 break;

 case 'nominal_asc':
 $zapytanie = "SELECT * FROM $tabela ORDER BY kod_nominal, rok, nazwa";
 break;

 case 'nominal_desc':
 $zapytanie = "SELECT * FROM $tabela ORDER BY kod_nominal desc, rok, nazwa";
 break;

 case 'kupno_asc':
 $zapytanie = "SELECT * FROM $tabela ORDER BY rok_kupna, miesiac_kupna, dzien_kupna";
 break;

 case 'kupno_desc':
 $zapytanie = "SELECT * FROM $tabela ORDER BY rok_kupna desc, miesiac_kupna desc, dzien_kupna desc";
 break;

 case 'cena_asc':
 $zapytanie = "SELECT * FROM $tabela ORDER BY cena";
 break;

 case 'cena_desc':
 $zapytanie = "SELECT * FROM $tabela ORDER BY cena DESC";
 break;

 case 'rok_asc':
 $zapytanie = "SELECT * FROM $tabela ORDER BY rok, kod_nominal, nazwa";
 break;

 case 'rok_desc':
 $zapytanie = "SELECT * FROM $tabela ORDER BY rok DESC, kod_nominal, nazwa";
 break;

 default:
 $zapytanie = "SELECT * FROM $tabela ORDER BY data_dodania DESC";
 break;
}

if($limit == 1)
{
$zapytanie .= " LIMIT $od_ktorego, $ilosc_na_stronie";
}

return $zapytanie;

}

?>

Logowanie

Aby móc dokonywać jakichkolwiek zmian w spisie, musimy się doń zalogować. Kod logowania jest w pliku zaloguj.php. Skrypt, który odpowiada za wylogowanie znajduje się w pliku wyloguj.php.

Listing 6 zaloguj.php – skrypt logowania

<?php

include('head.php');

if($_SERVER['REQUEST_METHOD'] == 'POST')
{

 $login = mysql_real_escape_string(trim($_POST['login']));
 $haslo = sha1(mysql_real_escape_string($_POST['haslo']));
 $zapytanie = "SELECT * FROM $admin_tabela WHERE login='$login' AND haslo='$haslo'";
 $wynik = mysql_query($zapytanie);

 if(mysql_num_rows($wynik) > 0)
 {
  $_SESSION['prawdziwy'] = $login;
  Correct("Zalogowano poprawnie", 1);
 }
 else
 {
  Error("Złe dane do logowania");
 }
}
else
{

?>

<form id="logowanie" action="<?php echo $plik_zaloguj; ?>" method="post">
 <fieldset>
  <legend>
   Zaloguj się
  </legend>

  <h2>
   Zaloguj się
  </h2>

  <label>
   Login:
   <input type="text" name="login" />
  </label>

  <label>
   Hasło:
   <input type="password" name="haslo" />
  </label>

  <button type="submit">Zaloguj</button>
  <a href="<?php echo $plik_glowny; ?>" id="powrot">&lt;&lt; Powrót</a>
 </fieldset>
</form>
<?php

}

include('foot.php'); 

?>

Listing 7 wyloguj.php – kod umozliwiający wylogowanie

<?php

include('head.php');

if(isset($_SESSION['prawdziwy']))
{
 $stary = $_SESSION['prawdziwy'];
 unset($_SESSION['prawdziwy']);
 session_destroy();

 if(!empty($stary))
 {
  Correct("Wylogowano poprawnie!");
 }
}
else
{
 Error("Aby się wylogować, trzeba się najpierw zalogować!");
}

include('foot.php');
?>

Dodawanie monet do spisu

Dodawanie nowej monety do spisu odbywa się domyślnie w pliku dodaj.php. Aby móc dodawać nowe monety musimy się oczywiście zalogować. W pliku dodaj.php znajduje się rozbudowany formularz. Gdy go wyślemy i wszystko będzie w porządku, moneta zostanie dodana do bazy danych.

Listing 8 dodaj.php – kod pozwalający na dodanie nowej monety

<?php

include('head.php');

if(isset($_SESSION['prawdziwy']))
{
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
 $zapytanie = filtrDanych($nazwa_tabeli, $_POST['kod_nominal'], $_POST['nazwa'], $_POST['rok_emisji'], $_POST['znak'], $_POST['srednica'], $_POST['waga'], $_POST['rant'], $_POST['cena'], $_POST['wysylka'], $_POST['miejsce_kupna'], $_POST['komentarz'], $_POST['dzien'], $_POST['miesiac'], $_POST['rok']);

 if(mysql_query($zapytanie))
 { 
  dodajZdjecie('plikuzytkownika', mysql_insert_id());
  Correct("Moneta została poprawnie dodana do bazy danych");
 }
 else 
 {
  Error("Wystąpiły problemy podczas dodawania monety do bazy danych...".mysql_error());
 }
}
else
{

?>

<form enctype="multipart/form-data" action="<?php echo $plik_dodaj; ?>" method="post">
<fieldset>
<legend>
Dodaj monetę do katalogu
</legend>

<h2>Dodaj monetę</h2>
<div id="podstawowe">
<label>
Nominał: <span>*</span>
<select name="kod_nominal">
<option value="1">1 grosz</option>
<option value="2">2 grosze</option>
<option value="3">5 groszy</option>
<option value="4">10 groszy</option>
<option value="5">20 groszy</option>
<option value="6">50 groszy</option>
<option value="7">1 złoty</option>
<option value="8">2 złote</option>
<option value="9">5 złotych</option>
<option value="10">10 złotych</option>
</select>
</label>

<label>
Nazwa:
<select name="nazwa">
<option value="0">Bez specjalnej nazwy</option>
<option>Józef Piłsudski</option>
<option>Józef Piłsudski (Orzeł Strzelecki)</option>
<option>Głowa Kobiety</option>
<option>Żaglowiec</option>
<option>Nike</option>
<option>Jan III Sobieski</option>
<option>Romuald Traugutt</option>
<option>Sztandar</option>
<option>Róg i pochodnia</option>
<option>Kropka</option>
<option>Po roku litera H</option>
<option>Stempel odwrócony</option>
<option>Generalne Gubernatorstwo</option>
</select>
</label>

<label>
Rok emisji: <span>*</span>
<input type="text" name="rok_emisji" />
</label>

<label class="checkbox">
<input type="checkbox" name="znak" value="1" /> b.z.
</label>

<label>
Średnica: (mm) <span>*</span> 
<input type="text" name="srednica" />
</label>

<label>
Waga: (g) <span>*</span>
<input type="text" name="waga" />
</label>

<div id="rant">
Rant: <span>*</span>
<label>
<input type="radio" name="rant" value="gładki" /> gładki
</label>

<label>
<input type="radio" name="rant" value="ząbkowany" /> ząbkowany
</label>

<label>
<input type="radio" name="rant" value="Salus Reipublicae Suprema Lex" /> Salus Reipublicae Suprema Lex
</label>

</div>

</div>

<div id="dodatkowe">

<p>
Data kupna:
</p>

<label id="dzien">
<input type="text" name="dzien" />
</label>

<label id="miesiac">
<select name="miesiac">
<option value="1">styczeń</option>
<option value="2">luty</option>
<option value="3">marzec</option>
<option value="4">kwiecień</option>
<option value="5">maj</option>
<option value="6">czerwiec</option>
<option value="7">lipiec</option>
<option value="8">sierpień</option>
<option value="9">wrzesień</option>
<option value="10">październik</option>
<option value="11">listopad</option>
<option value="12">grudzień</option>
</select>
</label>

<label id="rok">
<input type="text" name="rok" />r.
</label>

<label>
Cena zakupu: (zł)
<input type="text" name="cena" />
</label>

<label class="checkbox">
<input type="checkbox" name="wysylka" value="1" /> + wysyłka
</label>

<label>
Miejsce zakupu/sprzedawca:
<input type="text" name="miejsce_kupna" />
</label>

<label>
Komentarz:
<textarea name="komentarz"></textarea>
</label>

<label>
<input type="hidden" name="MAX_FILE_SIZE" value="1048576" />
Dodaj zdjęcie: 
<input name="plikuzytkownika" type="file" />
</label>

</div>

<label>
 <button type="submit">Dodaj</button>
</label>

<a id="powrot" href="<?php echo $plik_glowny; ?>"><< Powrót do spisu</a>

</fieldset>
</form>

<?php
 }
}
else
{
Error("Jako niezalogowany nie możesz dodawać monet!", 1);
}

include('foot.php');

?>

Edycja monet

Wszystkie dane o monetach można łatwo i szybko zmienić. Odbywa się to w pliku edytuj.php, gdzie mamy taki sam formularz jak w dodaj.php, z tym, że pola są już uzupełnione (na tyle, na ile je wcześniej uzupełniliśmy). Kod jest baaaardzo długi, ponieważ jest dużo danych w listach rozwijanych <select> i trzeba za każdym razem sprawdzić czy aktualnie przetwarzany <option> musi być zaznaczony.

Listing 9 edytuj.php – skrypt do edycji monet

<?php

include('head.php');

if(isset($_SESSION['prawdziwy']))
{
 if(isset($_GET['id']))
 {
  if($_SERVER['REQUEST_METHOD'] == 'POST')
  {

  $zapytanie = filtrDanych($nazwa_tabeli, $_POST['kod_nominal'], $_POST['nazwa'], $_POST['rok_emisji'], $_POST['znak'], $_POST['srednica'], $_POST['waga'], $_POST['rant'], $_POST['cena'], $_POST['wysylka'], $_POST['miejsce_kupna'], $_POST['komentarz'], $_POST['dzien'], $_POST['miesiac'], $_POST['rok'], 1);

   if(mysql_query($zapytanie))
   {
    if($_POST['zdjecie'] == 'usun')
    {
     usunZdjecie($_GET['id']);
    }
    else
    {
     dodajZdjecie('plikuzytkownika', $_GET['id']);
    }

    Correct("Dane o monecie zostały poprawnie zmodyfikowane!");
   }
   else 
   {
    Error("Wystąpiły problemy podczas dodawania monety do bazy danych...".mysql_error());
   }
  }
  else
  {
   $zapytanie = "SELECT * FROM $nazwa_tabeli WHERE id=".$_GET['id']."";
   $wynik = mysql_query($zapytanie);
   $moneta = mysql_fetch_assoc($wynik);

   echo "<form enctype=\"multipart/form-data\" action=\"".$plik_edytuj."?id=".$_GET['id']."\" method=\"post\">

<fieldset>
<legend>
Dodaj monetę do katalogu
</legend>

<h2>Edytuj monetę</h2>

<div id=\"podstawowe\">

<label>
Nominał: <span>*</span>
<select name=\"kod_nominal\">
<option value=\"1\">1 grosz</option>

<option ";
if($moneta['kod_nominal'] == 2)
{
echo "selected=\"selected\" ";
}
echo "value=\"2\">2 grosze</option>
<option ";

if($moneta['kod_nominal'] == 3)
{
echo "selected=\"selected\" ";
}
echo "value=\"3\">5 groszy</option>
<option ";

if($moneta['kod_nominal'] == 4)
{
echo "selected=\"selected\" ";
}
echo "value=\"4\">10 groszy</option>
<option ";

if($moneta['kod_nominal'] == 5)
{
echo "selected=\"selected\" ";
}
echo "value=\"5\">20 groszy</option>
<option ";

if($moneta['kod_nominal'] == 6)
{
echo "selected=\"selected\" ";
}

echo "value=\"6\">50 groszy</option>
<option ";

if($moneta['kod_nominal'] == 7)
{
echo "selected=\"selected\" ";
}

echo "value=\"7\">1 złoty</option>
<option ";

if($moneta['kod_nominal'] == 8)
{
echo "selected=\"selected\" ";
}

echo "value=\"8\">2 złote</option>
<option ";

if($moneta['kod_nominal'] == 9)
{
echo "selected=\"selected\" ";
}
echo "value=\"9\">5 złotych</option>
<option ";

if($moneta['kod_nominal'] == 10)
{
echo "selected=\"selected\" ";
}

echo "value=\"10\">10 złotych</option>
</select>
</label>

<label>
Nazwa:
<select name=\"nazwa\">
<option value=\"0\">Bez specjalnej nazwy</option>
<option ";

if($moneta['nazwa'] == 'Józef Piłsudski')
{
echo "selected=\"selected\" ";
}

echo ">Józef Piłsudski</option>
<option ";

if($moneta['nazwa'] == 'Józef Piłsudski (Orzeł Strzelecki)')
{
echo "selected=\"selected\" ";
}

echo ">Józef Piłsudski (Orzeł Strzelecki)</option>
<option ";

if($moneta['nazwa'] == 'Głowa Kobiety')
{
echo "selected=\"selected\" ";
}

echo ">Głowa Kobiety</option>
<option ";

if($moneta['nazwa'] == 'Żaglowiec')
{
echo "selected=\"selected\" ";
}

echo ">Żaglowiec</option>
<option ";

if($moneta['nazwa'] == 'Nike')
{
echo "selected=\"selected\" ";
}

echo ">Nike</option>
<option ";

if($moneta['nazwa'] == 'Jan III Sobieski')
{
echo "selected=\"selected\" ";
}

echo ">Jan III Sobieski</option>
<option ";

if($moneta['nazwa'] == 'Romuald Traugutt')
{
echo "selected=\"selected\" ";
}

echo ">Romuald Traugutt</option>
<option ";

if($moneta['nazwa'] == 'Sztandar')
{
echo "selected=\"selected\" ";
}

echo ">Sztandar</option>
<option ";

if($moneta['nazwa'] == 'Róg i pochodnia')
{
echo "selected=\"selected\" ";
}

echo ">Róg i pochodnia</option>
<option ";

if($moneta['nazwa'] == 'Kropka')
{
echo "selected=\"selected\" ";
}

echo ">Kropka</option>
<option ";

if($moneta['nazwa'] == 'Po roku litera H')
{
echo "selected=\"selected\" ";
}

echo ">Po roku litera H</option>
<option "; 

if($moneta['nazwa'] == 'Stempel odwrócony')
{
echo "selected=\"selected\" ";
}

echo ">Stempel odwrócony</option>
<option ";

if($moneta['nazwa'] == 'Generalne Gubernatorstwo')
{
echo "selected=\"selected\" ";
}

echo ">Generalne Gubernatorstwo</option>
</select>
</label>

<label>
Rok emisji: <span>*</span>
<input type=\"text\" name=\"rok_emisji\" value=\"".$moneta['rok']."\" />
</label>

<label class=\"checkbox\">
<input type=\"checkbox\" ";

if($moneta['znak'] == 1)
{
echo "checked=\"checked\" ";
}

echo "name=\"znak\" value=\"1\" /> b.z.

</label>

<label>
Średnica: (mm) <span>*</span> 
<input type=\"text\" name=\"srednica\" value=\"".$moneta['srednica']."\" />
</label>

<label>
Waga: (g) <span>*</span>
<input type=\"text\" name=\"waga\" value=\"".$moneta['waga']."\" />
</label>

<div id=\"rant\">
Rant: <span>*</span>
<label>
<input type=\"radio\" ";

if($moneta['rant'] == 'gładki')
{
echo "checked=\"ckecked\" ";
}

echo "name=\"rant\" value=\"gładki\" /> gładki
</label>

<label>
<input type=\"radio\" ";

if($moneta['rant'] == 'ząbkowany')
{
echo "checked=\"ckecked\" ";
}

echo "name=\"rant\" value=\"ząbkowany\" /> ząbkowany
</label>

<label>
<input type=\"radio\" ";

if($moneta['rant'] == 'Salus Reipublicae Suprema Lex')
{
echo "checked=\"ckecked\" ";
}

echo "name=\"rant\" value=\"Salus Reipublicae Suprema Lex\" /> Salus Reipublicae Suprema Lex

</label>

</div>

</div>

<div id=\"dodatkowe\">

<p>
Data kupna:
</p>

<label id=\"dzien\">

<input type=\"text\" name=\"dzien\" ";

if($moneta['dzien_kupna'] > 0)
{
echo "value=\"".$moneta['dzien_kupna']."\" ";
}

echo "/>

</label>

<label id=\"miesiac\">
<select name=\"miesiac\">
<option value=\"1\">styczeń</option>
<option ";

if($moneta['miesiac_kupna'] == 2)
{
echo "selected=\"selected\" ";
}

echo "value=\"2\">luty</option>
<option ";

if($moneta['miesiac_kupna'] == 3)
{
echo "selected=\"selected\" ";
}

echo "value=\"3\">marzec</option>
<option ";

if($moneta['miesiac_kupna'] == 4)
{
echo "selected=\"selected\" ";
}

echo "value=\"4\">kwiecień</option>
<option ";

if($moneta['miesiac_kupna'] == 5)
{
echo "selected=\"selected\" ";
}

echo "value=\"5\">maj</option>
<option ";

if($moneta['miesiac_kupna'] == 6)
{
echo "selected=\"selected\" ";
}

echo "value=\"6\">czerwiec</option>
<option ";
if($moneta['miesiac_kupna'] == 7)
{
echo "selected=\"selected\" ";
}

echo "value=\"7\">lipiec</option>
<option ";

if($moneta['miesiac_kupna'] == 8)
{
echo "selected=\"selected\" ";
}

echo "value=\"8\">sierpień</option>
<option ";

if($moneta['miesiac_kupna'] == 9)
{
echo "selected=\"selected\" ";
}

echo "value=\"9\">wrzesień</option>
<option ";

if($moneta['miesiac_kupna'] == 10)
{
echo "selected=\"selected\" ";
}

echo "value=\"10\">październik</option>
<option ";

if($moneta['miesiac_kupna'] == 11)
{
echo "selected=\"selected\" ";
}

echo "value=\"11\">listopad</option>
<option ";

if($moneta['miesiac_kupna'] == 12)
{
echo "selected=\"selected\" ";
}

echo "value=\"12\">grudzień</option>
</select>

</label>

<label id=\"rok\">

<input type=\"text\" name=\"rok\" ";

if($moneta['rok_kupna'] > 0)
{
echo "value=\"".$moneta['rok_kupna']."\" ";
}

echo "/>r.

</label>

<label>
Cena zakupu: (zł)
<input type=\"text\" name=\"cena\" ";

if($moneta['cena'] > 0)
{
echo "value=\"".$moneta['cena']."\" ";
}

echo " />
</label>

<label class=\"checkbox\">
<input type=\"checkbox\" name=\"wysylka\" ";

if($moneta['wysylka'] > 0)
{
echo "checked=\"checked\" ";
}

echo "value=\"1\" /> + wysyłka
</label>

<label>
Miejsce zakupu/sprzedawca:
<input type=\"text\" name=\"miejsce_kupna\" ";

if(strlen($moneta['miejsce_kupna']) > 0)
{
echo "value=\"".$moneta['miejsce_kupna']."\" ";
}

echo "/>

</label>

<label>
Komentarz:
<textarea name=\"komentarz\">";

if(strlen($moneta['komentarz']) > 1)
{
echo $moneta['komentarz'];
}

echo"</textarea>
</label>

<label>
<input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"1048576\" />
Zmień zdjęcie: 
<input name=\"plikuzytkownika\" type=\"file\" />
</label>
<label class=\"checkbox\">
<input type=\"checkbox\" name=\"zdjecie\" value=\"usun\" />Usuń zdjęcie
</label>

</div>

<label>
<button id=\"edycja\" type=\"submit\">Zatwierdź</button>
</label>

<a id=\"powrot\" href=\"".$plik_glowny."\"><< Powrót do spisu (anuluj edycję)</a>

</fieldset>
</form>";

}
}
}
else
{
Error("Jako niezalogowany nie możesz edytować monet!", 1);
}

include('foot.php');

?>

Usuwanie monet ze spisu

Skrypt usuwający monetę ze spisu jest bardzo prosty. Jeśli przyjdą dane z formularza, to jeszcze sprawdzane jest tylko, czy pole wybor ma wartość „tak” (szczerze mówiąc, nie wiem czy jest to potrzebne), po czym wykonywane jest zapytanie, a gdy się ono powiedzie, usuwane jest jeszcze zdjęcie tej monety za pomocą funkcji usunZdjecie().

Listing 10 usun.php – kod umozliwiający usunięcie monety ze spisu

<?php

include('head.php');

if(isset($_SESSION['prawdziwy']))
{
 if(isset($_GET['id']))
 {
  if($_POST['wybor'] == 'tak')
  {
   $zapytanie = "DELETE FROM $nazwa_tabeli WHERE id=".$_GET['id']."";

   if(mysql_query($zapytanie))
   {
    usunZdjecie($_GET['id']);
    Correct("Usunięto pomyślnie monetę ze spisu!");
   }
   else 
   {
    Error("Wystąpiły problemy z usuwaniem monety ze spisu...".mysql_error());
   }
  }
  else
  {
  
?>

<form id="usuwanie" action="<?php echo $plik_usun."?id=".$_GET['id']; ?>" method="post">
 <fieldset>
 
  <legend>
  Czy na pewno chcesz usunąć tą monetę?
  </legend>

  <h2>
  Czy na pewno chcesz usunąć tą monetę?
  </h2>
	
  <input type="hidden" name="wybor" value="tak" />
  <button type="submit">Tak</button>
  <a id="nieUsuwaj" href="<?php echo $plik_glowny; ?>">Nie</a>
	
 </fieldset>
</form>

<?php
  }
 }
}
else
{
 Error("Nie masz uprawnień do usuwania monet ze spisu!");
}

include('foot.php');

?>

Wyświetlanie monet – głowny plik skryptu

W pliku index.php znajduje się główny silnik skryptu, odpowiadający za wyświetlanie monet z bazy danych. Skrypt wysyła dwa zapytania do bazy danych – pierwsze pobiera wszystkie monety, aby zliczyć ile jest rekordów, żeby obliczyć ilośc stron etc. Drugie zapytanie pobiera odpowiednie wiersze z bazy danych, zależnie od tego, na której stronie jesteśmy. Ilośc monet wyświetlanych na jednej stronie ustala się w pliku config.php.

Listing 11 index.php – plik odpowiedzialny za wyświetlanie monet

<?php

include('head.php');

echo "<h1>".$tytul_spisu."</h1>";

$sciezka = pathinfo($_SERVER['SCRIPT_FILENAME']);
$plik = $sciezka['basename'];

if($_SERVER['REQUEST_METHOD'] == 'POST')
{
 $_SESSION['sort'] = $_POST['sort'];
 $_SESSION['str'] = 1;
}

$zapytanko = rozpoznajSortowanie($_SESSION['sort'], $nazwa_tabeli);
$wyniczek = mysql_query($zapytanko);

$ile = mysql_num_rows($wyniczek);
$ile_stron = $ile / $ilosc_na_stronie + 1;
$ile_stron = (integer)$ile_stron;

if(isset($_GET['str']))
{
$aktualna = $_GET['str'];
$_SESSION['str'] = $_GET['str'];
}
else if(isset($_SESSION['str']))
{
$aktualna = $_SESSION['str'];
}
else
{
$aktualna = 1;
}

$poprzednia = $aktualna - 1;
$nastepna = $aktualna + 1;

if($aktualna == 1)
{
$od_ktorego = 0;
}
else
{
$od_ktorego = ($aktualna * $ilosc_na_stronie) - $ilosc_na_stronie;
}

$zapytanie = rozpoznajSortowanie($_SESSION['sort'], $nazwa_tabeli, 1, $od_ktorego);
$wynik = mysql_query($zapytanie); 

$ile_monet = mysql_num_rows($wynik);

if($ile > 0 && $ile_stron > 1 &&  $ile != $ilosc_na_stronie)
{
 
echo "<ul class=\"stronnicowanie_\">";

if($aktualna != 1)
{
echo "<li class=\"poprzednia_\"><a href=\"".$plik_glowny."?str=".$poprzednia."\"><<</a></li>";
}

for($n = 1; $n <= $ile_stron; $n++)
{
echo "<li>";

if($n != $aktualna)
{
echo "<a href=\"".$plik_glowny."?str=".$n."\">";
}

echo "[$n]";

if($n != $aktualna)
{
echo "</a>";
}

echo "</li>";
}

if($aktualna != $ile_stron && $ile != $ilosc_na_stronie)
{
echo "<li class=\"nastepna\"><a href=\"".$plik_glowny."?str=".$nastepna."\">>></a></li>";
}

echo "</ul>"; 

}

echo "<a id=\"doWydruku\" href=\"".$plik_do_wydruku."\">Tabela do wydruku >></a>";

if(isset($_SESSION['prawdziwy']))
{
 echo "<a id=\"zaloguj\" href=\"".$plik_wyloguj."\">Wyloguj się</a>";
 echo "<a id=\"dodajMonete\" href=\"".$plik_dodaj."\">Dodaj monetę</a>";
}
else
{
 echo "<a id=\"zaloguj\" href=\"".$plik_zaloguj."\">Zaloguj się</a>";
}

if($ile > 0)
{

echo "<form id=\"sort\" action=\"".$plik."\" method=\"post\">
<fieldset>

<legend>
Sortuj wg:
</legend>

<label>

<h2>Sortuj wg:</h2>

<select name=\"sort\">
<option value=\"dodanie_desc\">Daty dodania malejąco</option>
<option ";

if($_SESSION['sort'] == 'dodanie_asc')
{
echo "selected=\"selected\" ";
}

echo "value=\"dodanie_asc\">Daty dodania rosnąco</option>
<option ";

if($_SESSION['sort'] == 'nominal_desc')
{
echo "selected=\"selected\" ";
}

echo "value=\"nominal_desc\">Nominału malejąco</option>
<option ";

if($_SESSION['sort'] == 'nominal_asc')
{
echo "selected=\"selected\" ";
}

echo "value=\"nominal_asc\">Nominału rosnąco</option>
<option ";

if($_SESSION['sort'] == 'cena_asc')
{
echo "selected=\"selected\" ";
}

echo "value=\"cena_asc\">Ceny zakupu rosnąco</option>
<option ";

if($_SESSION['sort'] == 'cena_desc')
{
echo "selected=\"selected\" ";
}

echo "value=\"cena_desc\">Ceny zakupu malejąco</option>
<option ";

if($_SESSION['sort'] == 'rok_asc')
{
echo "selected=\"selected\" ";
}

echo "value=\"rok_asc\">Roku emisji rosnąco</option>
<option ";

if($_SESSION['sort'] == 'rok_desc')
{
echo "selected=\"selected\" ";
}

echo "value=\"rok_desc\">Roku emisji malejąco</option>
<option ";

if($_SESSION['sort'] == 'kupno_desc')
{
echo "selected=\"selected\" ";
}

echo "value=\"kupno_desc\">Daty kupna malejąco</option>
<option ";

if($_SESSION['sort'] == 'kupno_asc')
{
echo "selected=\"selected\" ";
}

echo "value=\"kupno_asc\">Daty kupna rosnąco</option>
</select>
</label>
<button type=\"submit\">OK</button>
</fieldset>
</form>";

 echo "\n\n<ul id=\"spis\">\n\n";

 $x = $od_ktorego + 1; 
 
 for($i = 1; $i <= $ile_monet; $i++)
 {
  $moneta = mysql_fetch_assoc($wynik);
  
  echo "<li id=\"m".$moneta['id']."\">\n\n";

  if(isset($_SESSION['prawdziwy']))
  {
   echo "<ul id=\"admin\">\n<li><a href=\"usun.php?id=".$moneta['id']."\">Usuń</a></li><li><a href=\"edytuj.php?id=".$moneta['id']."\">Edytuj</a></li>\n</ul>\n\n";
  }

  echo "<a class=\"identyfikator_\" href=\"".$plik."#m".$moneta['id']."\">".$x."</a>\n";
  
  $x = $x + 1;

  $nominal = kod2nominal($moneta['kod_nominal']);

  echo "<h2>".$nominal." – ".$moneta['rok']."r.";

  if($moneta['znak'] > 0) 
  {
   echo " b.z.";
  }

  echo "</h2>\n";

  if(strlen($moneta['nazwa']) > 1)
  {
   echo "<h3>".$moneta['nazwa']."</h3>\n\n";
  } 

  $sciezka = './'.$katalog_zdjecia.'/zdjecie'.$moneta['id'];

  $jpg = $sciezka.'.jpg';
  $png = $sciezka.'.png';
  $gif = $sciezka.'.gif';

  if(is_file($jpg))
  {
   $zdjecie = $jpg;
  }
  else if (is_file($png))
  {
   $zdjecie = $png;
  }
  else if(is_file($gif))
  {
   $zdjecie = $gif;
  } 
  else 
  {
   $zdjecie = './'.$katalog_zdjecia.'/brakzdj.png';
  } 

  // jesli jest zdjecie monety w folderze to pozwol je powiekszyc w lightboxie
  if($zdjecie == $jpg || $zdjecie == $png || $zdjecie == $gif)
  {
  echo '<a href="'.$zdjecie.'" rel="lightbox"><img src="'.$zdjecie.'" alt="" /></a>';
  }
  else
  {
  echo '<img src="'.$zdjecie.'" alt="" />';
  }

  echo "\n\n<dl>\n\n";

  echo "<dt>Średnica:</dt>\n";
  echo "<dd>".$moneta['srednica']."mm</dd>\n";

  echo "<dt>Waga:</dt>\n";
  echo "<dd>".$moneta['waga']."g</dd>\n";

  echo "<dt>Rant:</dt>\n";
  echo "<dd>".$moneta['rant']."</dd>\n";

  echo "<dt>Data zakupu:</dt>\n";
  echo "<dd>".pokazDate($moneta['dzien_kupna'], $moneta['miesiac_kupna'], $moneta['rok_kupna'])."</dd>\n";

  echo "<dt>Cena zakupu:</dt>\n";
  echo "<dd>".pokazCene($moneta['cena'], $moneta['wysylka'])."</dd>\n";

  echo "<dt>Miejsce zakupu/sprzedawca:</dt>\n";
  echo "<dd>".pokazMiejsce($moneta['miejsce_kupna'])."</dd>\n";
  
  echo "<dt>Komentarz:</dt>\n";
  echo "<dd>".pokazKomentarz($moneta['komentarz'])."</dd>\n";
  
  echo "<dt class=\"daty_\">Data dodania:</dt>\n";
  echo "<dd class=\"daty_\">".pokazCzas($moneta['data_dodania'])."</dd>\n";
  
  echo "<dt class=\"daty_\">Ostatnia modyfikacja:</dt>\n";

  if($moneta['ostatnia_edycja'] > 2)
  {
   echo "<dd class=\"daty_\">".pokazCzas($moneta['ostatnia_edycja'])."</dd>\n";
  }
  else
  {
   echo "<dd class=\"daty_\">Nie modyfikowano.</dd>\n";
  }
  
  echo "</dl>\n";
  echo "<a class=\"do_gory\" href=\"".$plik."#wszystko\">⇑</a>\n";
  echo "\n</li>\n\n";
  
 }

 echo "</ul>\n\n";

 if($ile > 0 && $ile_stron > 1 &&  $ile != $ilosc_na_stronie)
 {
 
 echo "<ul class=\"stronnicowanie_\">";

 if($aktualna != 1)
 {
 echo "<li class=\"poprzednia_\"><a href=\"".$plik_glowny."?str=".$poprzednia."\"><<</a></li>";
 }

 for($n = 1; $n <= $ile_stron; $n++)
 {
 echo "<li>";

 if($n != $aktualna)
 {
 echo "<a href=\"".$plik_glowny."?str=".$n."\">";
 }

 echo "[$n]";

 if($n != $aktualna)
 {
 echo "</a>";
 }
 echo "</li>";
 }
 if($aktualna != $ile_stron && $ile != $ilosc_na_stronie)
 {
 echo "<li class=\"nastepna\"><a href=\"".$plik_glowny."?str=".$nastepna."\">>></a></li>";
 }
 
 echo "</ul>"; 
 }  
}
else
{
echo "<p id=\"pusto\">Nie ma jeszcze żadnej monety w spisie.</p>";
}
include('foot.php');

?>

Wyświetlenie monet jako tabela do wydruku

W pliku do_wydruku.php tworzona jest ładna tabela z wszystkimi monetami w kolejności, w jakiej były wyświetlone w spisie (można je tam dowolnie sortować). Jeśli chodzi o kod, to ciekawym rozwiązaniem jest GREATEST użyte w drugim zapytaniu. Polecenie to wybiera najwyższą wartość z kilku podanych. U mnie potrzebne to było do wyświetlenia ostatniej modyfikacji w spisie (zależnie, czy ostatnio zmieniono jakąs monetę, czy dodano), zamiast bawić się w instrukcje warunkowe w PHP.

Listing 12 do_wydruku.php – skrypt tworzący tabelę z monetami do wydruku

<?php

include('head.php');

$zapytanie = rozpoznajSortowanie($_SESSION['sort'], $nazwa_tabeli);
$wynik = mysql_query($zapytanie);
$ile = mysql_num_rows($wynik);

$zapytanko = "SELECT GREATEST(MAX(data_dodania), MAX(ostatnia_edycja)) AS 'modyfikacja' FROM $nazwa_tabeli";
$wyniczek = mysql_query($zapytanko);
$mod = mysql_fetch_assoc($wyniczek);
$modyfikacja = $mod['modyfikacja'];

?> 

<h1>Zrzut bazy danych monet II Rzeczypospolitej</h1>

<p>

<?php

echo "<p class=\"modyfikacja_\">Ostatnia modyfikacja: ".pokazCzas($modyfikacja)."</p>";

?>

</p>

<table id="wydruk">
<tr>
<th>L.p.</th>
<th>Moneta</th>
<th>Cena zakupu</th>
<th>Data zakupu</th>
<th>Miejsce zakupu/sprzedawca</th>
<th>Komentarz</th>
</tr>

<?php
 for($i = 1; $i <= $ile; $i++)
 {	

  $moneta = mysql_fetch_assoc($wynik);

  if($i % 2 == 1)
  {
   echo "<tr>\n";
  }
  else
  {
   echo "<tr class=\"inna_\">\n";
  }

  echo "<td>".$i."</td>\n";

  $nominal = kod2nominal($moneta['kod_nominal']);
	
  echo "<td class=\"nazwa_\">".$nominal;

  if(strlen($moneta['nazwa']) > 1)
  {
   echo " – ".$moneta['nazwa'];
  }
	
  echo " (".$moneta['rok']."r.)";
	
  if($moneta['znak'] > 0)
  {
   echo " b.z.";
  }
	
  echo "</td>\n";
  echo "<td>".pokazCene($moneta['cena'], $moneta['wysylka'], 0)."</td>\n";
  echo "<td>".pokazDate(dodajZero($moneta['dzien_kupna']), $moneta['miesiac_kupna'], $moneta['rok_kupna'], 0)."</td>\n";
  echo "<td class=\"miejsce_kupna\">".pokazMiejsce($moneta['miejsce_kupna'])."</td>\n";
  echo "<td class=\"komentarz_\">".pokazKomentarz($moneta['komentarz'])."</td>\n";
  echo "</tr>\n";
 }

echo "</table>\n\n";

echo "<ul id=\"legenda\">\n
<li>(w) – cena bez kosztów wysyłki</li>\n
</ul>\n";

echo "\n<a id=\"powrot\" href=\"".$plik_glowny."\"><< Powrót</a>\n";

include('foot.php');

?>

Przykładowy szblon

Poniżej zamieszczam przykładowe pliki head.php i foot.php, które zawierają przykładowy szablon dla tego spisu. Oczywiscie sporo do zmiany jest też wewnątrz np. index.php, jeśli komuś nie podoba się aktualny wygląd. No i oczywiście w pliku ze stylami CSS – style.css. Owego arkusza stylów nie będę zamieszczać bezpośrednio na stronie, bo ma ok. 400 linijek (lubię czytelny kod ;p). Należy pamiętać, aby w pliku head.php utrzymywać sesję, a także includować mysql_connect.phpfunkcje.php, bez których spis nie ma prawa działać.

Listing 13 head.php – przykładowe ramy dokumentu

<?php session_start(); 

include('mysql_connect.php');
include('funkcje.php');

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title><?php echo $tytul_spisu; ?></title>
	<link rel="stylesheet" href="style.css" type="text/css" />
	<link rel="stylesheet" href="lightbox.css" type="text/css" media="screen">

	<script src="js/prototype.js" type="text/javascript"></script>
	<script src="js/scriptaculous.js?load=effects,builder" type="text/javascript"></script>
	<script src="js/lightbox.js" type="text/javascript"></script>
</head>
<body>

<div id="wszystko">

Listing 14 foot.php – przykładowe ramy dokumentu (stopka)

<p id="foot">
Wykonanie: <a href="http://filipmarkiewicz.pl">FM</a>.
</p>

</div>

</body>
</html>

Zakończenie

Uhh… artykuł wyszedł naprawdę długi, ze względu na sporą objętość skryptu i to, że cały kod prezentowałem kawałek po kawałku. Gdyby ktoś miał problem z „zainstalowaniem” tego u siebie to służę pomocą (jednak najlepiej w komentarzach – gdy ktoś będzie miał podobny problem to rozwiązanie już będzie bezpośrednio na stronie). Jak zajrzy tu ktoś naprawdę biegły w PHP/MySQL i zobaczy jakiś karygodny błąd, to byłbym wdzięczny za poinformowanie mnie.

W swoim spisie lubię, gdy zdjęcia monet są bez tła – ładniej to wygląda. W związku z tym, są one plikami .png, które zapisane w np. GIMP'ie są niezwykle „ciężkie”. Trzeba użyć pewnych programów, aby zmniejszyć ich wagę (w przeciwnym razie, gdy zdjęcia monet będą wazyć po ok. 800kB każde, strona będzie się wczytywać bardzo długo, o czym się już przekonałem, dziwiąc się, dlaczego tak „muli”). Trochę szukałem po sieci i trafiłem na mały, ale bardzo treściwy artykuł o kompresji plików .png. Bardzo mnie ucieszyło, że autor opisał jak krowie na rowie, jak korzystać z tych programów na Linux'ie, bo nie mogę jeszcze siebie uznać za bardzo zaawansowanego w tym systemie. Na Windows'ie nie próbowałem tych aplikacji.

Komentarze

Nie ma jeszcze komentarzy. Dodaj komentarz

© Filip Markiewicz Mapa strony Spis moich monet II RP XHTML 1.0 CSS 2.1