Połączenie PHP z bazą danych MySQL to fundament każdej dynamicznej aplikacji webowej: od prostego bloga po rozbudowany sklep internetowy. Żeby nawiązać php mysql polaczenie, potrzebujesz danych dostępowych do serwera bazy danych, rozszerzenia MySQLi lub PDO oraz kilku linijek kodu. W tym poradniku przejdziesz przez cały proces krok po kroku, od konfiguracji środowiska, przez pierwsze zapytanie, aż po zabezpieczenie aplikacji przed atakami SQL Injection.
Czego potrzebujesz przed rozpoczęciem
Zanim napiszesz pierwszą linijkę kodu, upewnij się, że masz:
- PHP w wersji 7.4 lub wyższej (zalecane PHP 8.x, które oferuje znacznie lepszą wydajność i typowanie)
- Serwer MySQL lub MariaDB (lokalnie: XAMPP, Laragon, MAMP lub Docker; produkcyjnie: serwer hostingowy)
- Dane dostępowe do bazy: host, nazwa bazy, użytkownik, hasło
- Edytor kodu: VS Code z rozszerzeniem PHP Intelephense lub PhpStorm
Jeśli stawiasz środowisko lokalnie, najprostszym wyborem w 2024 roku jest Laragon (Windows) lub Docker z obrazem php:8.2-apache. Laragon instaluje PHP, MySQL i Apache jednym klikiem i działa bez konfliktów z systemem.
Ważne: PHP nie wymaga żadnej zewnętrznej biblioteki do połączenia z MySQL, o ile rozszerzenia
mysqliipdo_mysqlsą włączone w plikuphp.ini. Na większości hostingów są aktywne domyślnie.
MySQLi vs PDO PHP: które wybrać?
To jedno z najczęstszych pytań początkujących. Oba rozwiązania realizują polaczenie php z baza danych, ale różnią się zakresem zastosowań.
MySQLi
MySQLi (MySQL Improved) to rozszerzenie zaprojektowane wyłącznie dla MySQL i MariaDB. Oferuje interfejs proceduralny i obiektowy. Jest nieco szybsze w prostych zastosowaniach i ma bezpośredni dostęp do specyficznych funkcji MySQL.
Kiedy warto wybrać MySQLi:
- Projekt korzysta tylko z MySQL lub MariaDB i nie planujesz zmiany silnika bazy
- Pracujesz z istniejącym kodem opartym o MySQLi
- Potrzebujesz asynchronicznych zapytań (funkcja unikalna dla MySQLi)
PDO (PHP Data Objects)
PDO to abstrakcyjna warstwa dostępu do bazy danych. Obsługuje ponad 12 silników: MySQL, PostgreSQL, SQLite, SQL Server i inne. Zmiana bazy sprowadza się do modyfikacji jednej linii konfiguracji.
Kiedy warto wybrać PDO:
- Budujesz aplikację, która może kiedyś zmienić silnik bazy danych
- Chcesz spójnego interfejsu w całym projekcie
- Korzystasz z frameworka (Laravel używa PDO przez domyślnie)
Rekomendacja: Dla nowych projektów wybieraj PDO. Dla szybkich skryptów i prostych stron MySQLi jest równie dobre. W tym poradniku pokazuję oba podejścia.
Jak nawiązać połączenie przez MySQLi
Połączenie proceduralne
…
Połączenie obiektowe (zalecane)
…
Ważne: Zawsze ustawiaj charset na
utf8mb4, nie nautf8. MySQL-owyutf8obsługuje tylko 3-bajtowe znaki Unicode i nie zapisze poprawnie np. emoji ani niektórych znaków chińskich.
Pierwsze zapytanie przez MySQLi
…
Jak nawiązać połączenie przez PDO
PHP connect mysql database przez PDO wygląda nieco inaczej, ale oferuje więcej elastyczności.
Podstawowe połączenie PDO
…
Trzy opcje w tablicy $options są kluczowe:
ERRMODE_EXCEPTIONsprawia, że błędy SQL rzucają wyjątki zamiast zwracaćfalsepo cichuFETCH_ASSOCzwraca tablice asocjacyjne zamiast numerycznych (czytelniejszy kod)EMULATE_PREPARES => falsewymusza prawdziwe prepared statements po stronie MySQL, co poprawia bezpieczeństwo
Zapytanie przez PDO z prepared statement
…
Prepared statements i ochrona przed SQL Injection
SQL Injection to atak, w którym użytkownik wstrzykuje złośliwy kod SQL do zapytania. Według raportu OWASP Top 10, injection plasuje się niezmiennie w czołówce najgroźniejszych podatności webowych.
Jak NIE pisać zapytań
…
Gdy użytkownik wpisze w URL ?id=1 OR 1=1, pobierze całą tabelę. Gdy wpisze ?id=1; DROP TABLE users, może usunąć dane.
Prepared statements w MySQLi
…
Typy w bind_param:
i= integer (liczba całkowita)s= string (tekst)d= double (liczba zmiennoprzecinkowa)b= blob (dane binarne)
Prepared statements w PDO
PDO jest tu wygodniejsze: przekazujesz tablicę parametrów bezpośrednio do execute().
…
Zasada: Każda wartość pochodząca od użytkownika (GET, POST, cookie, nagłówki HTTP) musi trafić do zapytania przez parametr, nigdy przez konkatenację stringa.
Dobre praktyki konfiguracji połączenia
Trzymaj dane dostępowe poza webroot
Plik z danymi do bazy nigdy nie powinien być dostępny przez przeglądarkę.
projekt/
├── public/ ← webroot, tutaj wskazuje Apache/Nginx
│ └── index.php
├── config/
│ └── database.php ← dane dostępowe, niedostępne z zewnątrz
└── src/
Użyj zmiennych środowiskowych
W profesjonalnych projektach dane konfiguracyjne trafiają do pliku .env, który jest wykluczony z repozytorium Git.
DB_HOST=localhost
DB_NAME=moja_baza
DB_USER=uzytkownik
DB_PASS=tajne_haslo
Biblioteka vlucas/phpdotenv wczytuje te wartości do $_ENV:
…
Singleton lub Dependency Injection
Otwieranie nowego połączenia przy każdym zapytaniu to poważny błąd wydajnościowy. W małych projektach użyj wzorca Singleton, w większych wstrzykuj obiekt PDO przez konstruktor (Dependency Injection).
…
Obsługa błędów i debugowanie
Tryby błędów w PDO
PDO oferuje trzy tryby raportowania błędów:
| Tryb | Stała | Zachowanie |
|---|---|---|
| Silent | ERRMODE_SILENT | Błąd ignorowany (domyślny, niebezpieczny) |
| Warning | ERRMODE_WARNING | PHP Warning, skrypt działa dalej |
| Exception | ERRMODE_EXCEPTION | Rzuca PDOException (zalecany) |
Zawsze używaj ERRMODE_EXCEPTION i owijaj operacje na bazie w bloki try/catch.
Logowanie błędów na produkcji
Na serwerze produkcyjnym nigdy nie wyświetlaj komunikatów błędów użytkownikowi. Loguj je do pliku i pokazuj generyczny komunikat.
…
Debugowanie zapytań
Pomocne narzędzia:
- MySQL General Log (włącz na czas developmentu, wyłącz na produkcji)
- EXPLAIN przed zapytaniem SELECT, by sprawdzić jak MySQL wykonuje zapytanie
- Debugbar dla Laravel lub Tracy dla Nette wyświetlają wszystkie zapytania w panelu developera
Kompletny przykład: klasa do obsługi bazy danych
Poniżej prosty, gotowy do użycia wrapper, który możesz skopiować i dostosować do swojego projektu.
…
Przenieś swoją wiedzę o bazach danych na wyższy poziom
Połączenie PHP z MySQL to jedno, ale żeby pisać wydajny i bezpieczny kod backendowy, musisz rozumieć, co dzieje się po stronie bazy danych: jak projektować tabele, pisać złożone zapytania JOIN, optymalizować indeksy i korzystać z transakcji.
Jeśli chcesz usystematyzować tę wiedzę, zajrzyj na kurs SQL: Praktyczny Przewodnik po Bazach Danych dostępny na vita.edu.pl. Kurs przeprowadza Cię przez praktyczne aspekty pracy z bazami danych: od podstaw SELECT przez GROUP BY, podzapytania, widoki, aż po optymalizację zapytań w realnych projektach.
Kurs jest dostępny w ramach abonamentu VITA. Możesz zacząć już teraz, bo pierwsze 7 dni masz zupełnie za darmo, a dostęp obejmuje wszystkie kursy na platformie. Anulowanie jest możliwe w każdej chwili, bez żadnych zobowiązań. Sprawdź ofertę i zacznij darmowy trial: vita.edu.pl/abonament
Podsumowanie
Nawiązanie połączenia PHP z MySQL sprowadza się do kilku konkretnych kroków:
- Wybierz rozszerzenie: PDO dla nowych projektów i większej przenośności, MySQLi gdy pracujesz tylko z MySQL i potrzebujesz specyficznych funkcji
- Ustaw charset
utf8mb4od razu, zanim wykonasz pierwsze zapytanie - Używaj prepared statements dla każdej wartości od użytkownika, bez wyjątków
- Trzymaj dane dostępowe poza webroot i korzystaj ze zmiennych środowiskowych
- Włącz tryb wyjątków (
ERRMODE_EXCEPTION) i loguj błędy po cichu na produkcji - Otwieraj połączenie raz i przekazuj je dalej przez DI lub Singleton
Mając te zasady w głowie, budujesz aplikacje, które są bezpieczne, czytelne i łatwe w utrzymaniu. Kolejny krok to pogłębienie wiedzy o samym SQL, bo nawet najlepsza warstwa PHP nie zastąpi dobrze zaprojektowanej bazy danych i optymalnych zapytań.