MENU

  Mysql

Początek
Kurs ten przeznaczony jest dla osób uczących się PHP, nie umiejących nawiązać połączenia i wykonywać operacji na bazach danych. Wymagana jest podstawowa znajomość składni PHP i HTMLa. Nie wymagana jest znajomość SQL - tutaj się jej nauczysz.
Czego się nauczysz w tej części kursu

Nauczysz się instalować bibliotekę PHP odpowiedzialną za połączenia z serwerem baz danych MySQL. Będziesz umiał za pomocą PHP połączyć się z bazą danych oraz wykonać na niej podstawowe operacje takie jak: tworzenie bazy danych, tworzenie tabeli, zapisywanie informacji w tabeli, pobieranie informacji z bazy danych oraz usuwanie rekordów z tabeli. Poznasz podstawową składnię SQL.
Wstep

MySQL jest chyba jednym z najpopularniejszych interface'ów języka SQL (Structured Query Language), charakteryzuje się ogromną elastycznością, jeszcze większą prędkością i co najważniejsze jest bardzo łatwy w obsłudze.
Instalacja MySQL w PHP

Instalacja nie sprawi najmniejszych problemów nawet "zielonym" - wystarczy otworzyć zwykłym edytorem tekstu plik php.ini (lub php3.ini - dla użytkowników starszych wersji PHP), następnie znaleźć linijkę:
;extension=php_mysql.dll

i usunąć średnik, który znajduje się na początku linii. W przypadku użytkowników systemów rodziny Unix rozszerzeniem biblioteki będzie ".so" a nie ".dll". W ten sposób będziemy mogli korzystać z dobrodziejstw MySQL'a na serwerze Apache. Aby połączenia z bazą danych działały należy zrestartować serwer lub go uruchomić jeśli nie był wcześniej uruchomiony.

Uwaga: w niektórych wersjach PHP biblioteka MySQL jest domyślnie wkompilowana, dlatego nie znajdziemy jej na liście w pliku php.ini
Połączenie z bazą danych

Gdy nasza wersja PHP ma już odpowiednie biblioteki do współpracy z serwerem MySQL pierwszym krokiem, jaki będziemy chcieli wykonać jest połączenie z bazą danych.
Aby połączyć się z bazą danych używamy funkcji mysql_connect z następująca składnią:
mysql_connect([adres_serwera [, nazwa_użytkownika [, hasło]]]);

Pierwszym argumentem, jaki przyjmuje funkcja łączenia z bazą danych jest adres serwera - może on być za równo w postaci adresu IP jak i nazwy hosta. Za nazwą hosta po dwukropku możemy podać jeszcze numer portu adresu serwera - nie jest to wymagane, jeśli nie podamy numeru portu nastąpi próba połączenia na standardowym porcie 3306. Kolejnymi argumentami są nazwa i hasło użytkownika bazy danych MySQL. Funkcja mysql_connect przyjmuje również inne argumenty ale jako amatorzy nie będziemy o nich na razie mówili.
Na rozgrzewkę połączmy się z serwerem MySQL serwer.com na standardowym porcie:
$sql_conn = mysql_connect('serwer.com', 'admin', 'passwd');

Wykonanie powyższego kodu połączy nas z serwerem na porcie 3306. Czasami zdarza się tak, że administrator serwera MySQL zmieni numer portu, połączenie na niestandardowym porcie wygląda w ten sposób:
$sql_conn = mysql_connect('serwer.com:27012', 'admin', 'passwd');

Funkcja mysql_connect zwróci identyfikator połączenia o ile zakończy się sukcesem. Jeśli połączenie nie powiedzie się funkcja zwróci wartość false.

Jeśli zakończyłeś już operacje na swojej bazie należy się rozłączyć i zwolnić zasoby. Za rozłączanie się z bazą danych odpowiedzialna jest funkcja mysql_close() o następującej składni:
mysql_close([identyfikator_połączenia]);

Ostatni argument - identyfikator połączenia - nie jest wymagany, jeśli go nie podamy zostanie zamknięte ostatnio otwarte połączenie przez użytkownika na jakiego jesteśmy zalogowani do bazy danych. Aby zakończyć połączenie, które zaprezentowałem powyżej należy wykonać następujący kod:
mysql_close($sql_conn);
Zapytania

Aby wykonać jakiekolwiek operacje na swojej bazie danych należy wysłać do niej informacje o tym co chcemy zrobić. Wszystkie informacje wysyłamy w postaci zapytań, do czego wykorzystujemy PHPową funkcję
mysql_query([zapytanie]);

Zapytania do bazy danych wysyłamy w następujący sposób:
$zaptanie = "treść zapytania SQL";
$idzapytania = mysql_query($zapytanie);

Po takiej operacji zmienna $wykonaj będzie zawierała identyfikator zapytania o ile zapytanie zostanie wykonane pomyślnie. W przypadku, gdy popełniliśmy błąd w zapytaniu zmienna $wykonaj będzie zawierała wartość false.
Tworzenie i wybieranie bazy

O ile nasz administrator nie utworzył nam wcześniej bazy danych lub sami jesteśmy administratorami należy najpierw utworzyć bazę danych. Do stworzenia nowej bazy używamy funkcji mysql_create_db() np.:
mysql_create_db('zawodnicy');

Funkcja zwróci wartość true, w przypadku gdy baza danych została utworzona pomyślnie lub wartość false w przypadku gdy baza o takiej nazwie istnieje lub nie mamy uprawnień aby ją utworzyć.
Samo utworzenie bazy danych nie oznacza, że właśnie na niej będziemy wykonywać operacje, dlatego musimy ją wybrać, co robimy za pomocą funkcji mysql_select_db(nazwa) np.:
mysql_select_db('zawodnicy');

Od tej pory wszelkie zapytania wysyłane do serwera będą wykonywane na bazie danych zawodnicy.
Język SQL: tworzenie tabel

Gdy nasza baza jest już utworzona i mamy z nią połączenie możemy zacząć wprowadzać dane, najpierw jednak trzeba utworzyć tabelę, robimy to według następującego schematu składni SQL:
CREATE TABLE nazwa_tabeli (nazwa_pola1 typ_pola1 [atrybuty], nazwa_pola2 nazwa_pola2 [atrybuty], ... nazwa_polaN typ_polaN [atrybuty], PRIMARY KEY(nazwa_polaX))

Postarajmy się stworzyć tabelę według danej składni:
$zapytanie = 'CREATE TABLE nba (id int NOT NULL AUTO_INCREMENT, imie char(30), lata char(3), punkty char(3), mistrzostwa char(3), PRIMARY KEY(id))';

Każda tabela musi posiadać co najmniej jedno pole, dodatkowo musi posiadać co najmniej jedno pole, które jednoznacznie identyfikuje wiersz w tabeli - tak zwany klucz główny. Jeśli w tabeli jest masa danych a Ty znasz klucz główny jednego z wierszy wtedy możesz bez problemu dostać się do tego wiersza. W naszym przypadku kluczem głównym jest pole pierwsze - id. Przeważnie nadaje jako klucz główny określa się pierwsze polew tabeli. Dodatkowo klucz główny posiada dwa atrybuty: pierwszy - NOT NULL oznaczający, że wartość tego pola nigdy nie może być pusta; drugi - AUTO_INCREMENT oznaczający że wartość pola będzie automatycznie zwiększana przez bazę danych przy dodawaniu kolejnych rekordów. Atrybut AUTO_INCREMENT możemy stosować tylko do pól typu całkowitoliczbowego.

Dostępnych jest wiele typów pól, najpopularniejsze przedstawiam poniżej:

char(x) - ciąg znaków o maksymalnej długości x, gdzie x nie może być większy od 255
blob - binarny ciąg znaków o długości ograniczonej przez pamięć twojego serwera
text - tekstowy ciąg znaków o długości ograniczonej przez pamięć twojego serwera
integer - liczba całkowita z przedziału -2147483647 do 2147483647
data - data w formacie określonym przez ustawienia serwera
year - rok, jeśli zostanie podany zły, jego wartość zmieni się w 0000
decimal(x, y) - liczba dziesiętna, gdzie x oznacza maksymalną liczbę cyfr, a y maksymalną liczbę cyfr po przecinku.
Język SQL: dodawanie rekordów

Gdy mamy już utworzoną tabelę przydałoby się dodać do niej jakiś rekord, robimy to według następującej składni:
INSERT INTO nazwa_tabeli (nazwa_pola1, nazwa_pola2) VALUES (wartosc_pola1, wartosc_pola2)

Teraz pora na przykład, załóżmy, że chcemy dodać do naszej tabeli nowego zawodnika, operacja ta wygląda tak:
$zapytanie = "INSERT INTO `nba` (`id`, `nazwisko`, `lata`, `punkty` , `mistrzostwa`) VALUES ('', 'Jordan', '13', '32', '6')";
$idzapytania = mysql_query($zapytanie);

Według składni SQL nazwy pól i tabel powinno zawierać się w odwróconych apostrofach (`). Po wykonaniu tego zapytania w tabeli nba będzie się znajdował jeden wiersz z danymi, które podaliśmy.

Uwaga: Jako wartość pola id nie podaliśmy nic ponieważ jest to pole typu AUTO_INCREMENT a co za tym idzie serwer baz danych sam nada temu polu kolejną wartość. Jako, że jest to pierwszy rekord w tej tabeli wartość pola id w tym rekordzie będzie wynosiła 1.
Język SQL: wybieranie rekordów

Jeśli chcemy przeszukać naszą tabelę w poszukiwaniu jakiegoś konkretnego rekordu robimy to za pomocą komendy SELECT według składni:
SELECT nazwa_pola1,nazwa_pola2,...nazwa_polaN FROM nazwa_tabeli [WHERE warunek]

W nazwach pól wybieramy jakie kolumny chcemy wyświetlić z danej tabeli, możemy również zrobić to w następujący sposób:
SELECT * FROM nazwa_tabeli [WHERE warunek]

W powyższym wypadku wybierzemy wszystkie pola z danej tabeli jednak takie rozwiązanie jest nie polecane z powodów wydajnościowych - lepiej wypisywać konkretne nazwy pól, które nas interesują.
Warunek nie jest wymagany do określenia. Jeśli nie określimy warunku wybrane zostaną wszystkie pola z tabeli. Załóżmy, że chcemy się dowiedzieć ile lat już gra i ile punktów zrobił zawodnik o nazwisku "Pipen" - robimy to w następujący sposób:
$zapytanie = "SELECT `lata`,`punkty` FROM `nba` WHERE `nazwisko`='Pipen'";
$idzapytania = mysql_query($zapytanie);

Po wykonaniu tego zapytania na serwerze baz danych zostaną wybrane wszystkie rekordy, w których wartość pola nazwisko będzie równe Pipen.

Uwaga: w zależności od ustawień serwera baz danych wielkość liter może mieć znaczenie dlatego "Pipen" nie zawsze dla serwera oznacz to samo co "pipen".

Jeśli będziemy chcieli wybrać wszystkie rekordy z tabeli po prostu unikamy warunku. Np chcemy wybrać identyfikatory, nazwiska, lata spędzone w lidze i punkty zebrane wszystkich zawodników - zrobimy to następująco:
$zapytanie = "SELECT `id`,`nazwisko`,`lata`,`punkty` FROM `nba`";
$idzapytania = mysql_query($zapytanie);
Wyświetlanie wybieranych rekordów

Gdy mamy już nasze zapytanie dobrze napisane i wysłane do serwera nic nam nie pozostaje jak wyświetlenie wyników zapytania. Przykład:
$zapytanie = "SELECT `id`,`nazwisko`,`lata`,`punkty` FROM `nba`";
$idzapytania = mysql_query($zapytanie);
echo '<table>';
while ($wiersz = mysql_fetch_row($idzapytania)) {
echo '<tr><td>'. $wiersz[0] .'</td><td>'. $wiersz[1] .'</td>'.<td>'. $wiersz[2] .'</td><td>'. $wiersz[3] .'</td></tr>';
}
echo '<table>';

Istota tego kodu ukryta jest w funkcji mysql_fetch_row, która przy każdej iteracji pętli while wyciąga dany wiersz zapytania i zapisuje go w tablicy $wiersz indeksowanej od zera, wypełnionej elementami rekordu wybranymi za pomocą zapytania. Czyli element o indeksie zero będzie równy wartości danego rekordu pola id, element o indeksie jeden będzie równy wartości danego rekordu pola nazwisko itd. Efektem powyższego kodu będzie wyświetlenie tabeli z graczami oraz ich danymi.
Język SQL: aktualizacja rekordów

Jeśli jakiś rekord jest już nie aktualny, lub po prostu źle wpisaliśmy dane, należałoby go zaktualizować, do czego służy polecenie SQL UPDATE:
UPDATE nazwa_tabeli SET nazwa_pola1=wartosc_pola1, nazwa_pola2=wartosc_pola2 [WHERE warunek]

Warunek podobnie jak w poleceniu SELECT jest nieobowiązkowy. Jeśli pominiemy warunek to zaktualizowane zostaną wszystkie rekordy w tabeli a nie tylko konkretne określone warunkiem WHERE. Po przecinkach określamy które pola i jaką wartość muszą przyjmować. Rozpatrzmy przykład:
$zapytanie = "UPDATE `nba` SET `lata` = '14',`punkty` = '125' WHERE `id`='1'";
$idzapytania = mysql_query($zapytanie);

Po wykonaniu powyższego zapytania rekord o identyfikatorze równym 1 zostanie zaktualizowany a dokładniej dwa pola: lata i punkty.
Język SQL: usuwanie rekordów

Jeśli jakieś rekordy z danej tabeli już nas nie interesują pozbywamy się ich poleceniem DELETE:
DELETE FROM nazwa_tabeli [WHERE warunek]

Podobnie jak w przypadku SQLowskiego zapytania SELECT i UPDATE jeśli nie podanym warunku WHERE efekt naszego zapytania będzie dotyczył wszystkich rekordów w danej tabeli. Jeśli pominiemy warunek WHERE w zapytaniu DELETE będzie to równoznaczne z wyczyszczeniem całej tabeli. Rozpatrzmy kolejny przykład:
$zapytanie = "DELETE FROM `nba` WHERE `nazwisko`='Pipen'";
$idzapytania = mysql_query($zapytanie);

Po wykonaniu powyższego kodu w tabeli nba nie znajdzie się nikt o nazwisku Pipen.
Podsumowanie

Jeśli czytałeś(łaś) kurs uważnie to umiesz już wykonywać podstawowe zapytania do bazy danych i wyświetlać jej treść. Zapraszam do kolejnej części artykułu gdzie nauczysz się budować bardziej skomplikowane warunki i sortować wyniki zapytań.
Trochę kodu
// połączenie się lokalnym serwerem bazy MySQL
$sql_conn = mysql_connect('localhost', 'admin', 'passwd')
// w przypadku niepowodzenia połączenia zakończ aplikację
or die('Nie mogłem połaczyć się z bazą danych');

// jeśli nie mamy jeszcze bazy to musimy ją utworzyć
mysql_create_db('zawodnicy');

// wybieramy bazę danych
mysql_select_db('zawodnicy');
$idzapytania = mysql_query($zapytanie);

// tworzymy tabelę nba
$zapytanie = 'CREATE TABLE nba (id int NOT NULL AUTO_INCREMENT, imie char(30), lata char(3), punkty char(3), mistrzostwa char(3), PRIMARY KEY(id))';

// dodajemy troche przykładowych danych
$zapytanie = "INSERT INTO `nba` (`id`, `nazwisko`, `lata`, `punkty` , `mistrzostwa`) VALUES ('', 'Jordan', '13', '258', '48')";
$idzapytania = mysql_query($zapytanie);
$zapytanie = "INSERT INTO `nba` (`id`, `nazwisko`, `lata`, `punkty` , `mistrzostwa`) VALUES ('', 'Pipen', '10', '123', '32')";
$idzapytania = mysql_query($zapytanie);
$zapytanie = "INSERT INTO `nba` (`id`, `nazwisko`, `lata`, `punkty` , `mistrzostwa`) VALUES ('', 'O\'Neal', '10', '205', '50')";
$idzapytania = mysql_query($zapytanie);

// wyświetlamy treść naszej tabeli
$zapytanie = "SELECT `id`,`nazwisko`,`lata`,`punkty` FROM `nba`";
$idzapytania = mysql_query($zapytanie);
echo '<table>';
while ($wiersz = mysql_fetch_row($idzapytania)) {
echo '<tr><td>'. $wiersz[0] .'</td><td>'. $wiersz[1] .'</td>'.<td>'. $wiersz[2] .'</td><td>'. $wiersz[3] .'</td></tr>';
}
echo '<table>';

// zamykamy połączenie
mysql_close($sql_conn);


   

 

 

 


Copyright ©2006 Krzysztof Majewski