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.
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());
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
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))
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
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
<?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
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)
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>
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='$szukaj'" klauzula LIKE (%, _) WHERE tytul LIKE '%przygoda%' $where = " tytul LIKE '%$szukaj%'"
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);
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.
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. '->'; }
I część skryptu $zapytanie="select count(*)..."; $pomoc=mysql_query ($zapytanie); $liczba_wyn=mysql_result($pomoc, 0); $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;
Dziękuję za uwagę