baza samochodów (komis)(1) ► dane : nr_rejestracyjny, marka, rocznik, kolor, cena, właściciel (dane sprzedającego) ► 1) określenie cech obiektów istniejacych w rzeczywistości (przypisanie atrybutów) ► 2) zaprojektowanie odpowiednich tabel ► 3) określenie związków między tabelami ► 4) pozbycie się ewentualnych związków (m-n) baza samochodów (komis)(2) ► ► ► ► ► ► samochód i właściciel są rozłącznymi obiektami istniejącymi w rzeczywistości. zarówno samochód jak i właściciel istnieją niezależnie od siebie w pierwszym przybliżeniu tworzymy dwie tabele: „samochody” i „wlasciciele” (IDsamochodu,nr_rej,marka,kolor,rocznik,cena) (IDwlasciciela,imie,nazwisko,kontakt) zanim określimy związki przyjrzyjmy się tabeli „samochody” baza samochodów (komis)(3) ► ► ► ► ► ► ► (IDsamochodu,nr_rej,marka,kolor,rocznik,cena) nr_rej – przypisanie jednoznaczne cena – przypisanie jednoznaczne ( jeśli dwa auta maja tą sama cenę to zbieżność jest przypadkowa) rocznik – kwestia umowy, jeśli bierzemy pod uwagę daty, jest to dana prawie ciągła, jeśli zaś rocznik to zbiór jest ograniczony – typowy słownik kolor – jest cechą samochodu, jednak wiele samochodów ma ten sam kolor, ponadto kolory tworzą zbiór przeliczalny niewielkich rozmiarów – typowe dane słownikowe marka – jest atrybutem związanym a nie cechą – firmy ( marki) istnieją niezależnie od poszczególnych egzemplarzy wyróżnimy więc niezależne tabele : kolory, marki, roczniki Schemat relacyjny Student-przedmiot-prowadzący ► Związki wieloznaczne: ► Student studiuje wiele przedmiotów – na jeden przedmiot uczęszcza wielu studentów ► Asystent prowadzi przedmioty – jeden przedmiot prowadzi wielu asystentów ► Student uczy się u wielu asystentów – jeden asystent uczy wielu studentów tabela asocjacyjna ► asocjacje(ID,IDstudenta,IDasystenta,IDprzedmiotu) ► ► dodatkowo w tabeli mogą wystąpić jej cechy (termin?) pole IDstudenta stanowi klucz obcy ( jest stroną „wiele” związku 1-n z tabelą „studenci” ► w tabeli „studenci” stanowi klucz główny ( jest stroną „jeden” związku ► pola IDasystenta, IDprzedmiotu stanowią analogiczne połączenia ► poprzez konstrukcję tabeli asocjacyjnej uniknęliśmy związków „wiele-do-wiele” diagram związków studiowania Diagram związków studiowania (2) ► ► ► Tabela asocjacyjna zawiera bardzo dużo wpisów – w szczególności iloczyn liczby studentów, liczby asystentów i liczby przedmiotów Można zrezygnować z poprawnej postaci normalnej i połączyć asystentów z przedmiotami. Efektem niekorzystnym będzie redundancja w kolumnie przedmiot Takie podejście pozwala uprościć tabelę asocjacyjną Diagram związków studiowania(2) ► Do przedmiotu dodano pole „termin” aby umożliwić prowadzenie jednego przedmiotu przez dwóch asystentów. W tabeli przedmioty pojawi się redundancja – ten sam przedmiot jest wpisany tyle razy ilu asystentów go prowadzi diagram związków dla linii lotniczej Pasażer leci rejsem - związek wieloznaczny (m-n) ► Piloci pilotują rejsy – związek m-n ► Samolot obsługuje wiele rejsów – związek 1-n ► Proponowane tabele : ► ► samoloty (IDsamolotu,nazwa) rejsy (Nr_Rejsu,skąd, dokąd, godz-odlotu, godz_przylotu) pasażerowie (IDpazazera, imie, nazwisko, adres, telefon) piloci ( IDpilota, imie, nazwisko) Proponowany układ tabel nie redukuje związków wieloznacznych redukcja związku pasażer rejs ► Należy wprowadzić dodatkową tabelę Rezerwacje zawierającą jako klucze obce IDpasażera i Nr_Rejsu co rozwiąże problem : wielu pasażerów podróżuje wieloma samolotami redukcja związku piloci rejsy ► Należy wprowadzić dodatkową tabelę Przydzialy zawierającą jako klucze obce IDpilota i IDsamolotu co rozwiąże problem: wielu pilotów lata wieloma rejsami diagram bez związków wieloznacznych MySQL silnik bazodanowy (DB engine) ► duża szybkość – odstępstawa od standardu SQL ► brak obsługi transakcji w wersjach starszych niż 4.0 ► obsługa wielu platform: ► Linux (x86, S/390, IA64 (Itanium), Alpha, PowerPC, AMD64 / EM64T), Windows (x86), Solaris (SPARC,x86), FreeBSD (x86), MacOS X, HP-UX (PA-RISC, IA64) AIX (RS6000) QNX (x86), Novell Netware (x86), SGI, DEC OSF. ► ► MySQL - cechy ►rodzaje obsługiwanych tablic : MyISAM – domyślny, nie obsługuje transakcji, ► HEAP – najszybszy, gdyż wszystko jest przechowywane wyłącznie w pamięci RAM. Posiada jednak kilka ograniczeń, między innymi nie przechowuje danych po wyłączeniu serwera MySQL, ► InnoDB – obsługuje transakcje, ► Licencja : GPL, również wersje z licencjami zamkniętymi ► ► Wraz z serwerem Apache i parserem PHP zaimplementowanymi na platformie Linux stanowi popularne środowisko serwerowe – LAMP – Linux, Apache, MySQL, PHP podstawy SQL (1) – Structured Query Language – strukturalny język zapytań ► wszystkie wartości danych są typów prostych ► wszystkie dane zapisywane w dwuwymiarowych tablicach (relacjach) ► operacje są zdefiniowane logicznie, a nie przez pozycje wiersza w tabeli ► Wiersze posiadają unikalny klucz ► SQL podstawy SQL (2) w odróżnieniu od „zwykłych” języków programowania SQL określa raczej CO ma być zrobione a nie JAK to zrobić ► takie języki nazywamy DEKLARATYWNE ► ► Decyzję o sposobie przechowywania i pobrania danych pozostawia się systemowi zarządzania bazą danych DBMS DBMS - Data Base Management System SZBD -System Zarządzania Bazą Danych ► SELECT * FROM osoby WHERE imie=’Ola’; WYBIERZ wszystkie pola Z tabeli osoby DLA KTÓRYCH SPEŁNIONY JEST WARUNEK imie=’Ola’; ► ► ► W 1986 roku SQL stał się oficjalnym standardem, wspieranym przez Międzynarodową Organizację Normalizacyjną (ISO) Standard obecnie obowiązujący to SQL92 podstawy SQL (3) ► ze względu na zastosowanie wyróżniamy trzy typy SQL: ► SQL interakcyjny (np. praca na konsoli z programem mysql) ► Statyczny kod SQL (Static SQL) – stanowi na ogół niezmienną część aplikacji Embedded SQL (Osadzony SQL) (np. C++,Java) Język modułów – w analogii do podprogramów) ► Dynamiczny kod SQL (Dynamic SQL) - generowany jest w trakcie pracy aplikacji podstawy SQL (4) – podział zapytań (ang. Data Manipulation Language, czyli Język Manipulacji Danymi) ► SQL DML SELECT - pobranie z bazy danych, ► INSERT - umieszczenie danych w bazie, ► UPDATE - zmiana danych, ► DELETE - usunięcie danych z bazy. ► (ang. Data Definition Language, czyli Język Definicji Danych - struktur) ► SQL DDL CREATE (np. CREATE TABLE, CREATE DATABASE, ...) ► DROP (np. DROP TABLE, DROP DATABASE, ...) ► ALTER (np. ALTER TABLE ADD COLUMN ...) ► podstawy SQL (5) – przykłady zapytań ► SELECT * FROM pracownicy WHERE pensja > 2000 ORDER BY staz DESC; Wyświeta z tabeli pracownicy (FROM pracownicy) wszystkie kolumny (*) dotyczące tych pracowników, których pensja jest większa niż 2000 (WHERE pensja > 2000) i sortuje wynik malejąco według stażu pracy (ORDER BY staz DESC). INSERT INTO pracownicy (imie, nazwisko, pensja, staz) VALUES ('Jan', 'Kowalski', 5500, 1); UPDATE pracownicy SET pensja = pensja * 1.1 WHERE staz > 2; DELETE FROM pracownicy WHERE imie = 'Jan' AND nazwisko = 'Kowalski'; CREATE TABLE pracownicy (imie varchar(255), nazwisko varchar(255), pensja float, staz int); DROP TABLE pracownicy; ► ALTER TABLE pracownicy ADD COLUMN dzial varchar(255); ► ► ► ► ► Podstawowe typy danych ► ► ► ► ► ► CHAR(M) Pole znakowe. Przechowuje teksty o ustalonej z góry długości. Ograniczone do 255 znaków. VARCHAR(M) Pole znakowe. Przechowuje taką długość tekstu, jaka jest używana. INT[(M)] [UNSIGNED] Pole liczb całkowitych. Przechowuje liczby z zakresu od -2147483648 do 2147483647 (z parametrem UNSIGNED od 0 do 4294967295). DATE Pole daty przechowuje daty z zakresu od '1000-01-01' do '999912-31'. BLOB/TEXT Pole tekstowe. Przechowuje dłuższe, wielowierszowe teksty do 65535 znaków. Przykład tworzenia tabeli: CREATE TABLE badania ( ID_badania INT NOT NULL auto_increment, badanie VARCHAR(15), PRIMARY KEY (id_badania) ); Funkcje agregujące ► ► ► ► ► ► ► ► Count() - zliczanie wynikowych wierszy Avg() – średnia z pól podanej kolumny Max(),Min() – maksimum/minimum w kolumnie Sum() – suma wartości wszystkich pól w kolumnie Przykłady: SELECT max(cena) FROM produkty; SELECT sum(cena*ilosc) from produkty; SELECT count (ID) FROM produkty. podstawy SQL (1) – podział zapytań (ang. Data Definition Language, czyli Język Definicji Danych - struktur) ► SQL DDL CREATE (np. CREATE TABLE, CREATE DATABASE, ...) ► DROP (np. DROP TABLE, DROP DATABASE, ...) ► ALTER (np. ALTER TABLE ADD COLUMN ...) ► (ang. Data Manipulation Language, czyli Język Manipulacji Danymi) ► SQL DML SELECT - pobranie z bazy danych, ► INSERT - umieszczenie danych w bazie, ► UPDATE - zmiana danych, ► DELETE - usunięcie danych z bazy. ► MySQL –konto uzytkownika ► ► ► ► z poziomu administratora MySQL (root) należy stworzyć bazę u żytkownika: >create database naszabaza; oraz nadać uzytkownikowi prawa do niej : >GRANT ALL PRIVILEGES ON naszabaza.* TO user@localhost IDENTIFIED BY 'haslo'; oznacza to nadanie wszystkich praw do wszystkich tabel w ‘naszabaza’ użytkownikowi ‘user’ podającemu ‘haslo’ i łączącemu się z lokalnego serwera przywileje mogą być ograniczone do poszczególnych poleceń (SELECT, INSERT, UPDATE ….) oraz do wybranych tabel : >grant SELECT on naszabaza.klienci to user@localhost IDENTIFIED BY 'haslo'; MySQL –nawiązanie połączenia ► ► ► ► ► ► ► nawiązanie połączenia terminalowego wymaga: posiadania konta na serwerze posiadania dostępu do bazy MySQL (konta MySQL) To są dwa INNE konta (często nazywają się tak samo dla ułatwienia) po zalogowaniu na serwer wpisujemy z konsoli: mysql –u uzytkownik_bazy –p password : ***** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 32359 to server version: 3.23.49-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> MySQL –nawigacja ► przegląd baz : show databases; ► wybranie bazy ( konieczne uprawnienia) >use naszabaza; database changed ► przegląd tabel : show tables; ► struktura tabeli: >describe nazwa; / >explain nazwa; MySQL –TYPY DANYCH ►liczbowe (całkowite i zmiennopozycyjne) ►tekstowe ►daty i czasu MySQL – LICZBY CAŁKOWITE BAJTÓW MIN MAX TINYINT 1 -128 127 SMALLINT 2 -32768 32767 MEDIUMINT 3 -8388608 8388607 INT 4 -2147483648 -2147483647 BIGINT 8 -2^63 2^63-1 MySQL – liczby zmiennopozycyjne ► ► FLOAT(M,D) – pojedyncza precyzja , zakres +/1.175494351E-38 - 3.402823466E+38 M- całkowita ilość cyfr D- ilość cyfr po przecinku dokładność ok. 7 cyfr znaczących DOUBLE(M,N) – double precision 2.2250738585072014E-308 do 1.7976931348623157E+308 dokładność ok. 15 cyfr znaczących MySQL –data i czas ► ► DATE zakres : '1000-01-01' do '9999-12-31' DATETIME zakres: '1000-01-01 00:00:00' to '9999-12-31 23:59:59' ► ► TIME zakres: -838:59:59' to '838:59:59' YEAR zakres 1901 - 2155 MySQL –typy tekstowe ► CHAR (synonim CHAR(1)) – jednoznakowy ► VARCHAR(M) – łańcuch o zmiennej długości maksymalnie m-znaków ► BLOB - 65,535 (2^16 – 1) bytes ► MEDIUMBLOB 16,777,215 (2^24 – 1) ► LONGBLOB 4294967295 (4GB) (2^32 – 1) ► TEXT – to samo co BLOB ► SET('value1','value2',...) jawnie wyspecyfikowane, max 64 elementy MySQL –specyfikacja pól ► not NULL – zabroniony wpis null ► auto_increment – jeśli w takie pole nie wpiszemy nic, lub wpiszemy 0, MySQL uzupełnia wpisem o 1 większym od ostatniego ► primary key / primary key(nazwa) wyspecyfikowanie klucza ► częste łączenie : ID int not null auto_increment primary key, MySQL –tworzenie tabeli ► ► ► ► ► create table elementy( ID int not null auto_increment primary key, element varchar(20), cena float ) MySQL –wstawianie rekordów ► insert into ► elementy(ID,nazwa,cena) ► values(0,’srubka’,10); ► skrócone: insert into elementy values(0,’srubka’,10); ► można ręcznie nadać ID ale na ogół jest to zbędne ( czasem szkodliwe !) MySQL –wybieranie rekordów ► ► ► ► ► ► ► SELECT nazwy_kolumn FROM nazwy_tabel WHERE warunek_logiczny; wybranie wszystkich: select * from elementy; wybranie niektórych kolumn z warunkiem: select nazwa,cena from elementy where cena < 100; SELECT DISTINC … - usuwanie duplikatów … ORDER BY nazwa –sortowanie (na końcu) MySQL –zapytania łączące tabele ► ► select * from marki; select * from modele; IDmarki marka 1 fiat 2 ford IDmodelu IDmarki model 1 1 125P 2 1 Croma 3 1 Bravo 4 2 Fiesta 5 2 Focus 6 2 Mondeo MySQL –zapytania łączące tabele ► złączenie kluczy w relacji 1-n jest tzw. złączeniem naturalnym i dla tego równoważnę są dwie instrukcje : ► select model,marka from modele,marki where marki.IDmarki=modele.IDmarki; select model,marka from modele natural join marki; select model,marka from modele join marki on marki.IDmarki=modele.IDmarki; ( w MySQL ta wersja nie działa) MySQL –zapytania łączące tabele ► złączenie lewostronne – składa się z wierszy tablicy LEWA i pasujących wierszy z tablicy PRAWA . Gdy brak pasujących wierszy z prawej pojawi się NULL ►W naszym przypadku nie ma różnicy między złączeniem lewostronnym i naturalnym: select model,marka from marki left join modele on marki.IDmarki=modele.IDmarki; ► Jednak po dodaniu rekordu do tabeli marki, który nie ma jeszcze dodanego modelu : insert into marki(marka) values (‘BMW’) model marka 125P fiat Croma fiat Bravo fiat Fiesta ford Focus ford Mondeo ford model marka 125P fiat Croma fiat Bravo fiat Fiesta ford Focus ford Mondeo ford NULL BMW MySQL –zapytania łączące tabele ► Wykorzystując złączenie lewostronne można uzyskać te wiersze z tabeli, które nie mają odpowiedników drugiej tabeli : ► select model,marka from marki left join modele on marki.IDmarki=modele.IDmarki WHERE model is NULL; model NULL marka BMW MySQL –zapytania łączące tabele ► ► ► Czy jest możliwe skrzyżowanie tabeli samej ze sobą? select marki,marki from marki,marki; błąd ERROR 1066: Not unique table/alias: 'marki’ słowo AS przechowuje tabelę w zapytaniu pod inną nazwą: select tab1.marka as marka1,tab2.marka as marka2 FROM marki AS tab1, marki AS tab2; marka1 marka2 fiat fiat ford fiat BMW fiat fiat ford ford ford BMW ford fiat BMW ford BMW BMW BMW MySQL –zapytania łączące tabele ► przykład wykorzystania – usuwanie duplikatów. ► ► ID1 zrobiono błędny wpis – dodatkowy rekord o identycznej zawartości lecz innym ID: insert into marki values(4,'fiat'); i usunięto ‘BMW’ delete from marki where marka=„BMW”; interesują nas rekordy o tym samym wpisie lecz różnych ID więc modyfikujemy zapytanie dodając: ► select tab1.IDmarki as ID1,tab1.marka as marka1, tab2.IDmarki as ID2,tab2.marka as marka2 FROM marki AS tab1, marki AS tab2 ► where marka1=marka2 and ID1<>ID2 ID1 marka1 ID2 marka2 1 fiat 1 fiat 2 ford 1 fiat 4 fiat 1 fiat 1 fiat 2 ford 2 ford 2 ford 4 fiat 2 ford 1 fiat 4 fiat 2 ford 4 fiat 4 fiat 4 fiat marka1 ID2 marka2 4 fiat 1 fiat 1 fiat 4 fiat MySQL –przykłady ►klient składa zamówienia, na jednym może być wiele pozycji ►dostawca proponuje ofertę ►obiektami są towary wyszczególnione w tabeli MySQL –przykłady Insert into towary values(1,'laptop','Toshiba','X100',3200,10); Insert into towary values(2,'laptop','HP','HP100',3600,10); Insert into towary values(3,'laptop','HP','HP200',3800,2); Insert into towary values(4,'laptop','CompaQ','CQ999',2800,10); Insert into towary values(5,'laptop','CompaQ','CQ222',1800,15); Insert into towary values(6,'laptop','CompaQ','CQ123',5800,5); MySQL –przykłady insert into dostawcy values(1,'importer1','Krakow'); insert into dostawcy values(2,'importer2','Wieliczka'); insert into dostawcy values(3,'importer3','Warszawa'); MySQL –przykłady ►insert into klienci values(1,'Sklep Hani','Krolewska 10','Krakow'); ►insert into klienci values(2,'Sklep Oli','Dluga 1','Krakow'); ►insert into klienci values(3,'Sklep Komputerek','Sliczna 32','Krakow'); ►insert into klienci values(4,'Sklep Laptopik','Pawia 10','Wieliczka'); ►insert into klienci values(5,'Hurtownia WW ','Kopalniana 1','Wieliczka'); ►insert into klienci values(6,'Hurtownia Elektro','Aleje 12','Krakow'); MySQL –przykłady -- dostawca 1 insert into oferty_dostawcow values(1,1,1,3000); insert into oferty_dostawcow values(2,1,2,3000); insert into oferty_dostawcow values(3,1,3,3300); insert into oferty_dostawcow values(4,1,4,2000); insert into oferty_dostawcow values(5,1,5,1000); insert into oferty_dostawcow values(6,1,6,5000); MySQL –przykłady -- dostawca 2 insert into oferty_dostawcow values(7,2,1,3100); insert into oferty_dostawcow values(8,2,2,3200); insert into oferty_dostawcow values(9,2,3,3000); insert into oferty_dostawcow values(10,2,4,1900); insert into oferty_dostawcow values(11,2,5,1200); insert into oferty_dostawcow values(12,2,6,5200); MySQL –przykłady --dostawca 3 insert into oferty_dostawcow values(13,3,1,3050); insert into oferty_dostawcow values(14,3,2,2900); insert into oferty_dostawcow values(15,3,3,3000); insert into oferty_dostawcow values(16,3,4,1800); insert into oferty_dostawcow values(17,3,5,1300); insert into oferty_dostawcow values(18,3,6,4500); MySQL –przykłady -- klient 1 ma 2 zamówienia insert into zamowienia values(1,'2005-11-01',1); insert into zamowienia values(2,'2005-11-05',1); -- klient 2 ma 1 zamówienie insert into zamowienia values(3,'2005-11-05',2); MySQL –przykłady -- pozycje zamowienia klienta1 -- zam1 insert into pozycje_zamowien values(1,1,1,10); insert into pozycje_zamowien values(2,1,2,10); insert into pozycje_zamowien values(3,1,3,5); insert into pozycje_zamowien values(4,1,5,15); --zam2 insert into pozycje_zamowien values(6,2,1,5); insert into pozycje_zamowien values(7,2,3,10); insert into pozycje_zamowien values(8,2,4,15); insert into pozycje_zamowien values(9,2,5,5); insert into pozycje_zamowien values(10,2,6,2); -- pozycje zamowienia klienta2 -- zam3 insert into pozycje_zamowien values(11,3,1,20); insert into pozycje_zamowien values(12,3,2,30); insert into pozycje_zamowien values(13,3,3,20); insert into pozycje_zamowien values(14,3,4,2); insert into pozycje_zamowien values(15,3,5,2); insert into pozycje_zamowien values(16,3,6,2); MySQL –przykłady ►-zamowienia zlozone przez 'Sklep Hani' ►select Nr_zamowienia as zamowienia_Hani ►from ►zamowienia natural join klienci ►where ►klienci.nazwa_firmy='Sklep Hani'; MySQL –przykłady ►-- policzyc ilosc zamowien klienta 'Sklep Hani‘ ►select COUNT(Nr_zamowienia) as zamowienia_Hani ►from zamowienia natural join klienci ►where klienci.nazwa_firmy='Sklep Hani'; MySQL –przykłady ►-- wyszczegolnic pozycje zamowienia 1( nazwy towarow i ich ceny sprzed) ►select model,cena_sprzed from ►zamowienia,pozycje_zamowien,towary ►where ►towary.nr_katalog_towaru=pozycje_zamowien.nr_katalog_towaru ►and ►pozycje_zamowien.Nr_zamowienia=zamowienia.Nr_zamowienia ►and zamowienia.Nr_zamowienia=1; MySQL –przykłady ►---- wartosci kolejnych zamowien ►select zamowienia.nr_zamowienia,klienci.nazwa_firmy,sum(cena_sprzed) from zamowienia,pozycje_zamowien,towary,klienci where zamowienia.nr_zamowienia=pozycje_zamowien.nr_zamowienia and pozycje_zamowien.nr_katalog_towaru=towary.nr_katalog_towaru and klienci.ID_klienta=zamowienia.ID_klienta group by zamowienia.nr_zamowienia; MySQL –przykłady ►-- zamowienia i porownaie ilosci dostepnej ►select model,sum(ilosc_w_mag),sum(ilosc_zam) from zamowienia,pozycje_zamowien,towary where towary.nr_katalog_towaru=pozycje_zamowien.nr_katalog_towaru and pozycje_zamowien.Nr_zamowienia=zamowienia.Nr_zamowienia group by model; MySQL –przykłady ►--oferty wg dostawcow ►select nazwa_firmy, cena, nazwa_producenta,model from towary,oferty_dostawcow,dostawcy where towary.nr_katalog_towaru=oferty_dostawcow.nr_katalog_towaru and oferty_dostawcow.ID_dostawcy=dostawcy.ID_dostawcy; ‘ ►Jak uzyskać informację ----najtansze oferty wg modeli – select nazwa_firmy, min(cena), nazwa_producenta,model from towary,oferty_dostawcow,dostawcy where towary.nr_katalog_towaru=oferty_dostawcow.nr_katalog_towaru and oferty_dostawcow.ID_dostawcy=dostawcy.ID_dostawcy group by model; ►NIE DZIAŁA !! – wszystko co jest po SELECT powinno być uyte w klauzuli GROUP BY ‘ ►create temporary table tmp select concat(nr_katalog_towaru,':',min(cena)) as test from oferty_dostawcow group by nr_katalog_towaru; test 1:3000 2:2900 3:3000 4:1800 5:1000 6:4500 ►select nazwa_firmy,model,cena from dostawcy,towary,oferty_dostawcow,tmp where towary.nr_katalog_towaru=oferty_dostawcow.nr_katalog_towaru and dostawcy.id_dostawcy=oferty_dostawcow.id_dostawcy and concat(towary.nr_katalog_towaru,':',cena)=tmp.test ; PHP - wspomaganie programowania aplikacji internetowych ► ► ► ► ► 1994 - PHP (Rasmus Lerdorf) - brak pętli, instrukcji warunkowych, struktur danych 1995 - obsługa formularzy i dostęp do mSQL 1997 - PHP3 (Zeef Suraski, Andi Gutmans) - strukturalna i obiektowa wersja języka 2000 - PHP4 + moduł skryptowy ZEND Najnowsza wersja (PHP4) korzysta z potężnej platformy skryptowej Zend (http://www.zend.com), co zwiększa jej wydajność oraz może działać jako moduł serwera innego niż Apache. Kod źródłowy PHP jest powszechnie dostępny na zasadzie Open Source (http://www.opensource.com) Dlaczego PHP ? - zalety ► (+) Prosta składnia zapożyczona z C, z elementami Perl’a i skryptów powłoki ► (+) integracja z językiem HTML ► (+) naturalne połączenie warstwy baz danych z warstwą serwera WWW ► (+) zunifikowany interfejs do różnych baz danych Dlaczego PHP ? - zalety ► (+) bezpieczeństwo kodu - PHP wykonuje się po stronie serwera ( niezależność od przeglądarki) ► (+) bezpieczeństwo danych - wykorzystanie ssl i HTTPS ► (+) PHP jako moduł serwera WWW ► (+) generowanie HTML, GIF, JPG, PDF ► (+) dostępność kodu Dlaczego PHP ? - wady ► (-) język interpretowany więc wolny ► (-) brak systemu transakcji ► (-) brak STDIN - w Linuxie można obejść otwierając jawnie plik /dev/stdin Dla kogo PHP ? ► Administratorzy serwisów WWW ► autorzy dynamicznych stron WWW ► użytkownicy bez prawa do uruchamiania skryptów CGI ► projektanci aplikacji mają „za darmo” interfejs użytkownika (HTML) Instalacja UNIX ► ► RH 7.2 - wystarczy wybrać odpowiednie pakiety instalacyjne (PHP + MySQL) W starszych wersjach PHP było dostarczane bez wkompilowanych funkcji do obsługi baz danych. Konieczna była ręczna kompilacja. ./configure --with-apache=/sciezka_do_zrodel_apache --withmysql=/sciezka_do_zainst_MySQL make make install Instalacja UNIX ► ► ► ► Podobnie kompilujemy serwer APACHE ./configure --activate-module=src/modules/php3/libphp3 make make install w plikach konfiguracyjnych APACHE należy dodac wpisy: AddType aplication/x-httpd-php .php .php3 [.php4] Instalacja WINDOWS ► ► Istnieje wersja „na skróty” pod system Windows o nazwie PHPTriad (PHP +APACHE +MySQL) (binaria) system można testować na lokalnym komputerze posługując się adresem - http://localhost Plik index.html powinien znajdować się w c:\apache\htdocs , tam również skrypty PHP, konfiguracja w pliku c:\apache\conf\httpd.conf literatura ► ► ► ► ► Craig Hilton, Jeff Willis PHP3 - internetowe aplikacje bazodanowe Marek Nowakowski PHP4 & MySQL dla webmastera Rasmus Lerdorf Leksykon PHP http://www.php.pl ; http://www.php.net http://ux.ap.krakow.pl/~bar/ Strona tymczasowa, trochę polskojęzycznych informacji, kursy PHP i MySQL, Umieszczanie PHP w dokumentach HTML ► ► ► ► ► ► Kod skryptu umieszczany jest bezpośrednio w kodzie HTML ujęty w parę znaczników: <?PHP ........ ?> (skrócone <? ..... ?> <HTML><BODY> <?PHP echo ‘Jestem skryptem PHP <BR>`; ?> </BODY></HTML> Skrypt niekoniecznie w sekcji BODY przeglądarka wyświetla stronę HTML i WYNIK skryptu PHP Przeglądarka ignoruje odstępy i znaki końców akapitu, trzeba je zastąpić odpowiednimi znacznikami HTML (&nbsp, <BR> itp.) plik skryptu powinien mieć jedno z akceptowanych rozszerzeń (.php) , treść skryptu jest niedostępna dla użytkownika po stronie przeglądarki Możliwości języka ► ► ► ► ► ► ► ► Dołączanie plików include ("filename.abc") zmienne tablice operatory i wyrażenia instrukcje (struktury sterujące) funkcje użytkownika integracja z bazami danych - ogromna ilość funkcji pomocniczych dedykowanych dla najpopularniejszych systemów (MySQL, ORACLE, PostgreSQL, Informix) funkcje obsługi :stringów, tablic, dat, URL, sieci, ODBC, grafiki i plików PHP - Dołączanie plików ► include ("nazwapliku.php”); dołączanie plików jest nieodzownym mechanizmem zapewniającym przejrzystość kodu i zwiększającym bezpieczeństwo, wymagane jest aby w dołączanym pliku występowały znaczniki PHP ► ► Do standardowych metod należy definiowanie w osobnych plikach pewnych stałych elementów stron (np. nagłówków) i dołączanie ich do różnych stron Pliki dołączane muszą mieć odpowiednie atrybuty PHP - zmienne ► ► W zmiennych odgrywa znaczenie wielkość liter PHP operuje następującymi typami danych: ► ► ► Liczby całkowite Liczby zmiennopozycyjne Łańcuchy znaków Tablice Zmienne tworzymy BEZ ich deklarowania w momencie pierwszego przypisania wartości: $x=1.234; $i=3; tab[0]='ala'; tab[]='ma kota'; PHP - operatory i wyrażenia ► ► ► ► ► Oper. logiczne <, <= , > , >= , != , == #$x<=3; Oper. Przypisania = # $x=2*$y; Złożone $a++ ; #$a=$a+1; Wartości logiczne: FALSE - odpowiada "" {pusty napis} lub 0 TRUE - cokolwiek innego Każda zmienna jest skojarzona z wartością logiczną i tak np. pusta tablica - FALSE, zmienna jeszcze nie użyta - FALSE PHP - instrukcje ► ► ► Instrukcja warunkowa - jeżeli .... A jeżeli NIE ... IF ($warunek) { instrukcja; } ELSE { instrukcja;} dopóki warunek powtarzaj instrukcję WHILE ($warunek) { instrukcja; } powtarzaj instrukcję dopóki warunek DO { instrukcja; } WHILE ($warunek;) PHP - instrukcje ► ► FOR (instrukcja0;$warunek;instrukcja_sterująca) { instrukcja_w_pętli;} konstrukcja często stosowana przy ustalonej liczbie powtórzeń for($i=0;$i<10;$i++) {echo $i}; instrukcja wyboru: SWITCH ($x) case 0: instrukcja0; break; case 1: instrukcja1; break; DEFAULT : instrukcja_ANI_1_ANI_2; } PHP - funkcje ► ► ► Funkcja jest konstrukcją programistyczną wykonująca określony algorytm i przyjmującą określoną wartość. Pozwala również dzielić złożone problemy na fragmenty, Wewnątrz funkcji powinna się znaleźć instrukcja RETURN definiująca wartość funkcji (zwracająca wartość) definicja przykładowa: function moja($a,$b) { return ($a+$b)/2; } użycie: echo moja(3,5); #wypisze wartość 4 PHP - funkcje - argumenty ► Przekazywanie przez wartość Z tą sytuacją mamy do czynienia gdy funkcja ma w odpowiedzi zwrócić pewną wartość ale NIE ZMIENIĆ wartości argumentów ► definicja przykładowa: function srednia($a,$b) { return ($a+$b)/2; } użycie: echo srednia(3,5); #wypisze wartość 4 Przekazywanie przez zmienną Z tą sytuacją mamy do czynienia gdy chcemy aby funkcja w efekcie swojego działania ZMIENIAŁA wartości argumentów ► definicja przykładowa: function zamiana(&$a,&$b) { $z=$a; $a=$b; $b=$z; return 0; #funkcja niczego nie liczy } ► użycie: $x=1;$y=2; $temp=zamiana($x,$y); echo $x,$y; wypisane zostanie 2 1 a nie 12 co oznacza że funkcja zmieniła swoje argumenty\’’’’’’ ► PHP - przekazywanie parametrów ► PHP udostępnia ciekawy mechanizm obsługujący sytuacje gdy chcemy w samym programie narzucić funkcji przekazanie parametru przez odwołanie: ► function zamiana($a,$b) { $z=$a; $a=$b; $b=$z; } ► użycie: $x=1;$y=2; $temp=zamiana(&$x,&$y); echo $x,$y; #wypisanie 2 1 ► użycie: $x=1;$y=2; $temp=zamiana($x,$y); echo $x,$y; #wypisanie 1 2 PHP- wartości domyślne funkcji i zasięg zmiennych ► ► ► ► ► ► Obsługa sytuacji gdy w wywołaniu nie podamy niektórych argumentów function opis($nazwisko="NIEZNANY"){ return "Ten człowiek ma na nazwisko $nazwisko";} echo opis("nowak"); da w efekcie : Ten człowiek ma na nazwisko Nowak echo opis() ; da w efekcie : Ten człowiek ma na nazwisko NIEZNANY UWAGA!: zmienne z programu NIE są widoczne w funkcjach $x=1; function test1() { echo $x;} function test2() { global $x; echo $x;} test1();test2(); da w efekcie 1 ( a nie 11 gdyż wywołanie test1() nic NIE WYPISAŁO PHP- obsługa plików (1) Korzystanie z plików wymaga następujących czynności : ► otwarcie pliku $fi=fopen("$nazwa_pliku","$tryb"); ► • 'r' - Otwórz tylko do odczytu; ustawia wskaźnik pliku na początku pliku. • 'r+' - Otwórz do odczytu i zapisu; ustawia wskaźnik pliku na początku pliku. • 'w' - Otwórz tylko do zapisu; ustawia wskaźnik pliku na początku pliku i obcina plik (zeruje) do 0 długości. Jeśli plik nie istnieje to próbuje go utworzyć. • 'w+' - Otwórz do odczytu i zapisu; ustawia wskaźnik pliku na początku pliku i obcina plik (zeruje) do 0 długości. Jeśli plik nie istnieje to próbuje go utworzyć. • 'a' - Otwórz tylko do zapisu; ustawia wskaźnik pliku na końcu pliku. Jeśli plik nie istnieje to próbuje go utworzyć. • 'a+' - Otwórz do odczytu i zapisu; ustawia wskaźnik pliku na końcu pliku. Jeśli plik nie istnieje to próbuje go utworzyć. $fi jest tzw. uchwytem pliku ► w nazwie pliku można używać http:// oraz ftp:// ► gdy się coś nie powiedzie $fi=FALSE ► przydatna funkcja file_exists("nazwa") typu logicznego ► ► PHP- obsługa plików (2) Po prawidłowym otwarciu można z plikiem pracować zapisać coś do pliku fputs($fi,"ten tekst trafi do pliku \n"); odzcytać z pliku $linia=fgetS($fi,100); # 100 znaków lub $znak=fgetC($fi); Przy tych operacjach znacznik pliku przesuwany jest o 1 do przodu plik należy zamknąć fclose($fi); PHP- funkcje wbudowane ► ► ► ► ► ► ► ► Matematyczne - sin($x) obsługi stringów - ereg($wzorzec,$napis) - przeszukuje $napis z wykorzystaniem wyrażenia regularnego $wzorzec obsługi tablic - sort($tablica) - sortuje tablice od min do max obsługi sieci mail($odbiorca,$temat,$wiadomosc,$d\odatkowe_nagłowki) graficzne - imagecreate($wysokosc,$szerokosc) - tworzy obrazek typu GIF obsługi plików - fopen($plik,$tryb) - otwiera plik i zwraca jego identyfikator obsługa dat i czasu - date($format) obsługi baz danych - mysql_connect($host,$user,$password) - otwiera połaczenie z baza MySQL Połączenie PHP-MySQL (1) ► ► ► ► PHP zawiera wiele funkcji umożliwiających prace z bazą. Wymienię tylko kilka najczęściej używanych. INT mysql_connect(‘nazwa hosta’,’nazwa_użyt’,’hasło’); funcja zwraca identyfikator (numer) połączenia użycie: $link = mysql_connect("localhost", ”info", ”info") or die ("Nie można się połączyć"); połączenie zostaje zamknięte po użyciu funkcji: mysql_close(link); Połączenie PHP-MySQL(2) ► ► ► ► ► Wybranie bazy: mysql_select_db (”moja_baza") or die ("Nie mozna wybrać bazy danych"); zapytanie SQL: $result = mysql_query ("SELECT * FROM adresy",$link) or die ("Zapytanie zakończone niepowodzeniem"); Nie trzeba podawac $link- wtedy domyślnie ostanio użyte połączenie $result jest identyfikatorem (int) zbioru wynikow przykład: $result = mysql_query ("SELECT * FROM adresy",$link); echo "w zbiorze jest " . mysql_num_rows($result) . "rekordow" ; Połączenie PHP-MySQL(3) ► mysql_fetch_array($result) - pobiera wiersz i zwraca go w postaci tabeli jeśli w zbiorze wyników nie ma już rekordów zwracane jest FALSE ► pozwala to używać konstrukcji: while ($osoba=mysql_fetch_array($result)){ echo $osoba["imie"] . $osoba["nazwisko"] . $osoba["adres"] . "<br>" ; } przykład – licznik w pliku tekstowym ► ► ► ► ► ► ► ► ► ► <?PHP $filename="/tmp/licznik"; # WSTAW TU SWOJA NAZWE $fp=fopen($filename,"r+"); $nr=fgets($fp,10); $nr++; fseek($fp,0); fwrite($fp,$nr,10); fclose($fp); echo "<h1> licznik = $nr </h1>"; ?> przykład – licznik i ciasteczko <? setcookie("licznik","1",time()+100); ?> ustawia ciastko o nazwie licznik ważne 100 sekund ► <html> <body> <? ► @$odwiedzony = $_COOKIE['licznik']; //odczytanie wartości ciasteczka ► $filename=„./licznik” $plik = fopen($filename,"r"); $licz = fread($plik, 10); fclose($plik); ► if ($odwiedzony) { echo("Jeste6 tu po raz " . $licz); } ► else { $licz++; echo("Jeste6 tu po raz " . $licz); } ► $wczyt = fopen($filename,"w"); fwrite($wczyt,$licz); fclose($wczyt); ► ?> </body> </html> ►