Bazy danych mysql

Znając podstawowe informacje na temat klas, funkcji i obiektów przejdźmy teraz do najważniejszej wg mnie części, czyli baz danch. Jest wiele możliwości dostarczania danych do działania programu, można je trzymać w plikach, przesyłać, wprowadzać ale chyba nie ma lepszego rozwiązania niż bazy danch do których możemy wprowadzać dane a następnie w stosunkowo prosty sposób wyciągać dokładnie to co jest nam potrzebne.

Przy wykorzystaniu baz danych MySql niezbędna jest chociaż podstawowa wiedza o jęsyku SQL, który jest wykorzystywany także w pracy z innymi bazami danych, dlatego tez w tej lekcji nie obejdzie się bez przedstawienia kilku podstawowych komend.

Bez zbędnego owijania przejdźmy do konkretów.

Łącznie z bazą MySql

Aby się połączyć z jakąkolwiek bazą musimy ją najpierw mieć. Więc zacznijmy od założenia lokalnej bazy danych o nazwie „kurs_php”. Zakładam że masz standardowe ustawienia programu XAMPP (podejrzewam że w innych przypadkach ta procedura nie będzie się wiele różnić).

Aby założyć bazę wykorzystamy sobie narzędzie PHPMyAdmin, aby z niego skorzystać trzeba uruchomić serwer lokalny i wejść w http://localhost/phpmyadmin jeśli wszystko jest ok to uzyskamy panel PHPMyAdmin gdzie po lewej jest menu z bazami danych a po prawej panel obsługi wybranej bazy lub lista baz. Klikamy na „Bazy danych” w lewym górnym rogu panelu i tworzymy nową bazę o nazwie „kurs_php”, wyszukujemy metodę porównywania napisów utf8_polish_ci co umożliwi zapis polski znaków domyślnie.

Po przejściu do świeżo utworzonej bazy powinniśmy zobaczyć menu: struktura, SQL, Szukaj, Zapytanie itd.. A pod spodem „Nie znaleziono żadnych tabel w bazie danych”. Stwórzmy sobie jakąś tabelę, na przykład taką o nazwie start_table o liczbie kolumn 3.

Dalej definiujemy sobie te kolumny, pierwsza z nich będzie miała nazwę id (jak to zazwyczaj bywa) typ zostawiamy INT wybieramy index PRIMARY oraz zaznaczamy A_I czyli Auto Increment. Ta kolumna ma klucz podstawowy i numerowanie automatyczne, dzięki czemu będziemy mogli powiedzieć bazie danych który dokładnie rekord chcemy, jest to ważne ponieważ bez tej kolumny ciężko będzie później edytować konkretny rekord.

Druga kolumna to będzie nazwa: value, type: text, w niej będziemy mogli przechować dowolne wartości jako tekst. Warto tutaj wybrać metodę porównywania napisów utf8_polish_ci dzięki czemu będzie się mozna posługiwać polskimi znakami jeśli nie wybraliśmy tej metody przy tworzeniu bazy.

Trzecia kolumna będzie zawierała datę utworzenia created typ TIMESTAMP zaś wartość domyślna to będzie CURRENT_TIMESTAMP dzięki czemu przy każdym dodaniu rekordu będzie wstawiana w tym polu bieżący czas. Klikamy zapisz i mamy pierwszą tabelę. Oczywiście tabela jest pusta więc można dodać do niej jakieś dane.

Oczywiście w PHPMyAdminie można „wyklikać” nowy rekord, w tym celu wybieramy z menu górnego Wstaw i w formularzu wypełniamy tylko pole value wpisując w nie dowolną wartość, na przykład „Witaj świecie”. Bardzo prawdopodobne że pokazały się dwa formularze, umożliwiające dodanie dwóch rekordów to możemy jeszcze w drugim wpisać „Ala ma kota”. To samo osiągniemy wykonując pojedyńczą operację dwa razy. Na koniec klikamy „Wykonaj” i już mamy gotową bazę do nauki.

Nadszedł czas aby nawiązać połączenie z naszą bazą. Do tego celu wykorzytujemy klasę mysqli, zacznijmy od utworzneia obiektu.

<?php
    $mysql = new mysqli("localhost", "root", "", "kurs_php");
?>

Obiektem naszej bazy danych będzie zmienna $mysql, tworząc obiekt przekazujemy do konstruktora klasy mysli co najmniej cztery argumenty:

  • Host – czyli host gdzie jest baza, jest to przeważnie localhost jeśli trzymamy baze na tym samym serwerze co program ale może być też adres ip lub domena gdzie znajduje się baza
  • Użytkownik bazy danych – często taki sam jak nazwa bazy, po zainstalowaniu xampp „root” to użytkownik mający dostęp do wszystkich baz i to bez hasła (zawsze radzi się to zmienić po instalacji)
  • Hasło użytkownika bazy danych – domyślnie na localhoście przeważnie puste
  • Baza danych – wybieramy bazę na której chcemy pracować w naszym przypadku przed chwilą utowrzona.

Można jeszcze jako piąty argument podać port jeśli jest inny niż standardowy 3306.

Jeśli poprawnie podaliśmy dane do bazy powinno się nic nie wyświetlić w przypadku powyższej linii kodu, jeśli dane nie są prawidłowe uzyskamy ostrzeżenie że dany użytkownik nie ma dostępu. Jeśli nie podoba nam się „Warning” możemy ten błąd ładnie obsłużyć pozyckując jego treść.

<?php
    if (!empty($mysql->connect_errno)) {
        echo "Nie udało się połączyć z bazą danych MySQL: (" . $mysql->connect_errno . ") " . $mysql->connect_error;
    }
?>

Za pomocą powyższego kodu możemy pobrać kod błędu $mysql->connect_errno i jego treść $mysql->connect_error.

Pobieranie danych

Gdy się połączymy możemy pobrać dane, które wcześniej wprowadziliśmy, lub wykonać jakiąkolwiek inną komendę.

$result = $mysql->query("SELECT * FROM `start_table`");
if($result->num_rows > 0){
    while ($row = $result->fetch_assoc()){
        echo $row['value'] . '';
    }
}

W powyższym przykładzie w pierwszej linijce wykorzystujemy nasz obiekt $mysql. Wykonujemy podstawowe zapytanie do bazy danych SELECT * FROM `start_table`, w którym pobieramy wszystkie kolumny i wszystkie rekordy z tabeli start_table. Zamiast gwiazdki możemy podać nazwy kolejnych kolumn po przecinku, z których dane chcemy pobrać, aby ograniczyć ilość rekordów wyorzystujemy komenty WHERE lub LIMIT.

W drugiej linijce pobieramy ilość rekordów jakie zwróci zapytanie i sprawdzamy czy jest większa od zera, czyli czy pobierzemy jakieś dane.

I jeśli nasze zapytanie zwraca jakieś rekordy to za pomocą pętli while przypisujemy kolejne rekordy w postaci tablicy assocjacyjnej do zmiennej $row Każdy rekord w tym przypadku to tablica assocjacyjna gdzie klucze tablicy to nazwy kolumn. W ten sposób $row[’value’] to wartość bieżącego rekordu z kolumny value, czyli nasz tekst.

W efekcie powinniśmy otrzymać dwie linie gdzie w pierwszej będzie „witaj świecie” a w drugiej „Ala ma kota”, no chyba że wprowadziliśmy do bazy inne dane.

Dodawanie danych

Dodawanie danych do bazy jest dużo łatwiejsze niż pobieranie i wyświetlanie. Oczywiście o ile nie uwzględanimy wcześniejszego ich filtrowania. Aby dodać rekord musimy wykonać tylko komendę INSERT INTO.

$res = $mysql->query("INSERT INTO `start_table` (value) VALUES ('jakiś dodatkowy tekst')");
if($res){
    echo "Dodano rekord do bazy";
} else {
    echo "Nie udało się dodać rekordu: " . $mysql->error; 
}

Do naszej zmiennej przypisujemy wynik działania metody query klasy mysqli. Jeśli dodanie rekordu powiedzie się otrzymamy true a jeśli nie to false. Powyższy kod najlepiej umieścić pomiędzy połączeniem a pobraniem danych z bazy (od razu zobaczymy dodany rekord).

Tutaj dodaliśmy obsługę, czyli jeśli dodamy rekord otrzymamy stosowny komunikat a jeśli nie to poznamy treść błędu (dowiemy się co zrobiliśmy nie tak).

Edycja danych

Kolejną podstawową czynnością wykonywanych na danych jest ich edycja. Warto zauważyć że jeśli przechowujemy wiele danych w pliku i chcemy edytować jedną konkretną to może to być problematyczne w bazie możemy mieć nawet tysiące rekordów (czy tam miliony) a edycja zawsze jest prosta jeśli posiadamy id danego rekordu.

$res = $mysql->query("UPDATE `start_table` SET value = 'edytowany tekst' WHERE id = 3");
if($res){
    echo "Zaktualizowano rekord";
} else {
    echo "Nie udało się zaktualizować rekordu rekordu: " . $mysql->error; 
}

W tym przykładzie nie wiele się zmienia w stosunku do przykładu w którym dodaliśmy rekord do bazy. W pierwszej lini zmianie uległo zapytanie. Słowo kluczowe UPDATE wskazuje na to że chcemy edytować tabelę, której nazwa jest zaraz po tym słowie. Następnie jest słowo SET a po nim po przecinku wartości, które checmy zmienić.

UWAGA: przy edycji dość istotny jest warunek WHERE. W tym przypadku wzkazujemy, że chcemy edytować rekord o id = 3. Jeśli nie określilibyśmy warunku zmianie by uległy wszystkie rekordy, czyli utracilibyśmy całe dane z danej kolumny. (jakby tak zrobić na produkcji klienta mógłby być lekko niezadowolony 😉 )

Usuwanie danych

No i teraz czas na najbardziej ekstremalną komendę dzisiaj. (Choć ogólnie to jest DROP database co usuwa całą bazę czego lepiej nie uczyć początkujących 😀 ). Aby usunąć rekord z tabeli należy wykonać zapytanie DELETE FROM nazwa_tabeli WHERE warunek.


$res = $mysql->query("DELETE FROM `start_table`  WHERE id = 4");

I w ten sposób możemy usunąć rekord o id nr 4.

Najłatwiej jest zarządzać danymi w PHP wykorzystując do tego formularze i przesyłanie id w linku metodą GET. Tak można łatwo edytować i usuwać dane.

Zadania

1. Napisz program zawierający prosty formularz z dwoma polami umożliwiający dodawanie rekordu do bazy.

2. Dopisz do powyższego listowanie i możliwość usuwania rekordu, najlepiej wykorzystać do tego link z id rekordu i przesyłanie metodą GET.

3. Do powyższego dodaj link „edytuj” gdzie po kliknięciu do formularza zostaną wczytane dane rekordu i będzie można je dowolnie zmienić jak przy dodawaniu.