PHP/Projekt bazy danych: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Linia 1:
{{prognaw|PHP|[[../Wstęp do baz danych/]]|[[../Zarządzanie rekordami/]]}}
 
Nowinki ?
== Projekt bazy danych ==
Odstawimy teraz na chwilę PHP i nauczymy się pracować z serwerem baz danych MySQL. Poznamy również podstawy języka SQL do komunikacji z nim.
 
=== Wiersz poleceń serwera DB ===
Aby wykonywać operacje na bazie danych, nie jest konieczne samodzielne tworzenie odpowiednich aplikacji. MySQL posiada specjalny wiersz poleceń, w którym możemy wprowadzać zapytania i oglądać ich wyniki. Serwer DB powinien być już uruchomiony przy starcie systemu operacyjnego, dlatego przystąpimy teraz do rzeczy.
 
* Jeżeli pracujesz w systemie uniksowym, odszukaj katalog z danymi binarnymi, w którym mogła po instalacji zostać zlokalizowana aplikacja ''mysql''. Uruchom ją poleceniem:
 
<nowiki>mysql -u root -p</nowiki>
 
Lub, jeżeli łączysz się poprzez sockety:
 
<nowiki>mysql -u root -p -S /tmp/mysql.sock</nowiki>
 
* Użytkownik systemu Windows musi otworzyć systemowy wiersz poleceń i komendą ''cd'' przełączyć się na katalog z instalacją MySQLa, a następnie na znajdujący się w nim folder ''bin''. Tutaj należy uruchomić program ''mysql.exe'' z parametrami ''-u root -p''. Przykładowe postępowanie wygląda tak:
 
<source lang="dos">
C:\> D:
D:\> cd Serwer/mysql/bin
D:\Serwer\mysql\bin> mysql.exe -u root -p
</source>
 
Podstawą bezpieczeństwa w bazie danych MySQL są użytkownicy, którzy mają jasno określone przywileje dostępu do baz. Najważniejszym z nich jest ''root'', służący na serwerach produkcyjnych jedynie do administracji. Jednak w domowych warunkach można go wykorzystać także do projektowania własnych baz oraz testowania skryptów. W naszym przypadku podaliśmy podczas instalacji, że hasło tego użytkownika to także ''root''. Podaj je, gdy zostaniesz o to zapytany przez wiersz poleceń.
 
Jeżeli po wpisaniu hasła ujrzysz znak zachęty ''mysql>'', wszystko poszło OK i jesteśmy gotowi do pracy. W wierszu poleceń obowiązują następujące reguły:
# Zapytania kończymy średnikiem lub sekwencją ''\g''. Jeżeli zabraknie tego elementu, '''ENTER zwyczajnie będzie Cię przenosił do nowej linijki!'''
# Pomoc włączamy sekwencją ''\h''
# Opuszczamy wiersz poleceń sekwencją ''\q''
 
Co to jest ?
 
=== Tworzenie tabeli ===
Jak powiedzieliśmy, właściwe dane przechowywane są w tabelach. Ich tworzenie polega na definiowaniu szczegółowej struktury rekordów. Utworzymy teraz tabelę ''produkty'' przechowującą informacje o różnych produktach:
 
<source lang="sql">
CREATE TABLE `produkty` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`nazwa` VARCHAR(60) NOT NULL,
`opis` TEXT NOT NULL,
`ilosc` SMALLINT DEFAULT '0',
`cena` FLOAT NOT NULL,
`jakosc` TINYINT NOT NULL
) TYPE = MYISAM;
</source>
 
W pierwszej linijce nakazujemy utworzenie tabeli o podanej nazwie. Nawias rozpoczyna definicję jej struktury. Opisy budowy poszczególnych pól oddzielone są przecinkami, a informacje do każdego z nich podawane są w następującej kolejności:
# Nazwa pola
# Typ pola
# Czy pole może być puste?
# Wartość domyślna
# Parametry dodatkowe
# Klucze i indeksy
 
Przyjrzyjmy się zatem poszczególnym polom:
 
# ''id'' - pole to będzie przechowywało liczbowy, jednoznaczny identyfikator rekordu. Dwa rekordy nie mogą posiadać tego samego ID. Pole to powinny posiadać w zasadzie wszystkie tabele, gdyż jest ono podstawą relacji oraz systemów zarządzania bazą. Parametry to:
#* ''INT'' - typ liczbowy
#* ''NOT NULL'' - pole nie może być puste
#* ''AUTO_INCREMENT'' - MySQL automatycznie będzie dbał o nadawanie nowo dodawanym rekordom kolejnych ID.
#* ''PRIMARY KEY'' - klucz główny określający przeznaczenie tego pola jako podstawy do identyfikacji rekordów.
# ''nazwa'' - tutaj będziemy umieszczali nazwę produktu. Parametry to:
#* ''VARCHAR(60)'' - typ tekstowy. Maksymalna długość to 60 znaków.
#* ''NOT NULL'' - pole nie może być puste
# ''opis'' - opis produktu z dodatkiem wazeliny. Parametry to:
#* ''TEXT'' - typ tekstowy (maksymalna długość: 64 kB)
#* ''NOT NULL'' - pole nie może być puste
# ''ilosc'' - określa ilość sztuk produktu w magazynie. Parametry to:
#* ''SMALLINT'' - typ liczbowy
#* ''DEFAULT '0''' - pole może pozostać puste, a domyślnie nowym rekordom nadajemy tutaj wartość 0.
# ''cena'' - cena produktu. Parametry to:
#* ''FLOAT'' - typ liczbowy z obsługą ułamków (aby można było także grosze uwzględniać)
#* ''NOT NULL'' - pole nie może być puste
# ''jakosc'' - liczbowe oznaczenie jakości produktu. Parametry to:
#* ''TINYINT'' - typ liczbowy
#* ''NOT NULL'' - pole nie może być puste
 
Ostatnia linijka zawiera zamknięcie definicji struktury oraz określenie typu tabeli. Nie musisz się nim teraz przejmować. Wystarczy na razie wiedzieć, że domyślnym jest obecnie ''InnoDB'', ale do większości zastosowań używa się wydajniejszego ''MyISAM''.
 
Zauważyłeś już pewnie, że w zapytaniu wykorzystaliśmy kilka różnych typów liczbowych. Oto dokładniejsza specyfikacja ważniejszych typów:
# ''TINYINT'' - liczba jednobajtowa. Wartości od -128 do 127.
# ''UNSIGNED TINYINT'' - liczba jednobajtowa bez znaku. Wartości od 0 do 255. Słowo ''UNSIGNED'' przed nazwami kolejnych typów liczbowych robi to samo, co w tym przypadku.
# ''SMALLINT'' - liczba dwubajtowa. Wartości od -32768 do 32767, a bez znaku od 0 do 65535.
# ''MEDIUMINT'' - liczba trzybajtowa. Wartości od -8388608 do 8388607, a bez znaku od 0 do 16777215.
# ''INT'' - liczba czterobajtowa. Wartości od -2147483648 do 2147483647, a bez znaku od 0 do 2147483647.
# ''BIGINT'' - liczba ośmiobajtowa. Wartości od -9223372036854775808 do 9223372036854775807, a bez znaku od 0 do 18446744073709551615.
# ''FLOAT'' - liczba zmiennoprzecinkowa czterobajtowa (tak, jak w PHP).
# ''VARCHAR(M)'' - tekst o długości N od 0 do M znaków, gdzie M < 256. W pamięci zajmuje N + 1 bajtów (dodatkowy zawiera długość tekstu).
# ''CHAR(M)'' - tekst o długości od 0 do M znaków, gdzie M < 256. W przeciwieństwie do poprzedniego typu, zajmuje w pamięci zawsze M bajtów nawet, jeżeli znajdujący się w nim tekst jest krótszy.
# ''TEXT'' - typ tekstowy doskonały do przechowywania dłuższych treści. Można w nim zmieścić aż 64 kB danych (65535 znaków).
# ''BLOB'' - typ do przechowywania danych binarnych, np. plików. Maksymalna wielkość to także 64 kB.
# ''BOOL'' - typ logiczny, równoważnik zapisu ''TINYINT(1)''.
# ''DATE'' - wyspecjalizowany typ do przechowywania daty. Bardzo rzadko wykorzystywany w poważniejszych aplikacjach PHP ze względu na jego niewygodne przetwarzanie i formatowanie.
 
W przypadku typów liczbowych bardzo często spotyka się zapisy np. ''INT(8)'' lub ''MEDIUMINT(6)''. Liczby w nawiasach nie mają nic wspólnego z wielkością danych, jakie można w nich trzymać. Mówią one bazie danych MySQL, że jeśli dana liczba jest krótsza niż np. 8 znaków, to należy ją dopełnić spacjami do tej długości, kiedy będziemy na niej operować, jak na tekście.
 
=== Specyfika języka SQL ===
Napisaliśmy już kilka zapytań i widać z nich, że SQL w wielu miejscach przypomina zwyczajny mówiony angielski. Pora poznać kilka jego cech:
# Wielkość liter nie odgrywa żadnej roli, lecz programiści używają ich ze względów estetycznych. Zapis ''create table `produkty`'' także jest poprawny.
# Odwrócone apostrofy są używane do określania nazw tabel, baz i pól, ale nie są one niezbędne. Zapisy ''create table produkty'' oraz ''id int not null'' są poprawne, lecz trzeba tu zwrócić uwagę na jedną rzecz, którą zademonstrujemy na przykładzie. Otóż chcielibyśmy mieć w tabeli pole "order". Piszemy więc ''order int not null'', ale nagle okazuje się, że MySQL zgłasza w tej linijce błąd. Co jest nie tak? "order" jest jednym ze słów kluczowych języka SQL i aby tak nazwać tabelę, musimy koniecznie umieścić ją w odwróconych apostrofach. Wielu programistów, aby zapytania nie przypominały grochu z kapustą, z definicji używa ich zatem wszędzie, unikając w ten sposób wszystkich niespodzianek, a także niekompatybilności z nowymi wersjami, które dodają coraz więcej słów kluczowych.
 
=== Ćwiczenia ===
W ramach treningu utwórz następujące tabele:
# Tabela klientów sklepu z polami ''id'', ''imie'', ''nazwisko'', ''wiek'', ''miasto'', ''ulica'', ''numer_domu'', ''numer_mieszkania'', ''telefon''.
# Tabela dostawców sklepu z polami ''id'', ''nazwa'', ''dzien_tyg_dostawy'', ''naleznosc''
# Tabela kategorii produktów z polami ''id'', ''nazwa'', ''opis'', ''ilosc_produktow''.
 
Pamiętaj, że możesz sprawdzić strukturę już utworzonej tabeli poleceniem:
 
<source lang="sql">DESCRIBE tabela;</source>
 
Jeżeli coś Ci nie wyszło, wykonaj
 
<source lang="sql">DROP TABLE tabela;</source>
 
aby skasować tabelę.