Wróć do bloga

Jak połączyć PHP z bazą MySQL: Kompletny poradnik krok po kroku

Chcesz połączyć PHP z MySQL i nie wiesz od czego zacząć? Ten poradnik pokazuje krok po kroku jak nawiązać połączenie przez MySQLi i PDO, obsłużyć błędy i zabezpieczyć zapytania.

Zespół VITA
Jak połączyć PHP z bazą MySQL: Kompletny poradnik krok po kroku

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 mysqli i pdo_mysql są włączone w pliku php.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 na utf8. MySQL-owy utf8 obsł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_EXCEPTION sprawia, że błędy SQL rzucają wyjątki zamiast zwracać false po cichu
  • FETCH_ASSOC zwraca tablice asocjacyjne zamiast numerycznych (czytelniejszy kod)
  • EMULATE_PREPARES => false wymusza 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:

TrybStałaZachowanie
SilentERRMODE_SILENTBłąd ignorowany (domyślny, niebezpieczny)
WarningERRMODE_WARNINGPHP Warning, skrypt działa dalej
ExceptionERRMODE_EXCEPTIONRzuca 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:

  1. Wybierz rozszerzenie: PDO dla nowych projektów i większej przenośności, MySQLi gdy pracujesz tylko z MySQL i potrzebujesz specyficznych funkcji
  2. Ustaw charset utf8mb4 od razu, zanim wykonasz pierwsze zapytanie
  3. Używaj prepared statements dla każdej wartości od użytkownika, bez wyjątków
  4. Trzymaj dane dostępowe poza webroot i korzystaj ze zmiennych środowiskowych
  5. Włącz tryb wyjątków (ERRMODE_EXCEPTION) i loguj błędy po cichu na produkcji
  6. 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ń.

Najczęściej zadawane pytania

Czy PHP łączy się z MySQL bez dodatkowych bibliotek?

Tak, PHP zawiera wbudowane rozszerzenia MySQLi i PDO_MySQL. Wystarczy, że są aktywowane w pliku php.ini, co na większości hostingów dzieje się domyślnie. Nie musisz instalować żadnych zewnętrznych pakietów, by nawiązać połączenie z bazą MySQL.

Co jest lepsze do połączenia PHP z MySQL: MySQLi czy PDO?

PDO jest lepszym wyborem dla nowych projektów, bo obsługuje wiele silników baz danych i ma spójniejszy interfejs. MySQLi sprawdza się, gdy pracujesz wyłącznie z MySQL lub MariaDB i potrzebujesz dostępu do specyficznych funkcji, takich jak zapytania asynchroniczne. Oba rozszerzenia obsługują prepared statements i są bezpieczne przy poprawnym użyciu.

Jak zabezpieczyć połączenie PHP z MySQL przed SQL Injection?

Zawsze używaj prepared statements i parametrów zapytania zamiast wklejać wartości użytkownika bezpośrednio do stringa SQL. W PDO przekazujesz parametry do metody execute(), w MySQLi korzystasz z bind_param(). Nigdy nie buduj zapytań przez konkatenację danych z GET, POST ani cookies.

Dlaczego moje połączenie PHP z MySQL zwraca błąd 'Access denied'?

Błąd 'Access denied' oznacza, że podane dane dostępowe są niepoprawne lub użytkownik MySQL nie ma uprawnień do wskazanej bazy. Sprawdź poprawność hosta, nazwy użytkownika, hasła i nazwy bazy. Upewnij się też, że użytkownik ma nadane uprawnienia poleceniem GRANT w MySQL, a nie tylko istnieje w systemie.

Czy powinienem zamykać połączenie z bazą danych po każdym zapytaniu?

Nie musisz zamykać połączenia ręcznie po każdym zapytaniu. PHP automatycznie zamyka połączenie po zakończeniu skryptu. Wystarczy, że otworzysz jedno połączenie na początku skryptu i używasz go do wszystkich zapytań. Otwieranie nowego połączenia przy każdym zapytaniu spowalnia aplikację i niepotrzebnie obciąża serwer.

Jak połączyć PHP z MySQL na zewnętrznym serwerze, nie na localhost?

Zamień wartość hosta z 'localhost' na adres IP lub domenę zewnętrznego serwera MySQL. Pamiętaj, że serwer MySQL musi mieć otwarty port 3306 dla Twojego adresu IP oraz użytkownik musi mieć uprawnienia dostępu zdalnego (nie tylko z localhost). Wiele hostingów blokuje zdalny dostęp do MySQL domyślnie ze względów bezpieczeństwa.

Udostępnij artykuł