Przejdź do treści

Bezpieczne połączenie z bazą MySQL (PDO)

  • Baza danych
  • poziom: początkujący
  • aktualizacja: 12 lipca 2026

PDO to zalecany sposób łączenia się z bazą danych w PHP — bezpieczniejszy i wygodniejszy niż stare funkcje mysql_* (usunięte z PHP) i bardziej uniwersalny niż mysqli. Ten skrypt to fundament, na którym opierają się wszystkie pozostałe skrypty bazodanowe na tej stronie.

Funkcja polacz_z_baza() tworzy połączenie tylko raz i zwraca je przy każdym kolejnym wywołaniu, więc możesz jej używać w wielu miejscach bez obaw o wielokrotne łączenie.

PHP 69 linii Pobierz .php
<?php
/**
 * Bezpieczne połączenie z MySQL przez PDO — skryptyPHP.com
 * Zapisz jako: baza.php i dołączaj przez require 'baza.php';
 */

/**
 * Zwraca połączenie z bazą (tworzy je tylko przy pierwszym wywołaniu).
 */
function polacz_z_baza(): PDO
{
    static $pdo = null;

    if ($pdo === null) {
        // ── DANE DOSTĘPOWE (znajdziesz je w panelu hostingu) ──
        $host       = 'localhost';
        $baza       = 'nazwa_bazy';
        $uzytkownik = 'uzytkownik';
        $haslo      = 'haslo';

        // utf8mb4 = pełne wsparcie polskich znaków i emoji
        $dsn = "mysql:host=$host;dbname=$baza;charset=utf8mb4";

        $opcje = [
            // Błędy jako wyjątki — nic nie przejdzie „po cichu"
            PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
            // Wyniki jako tablice asocjacyjne: $wiersz['kolumna']
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            // Prawdziwe zapytania przygotowane (a nie ich emulacja)
            PDO::ATTR_EMULATE_PREPARES   => false,
        ];

        try {
            $pdo = new PDO($dsn, $uzytkownik, $haslo, $opcje);
        } catch (PDOException $e) {
            // Na produkcji NIE pokazuj $e->getMessage() —
            // komunikat może zdradzić dane dostępowe!
            error_log('Błąd połączenia z bazą: ' . $e->getMessage());
            exit('Przepraszamy, wystąpił problem z bazą danych.');
        }
    }

    return $pdo;
}

// ── PRZYKŁADY UŻYCIA ────────────────────────────────────────

$pdo = polacz_z_baza();

// 1. Zapytanie z parametrem — ZAWSZE przez prepare/execute
$stmt = $pdo->prepare('SELECT id, imie, email FROM uzytkownicy WHERE email = ?');
$stmt->execute(['jan.kowalski@przyklad.pl']);
$uzytkownik = $stmt->fetch();          // jeden wiersz albo false

// 2. Parametry nazwane — czytelniejsze przy wielu wartościach
$stmt = $pdo->prepare(
    'INSERT INTO uzytkownicy (imie, email) VALUES (:imie, :email)'
);
$stmt->execute([
    'imie'  => 'Jan Kowalski',
    'email' => 'jan.kowalski@przyklad.pl',
]);
$noweId = (int) $pdo->lastInsertId();  // ID wstawionego wiersza

// 3. Pobranie wielu wierszy
$stmt = $pdo->query('SELECT id, imie FROM uzytkownicy ORDER BY id DESC LIMIT 10');
foreach ($stmt as $wiersz) {
    echo htmlspecialchars($wiersz['imie']) . '<br>';
}

Jak użyć tego skryptu

  1. Zapisz kod jako baza.php i uzupełnij dane dostępowe (host, nazwa bazy, użytkownik, hasło) z panelu swojego hostingu.
  2. W każdym skrypcie korzystającym z bazy dołącz plik: require 'baza.php'; i pobierz połączenie: $pdo = polacz_z_baza();.
  3. Zapytania z danymi od użytkownika wykonuj wyłącznie przez prepare() + execute() — nigdy nie sklejaj SQL-a ze zmiennymi.

Warto wiedzieć

  • Zapytania przygotowane to podstawowa ochrona przed SQL injection — dane i treść zapytania podróżują do bazy osobno, więc złośliwa wartość nie zmieni sensu zapytania.
  • Kodowanie utf8mb4 (a nie starsze utf8) obsługuje wszystkie znaki Unicode, w tym emoji. Upewnij się, że tabele też mają utf8mb4_polish_ci lub utf8mb4_unicode_ci.
  • Plik z hasłem do bazy trzymaj poza katalogiem publicznym serwera, jeśli hosting to umożliwia — a przynajmniej nigdy nie rób jego kopii typu baza.php.bak, bo taką kopię każdy pobierze jak zwykły plik tekstowy.
#pdo #mysql #baza danych #sql injection #utf8mb4

Podobne skrypty