Połączenie PHP z bazą danych MySQL (mysqli)

Wstęp teoretyczny

W praktyce programowania w PHP często trzeba pobierać, dodawać, usuwać lub wyświetlać dane z bazy danych. Do komunikacji z bazą MySQL służy zestaw funkcji mysqli_ (MySQL Improved).

Dzięki nim można:

  • połączyć się z bazą danych,
  • wysłać zapytanie SQL (np. SELECT, INSERT, UPDATE, DELETE),
  • pobrać i wyświetlić dane,
  • zamknąć połączenie po zakończeniu pracy.

1. Tworzenie bazy danych

Zanim napiszemy skrypt PHP, musimy mieć bazę danych. Poniższy kod SQL utworzy bazę piekarnia z przykładową tabelą produkty.

CREATE DATABASE piekarnia;
USE piekarnia;

CREATE TABLE produkty (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nazwa VARCHAR(50),
    rodzaj VARCHAR(30),
    cena DECIMAL(5,2)
);

INSERT INTO produkty (nazwa, rodzaj, cena) VALUES
('Chleb żytni', 'pieczywo', 5.00),
('Bułka pszenna', 'pieczywo', 1.20),
('Pączek z marmoladą', 'ciasto', 2.50),
('Sernik domowy', 'ciasto', 6.00),
('Bagietka francuska', 'pieczywo', 3.50);

2. Nawiązywanie połączenia z bazą

Podstawowe połączenie z bazą danych za pomocą mysqli_connect():

<?php
$polaczenie = mysqli_connect("localhost", "root", "", "piekarnia");

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

echo "Połączenie udane!";
mysqli_close($polaczenie);
?>

Wyjaśnienie:

  • mysqli_connect() – łączy z serwerem bazy danych,
  • mysqli_connect_error() – zwraca opis błędu, jeśli połączenie się nie powiedzie,
  • mysqli_close() – zamyka połączenie.

3. Wysyłanie zapytań do bazy

Dane pobieramy za pomocą funkcji mysqli_query():

<?php
$polaczenie = mysqli_connect("localhost", "root", "", "piekarnia");

$zapytanie = "SELECT * FROM produkty";
$wynik = mysqli_query($polaczenie, $zapytanie);

while ($wiersz = mysqli_fetch_assoc($wynik)) {
    echo $wiersz['nazwa'] . " - " . $wiersz['cena'] . " zł<br>";
}

mysqli_close($polaczenie);
?>

Wyjaśnienie:

  • mysqli_query() – wysyła zapytanie do bazy,
  • mysqli_fetch_assoc() – pobiera kolejne wiersze wyników jako tablicę asocjacyjną,
  • $wiersz['nazwa'] – odwołanie do konkretnej kolumny w wierszu.

4. Wykorzystanie pętli do wyświetlania danych

Pętla while lub foreach pozwala wyświetlać dane dynamicznie — np. w tabeli HTML:

<?php
echo "<table border='1'>";
echo "
<tr><th>Nazwa</th>
<th>Rodzaj</th>
<th>Cena</th></tr>";

while ($row = mysqli_fetch_assoc($wynik)) {
    echo "
<tr>";
    echo "
<td>" . $row['nazwa'] . "</td>";
    echo "
<td>" . $row['rodzaj'] . "</td>";
    echo "
<td>" . $row['cena'] . " zł</td>";
    echo "</tr>";
}

echo "</table>";
?>

5. Pobieranie danych z formularza

Dane przesłane z formularza (np. wybrany rodzaj produktu) można odczytać w PHP:

<?php
$rodzaj = $_POST['rodzaj'];
$zapytanie = "SELECT * FROM produkty WHERE rodzaj='$rodzaj'";
?>

Pamiętaj o zabezpieczeniu danych — np. przed pustym polem lub wstrzyknięciem SQL.


6. Zabezpieczenia

  • Puste pola:

    if (empty($_POST['rodzaj'])) {
        echo "Nie wybrano rodzaju!";
    }
  • Filtrowanie danych:

    $rodzaj = filter_var($_POST['rodzaj'], FILTER_SANITIZE_STRING);

Ćwiczenia praktyczne

Ćwiczenie 1

Połącz się z bazą danych piekarnia i wyświetl komunikat „Połączenie działa”, jeśli wszystko jest poprawnie skonfigurowane.


Ćwiczenie 2

Napisz skrypt, który pobiera wszystkie produkty z tabeli produkty i wyświetla ich nazwy w zwykłej liście nienumerowanej HTML.


Ćwiczenie 3

Zmien skrypt tak, aby wyświetlał tylko nazwę i cenę produktów, a cena była pogrubiona.


Ćwiczenie 4

Dodaj do strony formularz z listą rozwijaną zawierającą dostępne rodzaje produktów (np. pieczywo, ciasto). Po wybraniu rodzaju — wyświetl tylko produkty z tej kategorii. Zabezpiecz dane za pomocą filter_var().


Ćwiczenie 5

Dodaj do formularza checkboxy pozwalające zaznaczyć kilka rodzajów jednocześnie. Skrypt ma pobierać wartości zaznaczone przez użytkownika i wyświetlać wszystkie produkty spełniające którykolwiek z warunków.


Ćwiczenie 6

  1. Stwórz stronę z formularzem, który:

    • pobiera wartość pola Rodzaj z listy rozwijanej która zawiera unikalne wartości z kolumny rodzaj,
    • po wysłaniu pokazuje w tabeli nazwy i ceny produktów tylko tego rodzaju.
  2. Jeśli nic nie wybrano — tabela ma być pusta.
  3. Połączenie ma być utworzone przez mysqli_connect(), zapytanie wysłane funkcją mysqli_query(), a po zakończeniu pracy połączenie zamknięte.