Systemy internetowe Wykład 4 mysql MySQL - wstęp SZBD: komercyjne: Microsoft SQL Server, Oracle, DB2... darmowe: MySQL, PostgreSQL, Firebird... MySQL darmowy (użytek niekomercyjny) Wady: niska wydajność przy przetwarzaniu dużych ilości danych. Zalety: wygodny w użyciu, ma wygodny język zapytań, od dawna działa w systemach Windows, od dawna jest obsługiwany przez PHP. 1
PDO, Mysql, Mysqli Początkowo w interpreterze PHP odzwierciedlono szereg różnorodnych API udostępnianych przez różne serwer BD. Począwszy od wersji 5.0, PHP udostępnia specjalny interfejs przeznaczony do komunikacji z bazami danych PDO (PHP Data Objects) PDO umożliwia automatycznie łączenie się z różnymi bazami danych (MySQL, PostgreSQL, Informix, Oracle, IBM, SQLite itd.) PDO jest wygodniejszy, szybszy i bezpieczniejszy niż odrębne interfejsy PHP 5.0 - wersja beta PDO; PHP 5.1. wersja stabilna. mysql mysqli (od PHP 5.0) mysql_connect() mysql_connect(adres_serwera, nazwa_użytkownika, hasło); mysql_connect(): połączenie z serwerem adres serwera adres IP lub nazwa hosta opcjonalnie numer portu serwera standardowo 3306 zwraca identyfikator połączenia (sukces) lub wartość false. $id_pol = mysql_connect('serw:27012', 'admin', 'passwd'); if (!$id_pol) { echo 'Nie można uruchomić polaczenia: '. mysql_error();} $id_pol = mysql_connect( s', a', p') or die(mysql_error()); 2
mysql_close(), mysql_query() mysql_close($id_polacz); mysql_close(): zamyka połączenie o podanym identyfikatorze bez parametrów zamyka ostatnie połączenie $id_zap=mysql_query("treść zapytania"); mysql_query(): przesyła zapytanie do serwera MySQL o podanej treści zwraca identyfikator zapytania (sukces) lub wartość false. Utworzenie bazy danych mysql_create_db('nazwa_bazy'); mysql_create_db() tworzy bazę danych zwraca wartość true (sukces); false, gdy baza o takiej nazwie istnieje lub użytkownik nie ma uprawnień do jej utworzenia. mysql_select_db('nazwa_bazy'); mysql_select_db() wybiera bazę danych 3
Utworzenie tabeli CREATE TABLE tworzy tabelę w bazie dodatkowe atrybuty pola: np. NOT NULL, auto_increment, dodatkowe atrybuty tabeli: np. PRIMARY KEY CREATE TABLE nazwa_tabeli (nazwa_p1 typ_p1 [atrybuty],... nazwa_pn typ_pn [atrybuty], PRIMARY KEY(nazwa_pX)) Utworzenie tabeli typy pól char(dl) rozmiar = podanej liczbie bytów varchar(dl) rozmiar równy długości tekstu + 1 (max 255) text max 65.536 znaków int - liczby całkowite (4B) float (4B); double (8B) date data; year - rok... CREATE TABLE metryka (id int not null auto_increment, imie char(15), nazwisko char(30), PRIMARY KEY(id)) 4
Dodanie rekordu INSERT INTO nazwa_tabeli (nazwa_pola1, nazwa_pola2) VALUES ('wartosc_pola1', 'wartosc_pola2') INSERT INTO dodaje rekord do tabeli o podanej nazwie pola z atrybutem AUTO_INCREMENT! INSERT INTO metryka (id,imie,nazwisko) VALUES ('', 'John','Smith') Usunięcie rekordu DELETE FROM nazwa_tabeli [WHERE warunek] DELETE FROM usuwa rekordy spełniające podany warunek z tabeli o podanej nazwie bez frazy WHERE usuwane są wszystkie rekordy DELETE FROM metryka WHERE imie= John TRUNCATE TABLE nazwa_tabeli DROP TABLE nazwa_tabeli DROP DATABASE nazwa_bazy 5
Aktualizacja rekordu UPDATE nazwa_tabeli SET nazwa_pola1='wartosc_pola1', nazwa_pola2='wartosc_pola2' [WHERE warunek] UPDATE ustawienie wybranych pól we wskazanej tabeli na żądane wartości fraza WHERE nieobowiązkowa kilka warunków - przecinki UPDATE metryka SET imie='asia' WHERE id='1' Wybór rekordu SELECT nazwa_pola1,nazwa_pola2,..., nazwa_polan FROM nazwa_tabeli [WHERE warunek] SELECT: wybór wybranych pól z wskazanej tabeli fraza WHERE nieobowiązkowa SELECT id, imie, nazwisko FROM metryka WHERE imie= ASIA SELECT id, imie, nazwisko FROM metryka 6
<?php $id_polacz = mysql_connect('localhost','root',''); mysql_create_db( baza_uzytkownikow'); mysql_select_db(' baza_uzytkownikow'); $utworz="create TABLE dane (id int auto_increment, imie char(15), nazwisko char(30), PRIMARY KEY(id))"; $id_zap=mysql_query($utworz); $nowy="insert INTO dane (id, imie, nazwisko) VALUES ('', 'Ala', 'K')"; $id_zap=mysql_query($nowy); $nowy="insert INTO dane (id, imie, nazwisko) VALUES ('', Ola', W')"; $id_zap=mysql_query($nowy); $nowy="insert INTO dane (id, imie, nazwisko) VALUES ('', Ula', M')"; $id_zap=mysql_query($nowy); $wybierz = "SELECT id, imie, nazwisko FROM dane ; $id_zap = mysql_query($wybierz); echo '<table>'; while ($wiersz = mysql_fetch_array($id_zap)) { echo '<tr><td>'. $wiersz['id']. '</td><td>'. $wiersz['imie']. '</td><td>'. $wiersz['nazwisko']. '</td></tr>'; } echo '</table>'; mysql_close($id_polacz);?> mysql_fetch_array odwołania po indeksach lub nazwach pól mysql_fetch_row odwołania tylko po indeksach pól 7
Kilka dodatków SELECT nazwisko FROM dane ORDER BY nazwisko ASC SELECT nazwisko FROM dane ORDER BY nazwisko DESC SELECT produkt, cena FROM tabela WHERE cena>2 AND cena<5 SELECT MIN(imie) AS pierwsze FROM metryka UPDATE tabela SET cena=cena+1 Złączenia (1) SELECT ksiazka.tytul, autor.nazwisko FROM ksiazka INNER JOIN autor ON (ksiazka.id_ksiazki=autor.id_ksiazki) SELECT ksiazka.tytul, autor.nazwisko FROM ksiazka INNER JOIN autor USING (id_ksiazki) 8
Złączenia (2) SELECT kw.tytul, a1.nazwisko FROM ksiazka_wypozyczona AS kw INNER JOIN autor_pierwszy AS a1 USING (id_ksiazki) SELECT ksiazka.tytul, autor.nazwisko, adres.ulica FROM ksiazka INNER JOIN autor USING (id_ksiazki) INNER JOIN adres USING (id_autora)... Wyszukiwarka formularz <form method="get" action="wyniki.php"> <input type="text" name="kryteria"/> <input type="submit" name="szukaj" value="szukaj"/> </form> 9
Wyszukiwarka budowa zapytania Skrypt wyniki.php: wyszukanie rekordów, których pole o nazwie tytuł spełnia postawione zapytanie, wyświetlenie wyników zapytania ze stronicowaniem $query = "SELECT * FROM tabela"; $szukaj = $_GET['kryteria']; $where = '';...konstrukcja frazy where... if (!empty($where)) { $query = $query. " WHERE $where"; } Where (1) zwykłe przypisanie WHERE tytul = 'przygoda' $where = " tytul='$kryteria'" klauzula LIKE (%, _) WHERE tytul LIKE '%przygoda%' $where = " tytul LIKE '%$kryteria%'" 10
Where (2) $szukaj = 'morze rejs'; WHERE tytul='morze' OR tytul='rejs' explode('separator', 'dzielony łańcuch'); $tablica_slow=explode(' ',$szukaj); implode('separator', 'lista słów'); $where=implode(' OR ', $tablica_slow); WHERE morze OR rejs Źle! $lista_kryteriow[0]=" tytul='$tablica_slow[0]'"; $lista_kryteriow[1]=" tytul='$tablica_slow[1]'"; $where=implode(' OR ', $lista_kryteriow); Dobrze! Where (3) Analiza początku słowa: np. znak plus - AND, np. minus NOT, nic - OR. Znaki przestankowe $szukaj='morze, rejs'; WHERE tytul='morze,' OR tytul='rejs' str_replace("co", "czym", "gdzie"); $szukaj = str_replace(",", " ", $szukaj); 11
Where (4) Zbędne spacje powstają: po zastosowaniu funkcji str_replace wskutek nieuwagi użytkownika Zbędne spacje w przypadku łącznika OR spowodują, że wszystkie rekordy w bazie będą spełniały zapytanie. $szukaj='morze rejs'; WHERE tytul LIKE '%morze%' OR tytul LIKE '%%' OR Kolejność: tytul LIKE '%rejs%' najpierw czyścimy łańcuch funkcją str_replace, potem dzielimy funkcją explode, potem pomijamy puste pola funkcją empty, na koniec łączymy kolejne pola funkcją implode. Stronicowanie wyników zapytania Ograniczenie liczby wyników wyświetlanych na stronie SELECT * FROM tabela LIMIT n SELECT * FROM tabela LIMIT m, n LIMIT określa ile wierszy ma zwrócić zapytanie zwraca n początkowych wierszy zapytania; ile początkowych wierszy ma zostać pominiętych, ile następnych wyników ma zostać zwróconych. 12
Linki nawigacyjne Wygenerowanie odnośników nawigacyjnych do stron zawierających wcześniejsze/późniejsze wyniki <- 1 2 3 4 -> <- link do poprzedniej strony 1 2 3 4 link do strony o podanym numerze -> link do kolejnej strony <- ma być linkiem, jeżeli aktualna jest inna niż 1-sza strona 1 2 3 4 ma być linkiem, jeżeli nie jest stroną aktualną -> ma być linkiem, jeżeli aktualna jest inna niż ostatnia strona $linki=' '; if ($str>1) { $linki=$linki. '<a href="'.$_server['php_self']. '?szukaj='.$szukaj. '&str='.($str-1).'"><-</a>'; } else { $linki=$linki. '<-'; } for($i=1; $i<=$liczba_str; $i++) { if ($str==$i) { $linki=$linki.' '.$i; } else { $linki=$linki. '<a href="'.$_server['php_self']. '?szukaj='.$szukaj. '&str='.$i.'">'.$i.'</a>'; }} if ($str<$liczba_str) { $linki=$linki. '<a href="'.$_server['php_self']. '?szukaj='.$szukaj. '&str='.($str+1).'">-></a>'; } else { $linki=$linki. '->'; } 13
I część skryptu $zapytanie="select count..."; $liczba_wyn=mysql_query($zapytanie); $liczba_na_str=10; $liczba_str=$liczba_wyn/$liczba_na_str; $liczba_str=ceil($liczba_str); if (isset($_get['str'])) $str=$_get['str']; else $str=1; $pomin=($str-1)*$liczba_na_str; II część skryptu $zapytanie= "SELECT * FROM tabela WHERE $where LIMIT $pomin, $liczba_na_str"; $wyniki=mysql_query($zapytanie); while ($wiersz=mysql_fetch_array($wyniki)) { wyświetlenie kolejnych rekordów na stronie } generowanie linków; echo $linki; 14
Dziękuję za uwagę 15