Wprowadzenie
W poprzednich lekcjach nauczyliśmy się, jak wykonywać podstawowe operacje na bazach danych, takie jak wstawianie, aktualizowanie i usuwanie danych. W tej lekcji omówimy bardziej zaawansowane techniki pracy z bazami danych w PHP, takie jak transakcje, relacje między tabelami (z kluczami obcymi) oraz optymalizacja zapytań SQL. Te techniki są niezbędne do budowy skalowalnych i wydajnych aplikacji, które pracują z dużymi zbiorami danych i wymagają spójności oraz integralności.
Transakcje w PHP
Transakcja to grupa operacji SQL, które są wykonywane jako jedna jednostka. Transakcje gwarantują, że wszystkie operacje zakończą się sukcesem lub żadna z nich nie zostanie wykonana. Jest to szczególnie przydatne w sytuacjach, gdzie mamy do czynienia z operacjami krytycznymi, takimi jak przelewy bankowe, gdzie musimy upewnić się, że zmiany zostaną zapisane poprawnie.
Zasady transakcji (ACID):
- Atomicity (Atomowość): Transakcja jest jednostką operacji, które muszą być wykonane wszystkie razem lub żadna z nich.
- Consistency (Spójność): Każda transakcja musi przeprowadzać bazę danych z jednego spójnego stanu do drugiego.
- Isolation (Izolacja): Transakcje nie mogą wpływać na siebie nawzajem.
- Durability (Trwałość): Po zatwierdzeniu transakcji, zmiany muszą być trwałe.
Używanie transakcji w MySQL i PHP
W MySQL transakcje można zarządzać za pomocą funkcji BEGIN
, COMMIT
i ROLLBACK
.
BEGIN
: Rozpoczyna transakcję.COMMIT
: Zatwierdza zmiany w bazie danych.ROLLBACK
: Anuluje transakcję i przywraca bazę danych do stanu sprzed rozpoczęcia transakcji.
Przykład transakcji w PHP:
<?php $conn = mysqli_connect("localhost", "root", "", "moja_baza"); // Rozpoczynanie transakcji mysqli_begin_transaction($conn); try { // Przykładowe operacje w ramach transakcji $sql1 = "UPDATE konta SET saldo = saldo - 100 WHERE id = 1"; $sql2 = "UPDATE konta SET saldo = saldo + 100 WHERE id = 2"; mysqli_query($conn, $sql1); mysqli_query($conn, $sql2); // Zatwierdzenie transakcji mysqli_commit($conn); echo "Transakcja zakończona sukcesem!"; } catch (Exception $e) { // Wycofanie transakcji w przypadku błędu mysqli_rollback($conn); echo "Błąd: Transakcja została wycofana."; } mysqli_close($conn); ?>
Wyjaśnienie:
mysqli_begin_transaction()
: Rozpoczyna nową transakcję.mysqli_commit()
: Zatwierdza wszystkie operacje wykonane w ramach transakcji.mysqli_rollback()
: Wycofuje wszystkie operacje, jeśli wystąpi błąd.
Relacje między tabelami – klucze obce (foreign keys)
Relacje między tabelami są kluczowe w bazach danych relacyjnych. Umożliwiają one powiązanie danych między różnymi tabelami, co pozwala na lepszą organizację i spójność danych.
– Klucz obcy (foreign key)
Klucz obcy to kolumna lub zestaw kolumn w jednej tabeli, które odnoszą się do kolumn w innej tabeli. Klucze obce zapewniają, że relacje między tabelami są zachowywane, co umożliwia tworzenie bardziej skomplikowanych struktur danych.
Przykład: Tabela zamowienia może być powiązana z tabelą klienci, gdzie każde zamówienie należy do jednego klienta.
CREATE TABLE klienci ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, imie VARCHAR(50) NOT NULL, email VARCHAR(50) ); CREATE TABLE zamowienia ( id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, klient_id INT(6) UNSIGNED, data_zamowienia DATE, FOREIGN KEY (klient_id) REFERENCES klienci(id) ON DELETE CASCADE );
Wyjaśnienie:
- klient_id: Jest kluczem obcym, który odnosi się do kolumny
id
w tabeli klienci. - ON DELETE CASCADE: Jeśli klient zostanie usunięty, wszystkie powiązane z nim zamówienia również zostaną usunięte.
– Pobieranie danych z powiązanych tabel (JOIN)
Aby pobrać dane z wielu powiązanych tabel, używamy JOIN. Na przykład, aby pobrać wszystkie zamówienia wraz z informacjami o klientach:
<?php $conn = mysqli_connect("localhost", "root", "", "moja_baza"); $sql = "SELECT zamowienia.id, klienci.imie, zamowienia.data_zamowienia FROM zamowienia JOIN klienci ON zamowienia.klient_id = klienci.id"; $result = mysqli_query($conn, $sql); while ($row = mysqli_fetch_assoc($result)) { echo "Zamówienie ID: " . $row['id'] . " - Klient: " . $row['imie'] . " - Data zamówienia: " . $row['data_zamowienia'] . "<br>"; } mysqli_close($conn); ?>
Optymalizacja zapytań SQL
Gdy aplikacja rośnie, optymalizacja zapytań SQL staje się kluczowa dla zapewnienia wydajności bazy danych. Oto kilka technik optymalizacji:
1. Indeksy
Indeksy przyspieszają wyszukiwanie danych w dużych tabelach, ale mają także koszty związane z aktualizacją danych. Powinny być używane rozsądnie.
Przykład tworzenia indeksu:
CREATE INDEX idx_klient_id ON zamowienia (klient_id);
2. Unikanie SELECT *
Używanie SELECT *
może być nieefektywne, ponieważ pobiera wszystkie kolumny tabeli. Zamiast tego wybieraj tylko te kolumny, które są potrzebne:
$sql = "SELECT imie, email FROM klienci WHERE id = 1";
3. Paginacja wyników
Gdy mamy do czynienia z dużą liczbą wyników, warto zastosować paginację (podział wyników na strony). MySQL oferuje możliwość paginacji za pomocą LIMIT
i OFFSET
.
Przykład:
$sql = "SELECT * FROM zamowienia LIMIT 10 OFFSET 20"; // Pobierze 10 zamówień zaczynając od 21. rekordu
4. Buforowanie wyników
Jeśli wyniki zapytań są często powtarzane, warto rozważyć buforowanie (caching) danych po stronie aplikacji, aby zmniejszyć obciążenie bazy danych. Istnieje wiele sposobów na buforowanie, takich jak Memcached lub Redis.
Podsumowanie
W tej lekcji omówiliśmy zaawansowane techniki pracy z bazami danych w PHP, takie jak transakcje, relacje między tabelami za pomocą kluczy obcych oraz optymalizacja zapytań SQL. Dzięki tym technikom można zapewnić, że aplikacje będą nie tylko poprawnie działać, ale także będą skalowalne i wydajne, co jest szczególnie ważne w przypadku większych projektów.
Gratulacje! Ukończyłeś lekcję 13.
Przejdź teraz do lekcji 14 >> Testowanie jednostkowe w PHP z PHPUnit
Spis Treści - darmowy kurs PHP
Wprowadzenie: Instalacja środowiska PHP
Lekcja 1: Podstawy składni PHP
Lekcja 2: Funkcje i instrukcje warunkowe w PHP
Lekcja 3: Pętle w PHP
Lekcja 4: Tablice w PHP
Lekcja 5: Dodatkowe podstawy funkcji w PHP
Lekcja 6: Praca z formularzami HTML w PHP
Lekcja 7: Obsługa plików w PHP
Lekcja 8: Sesje i ciasteczka w PHP
Lekcja 9: Podstawy operacji na bazach danych MySQL z PHP
Lekcja 10: Prepared Statements w PHP i bezpieczeństwo aplikacji
Lekcja 11: Zarządzanie użytkownikami – rejestracja, logowanie i autoryzacja w PHP
Lekcja 12: Wzorce projektowe w PHP – wprowadzenie do wzorca MVC
Lekcja 13: Zaawansowane techniki pracy z bazami danych w PHP
Lekcja 14: Testowanie jednostkowe w PHP z PHPUnit
Lekcja 15: Tworzenie i korzystanie z API RESTful w PHP
Lekcja 16: Obsługa plików JSON i XML w PHP
Dodatki
- Spis najważniejszych funkcji PHP
Jeśli chciałbyś być poinformowany o następnych kursach to zapisz się do naszego newslettera: