Logo

PHP - Połączenie z bazą danych

Opis: Zostanie omówione połączenie z bazą danych MySQL w języku PHP, w tym wykonywanie zapytań za pomocą mysqli_connect, mysqli_query i mysqli_fetch_assoc, wykorzystanie przygotowanych zapytań (prepare, bind_param) oraz obsługa błędów, umożliwiające bezpieczną pracę z danymi w aplikacjach webowych.

Wstęp teoretyczny (MySQLi w PHP)

Rozszerzenie MySQLi (MySQL Improved) w PHP służy do komunikacji z bazą danych MySQL. Umożliwia wykonywanie zapytań SQL, pobieranie danych oraz obsługę błędów.

Najważniejsze funkcje:

  • mysqli_connect() - nawiązuje połączenie z bazą danych,

  • mysqli_query() - wykonuje zapytanie SQL,

  • mysqli_fetch_assoc() - pobiera kolejne wiersze wyników jako tablicę asocjacyjną ($row['tytul']).

  • mysqli_fetch_row() - pobiera kolejne wiersze wyników jako tablicę indeksowaną ($row[0]).

1. mysqli_connect() - nawiązanie połączenia

Przykład

$polaczenie = mysqli_connect("localhost", "root", "", "moja_baza");

if (!$polaczenie) {
    die("Błąd połączenia: " . mysqli_connect_error());
}

Wyjaśnienie

  • "localhost" - adres serwera bazy danych,

  • "root" - użytkownik bazy,

  • "" - hasło użytkownika,

  • "moja_baza" - nazwa bazy danych.

Funkcja próbuje połączyć się z bazą danych. Jeśli się nie uda, mysqli_connect() zwraca false. mysqli_connect_error() zwraca opis błędu. die() przerywa działanie programu i wyświetla komunikat.

2. mysqli_query() - wykonanie zapytania

Przykład

$sql = "SELECT * FROM users";
$wynik = mysqli_query($polaczenie, $sql);

if (!$wynik) {
    die("Błąd zapytania: " . mysqli_error($polaczenie));
}

Wyjaśnienie

  • $sql - zapytanie SQL,

  • mysqli_query() wysyła zapytanie do bazy.

Zapytanie "SELECT * FROM users" pobiera wszystkie rekordy z tabeli. Wynik zapytania trafia do $wynik. Jeśli zapytanie jest błędne - zwracane jest false. mysqli_error() zwraca szczegóły błędu.

3. mysqli_fetch_assoc() - pobieranie danych

Przykład

while ($wiersz = mysqli_fetch_assoc($wynik)) {
    echo $wiersz["name"] . "<br>";
}
  • mysqli_fetch_assoc() pobiera jeden wiersz wyniku jako tablicę asocjacyjną (["id" => 1, "name" => "Jan"]).

Funkcja pobiera kolejne rekordy z $wynik. Każdy rekord trafia do zmiennej $wiersz. Możemy odwołać się do kolumn po nazwach ("name"). Gdy nie ma więcej danych - funkcja zwraca null i pętla się kończy.

Połączenie z bazą - przykłady

Połączenie z bazą i wyświetlenie rekordów

<?php
$hostname = 'localhost'; // Nazwa hosta
$username = 'root'; // Nazwa użtytkownika
$password = ''; // Hasło
$database = 'biblioteka'; // Nazwa bazy danych

$conn = mysqli_connect($hostname, $username, $password, $database);

$query = "SELECT * FROM ksiazki";
$result = mysqli_query($conn, $query);

while($row = mysqli_fetch_row($result)){
    echo $row[0]. ' '. $row[1]. ' '. $row[2]. ' '. $row[3]. ' '. $row[4]."<br>";
}

mysqli_close($conn);
?>

Wyjaśnienie:

  • $conn = mysqli_connect($hostname, $username, $password, $database);
    Tutaj PHP nawiązuje połączenie z bazą danych MySQL. Zmienna $conn przechowuje wynik połączenia. Jeśli coś pójdzie nie tak (np. błędne hasło), $conn będzie false.

  • $query = "SELECT * FROM ksiazki";
    Tworzysz zapytanie SQL, które pobiera wszystkie kolumny (*) z tabeli ksiazki.

  • $result = mysqli_query($conn, $query);
    Funkcja wykonuje zapytanie na bazie danych. $result zawiera wynik (tzw. result set), czyli wszystkie wiersze, które spełniają warunki zapytania.

  • while($row = mysqli_fetch_row($result)){ ... }
    Pętla pobiera kolejno każdy wiersz z wyniku. mysqli_fetch_row() zwraca dane w postaci tablicy indeksowanej.

    • $row[0] - pierwsza kolumna (np. id)

    • $row[1] - druga kolumna (np. tytul)

    • itd.

  • echo $row[0]. ' '. $row[1]. ' '. $row[2]. ' '. $row[3]. ' '. $row[4]."<br>";
    Wyświetlasz wartości kolumn w jednym wierszu, a <br> wstawia nową linię w przeglądarce.

  • mysqli_close($conn);
    Zamykasz połączenie z bazą, co jest dobrą praktyką, żeby zwolnić zasoby serwera.

Wprowadzanie nowych rekordów do bazy danych

<?php
$hostname = 'localhost'; // Nazwa hosta
$username = 'root'; // Nazwa użtytkownika
$password = ''; // Hasło
$database = 'biblioteka'; // Nazwa bazy danych

$conn = mysqli_connect($hostname, $username, $password, $database);

$tytul = "tytul";
$autor = "autor";
$rok = "2022";
$data = date("Y-m-d");

$sql = "INSERT INTO `ksiazki` (`id`, `tytul`, `autor`, `rok`, `data-dod`)
        VALUES (NULL, '$tytul', '$autor', '$rok', '$data')";

if($result = mysqli_query($conn, $sql)) echo "Dodano nowy rekord";
else echo "Nie udało się dodać nowego rekordu";

mysqli_close($conn);
?>

Wyjaśnienie:

  • $conn = mysqli_connect($hostname, $username, $password, $database);
    To samo jak wcześniej - połączenie z bazą.

  • $tytul = "tytul"; $autor = "autor"; $rok = "2022"; $data = date("Y-m-d");
    Przygotowujesz dane do wstawienia do tabeli. Funkcja date("Y-m-d") generuje aktualną datę w formacie YYYY-MM-DD.

  • $sql = "INSERT INTO ksiazki (id, tytul, autor, rok, data-dod) VALUES (NULL, '$tytul', '$autor', '$rok', '$data')";
    Tworzysz zapytanie SQL typu INSERT. id ustawiasz na NULL, bo kolumna jest zazwyczaj auto_increment. Pozostałe wartości pochodzą ze zmiennych.

  • if($result = mysqli_query($conn, $sql)) echo "Dodano nowy rekord"; else echo "Nie udało się dodać nowego rekordu";
    Funkcja mysqli_query() wykonuje zapytanie.

    • Jeśli wstawienie się uda - wyświetli komunikat "Dodano nowy rekord".

    • Jeśli wystąpi błąd - wyświetli komunikat o niepowodzeniu.

  • mysqli_close($conn);
    Zamykasz połączenie z bazą danych.

Bezpieczne wprowadzanie danych

<?php
$hostname = 'localhost';
$database = 'biblioteka';
$username = 'root';
$password = '';

$conn = mysqli_connect($hostname, $username, $password, $database);

$tytul = "tytul";
$autor = "autor";
$rok = "2022";
$data = date("Y-m-d");

$stmt = mysqli_prepare($conn, "INSERT INTO ksiazki (tytul, autor, rok, data-dod) VALUES (?, ?, ?, ?)");

mysqli_stmt_bind_param($stmt, "ssis", $tytul, $autor, $rok, $data);

if(mysqli_stmt_execute($stmt)){
    echo "Dodano nowy rekord";
} else {
    echo "Błąd podczas dodawania rekordu";
}

mysqli_stmt_close($stmt);
mysqli_close($conn);
?>

Co jest tu bezpieczniejsze:

  1. $stmt = mysqli_prepare($conn, "INSERT INTO ksiazki (...) VALUES (?, ?, ?, ?)");
    Tworzysz tzw. przygotowane zapytanie (prepared statement).

    • Kluczowa różnica:

      • zamiast wstawiać dane bezpośrednio do SQL ('$tytul')

      • używasz znaków zapytania ? jako placeholderów

    • Dzięki temu dane są oddzielone od zapytania SQL - to podstawa ochrony przed SQL Injection.

  2. mysqli_stmt_bind_param($stmt, "ssis", $tytul, $autor, $rok, $data);
    Tutaj przypisujesz wartości do placeholderów ?.

    • "ssis" oznacza typy danych:

      • s - string ($tytul)

      • s - string ($autor)

      • i - integer ($rok)

      • s - string ($data)

    • Kolejność musi odpowiadać kolejności ? w zapytaniu.

  3. if(mysqli_stmt_execute($stmt))

    • W tym momencie:

      • zapytanie SQL jest już przygotowane

      • dane są bezpiecznie wstrzykiwane przez silnik MySQL

      • zapytanie jest wykonywane

    • jeśli wszystko się uda - true
      w przeciwnym razie - false

Zadania - Połączenie z bazą danych

1. Wyświetlanie danych z bazy

Napisz skrypt PHP, który połączy się z bazą danych szkola i wyświetli wszystkie rekordy z tabeli uczniowie. Dla każdego ucznia wyświetl: imię, nazwisko, klasę oraz średnią ocen.

Kroki do wykonania:

  1. Utwórz zmienne do połączenia z bazą.

  2. Nawiąż połączenie z bazą przy użyciu mysqli_connect() i zapisz je do zmiennej $conn.

  3. Przygotuj zapytanie SQL:

    SELECT * FROM uczniowie
  4. Wykonaj zapytanie za pomocą mysqli_query() i zapisz wynik do zmiennej $result.

  5. Użyj pętli while wraz z mysqli_fetch_row() lub mysqli_fetch_assoc(), aby przejść po wszystkich rekordach.

  6. W każdej iteracji:

    • pobierz dane jednego ucznia

    • wyświetl imię, nazwisko, klasę i średnią (np. w jednej linii)

  7. Po zakończeniu zamknij połączenie funkcją mysqli_close().

2. Dodawanie danych do bazy

Napisz skrypt PHP, który doda nowy rekord do tabeli uczniowie w bazie szkola. Dane ucznia (imię, nazwisko, klasa, średnia ocen) mają być zapisane w zmiennych w kodzie.

Kroki do wykonania:

  1. Utwórz zmienne do połączenia z bazą.

  2. Połącz się z bazą danych przy użyciu mysqli_connect().

  3. Przygotuj zmienne z danymi ucznia, np.:

    • $imie

    • $nazwisko

    • $klasa

    • $srednia

  4. Zbuduj zapytanie SQL typu INSERT INTO, które doda dane do tabeli uczniowie.

    • pamiętaj o NULL dla kolumny id (jeśli jest auto_increment)

  5. Wykonaj zapytanie za pomocą mysqli_query().

  6. Sprawdź wynik:

    • jeśli się uda - wyświetl komunikat o sukcesie

    • jeśli nie - komunikat o błędzie

  7. Zamknij połączenie z bazą (mysqli_close())