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
-
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.
- Jeśli nic nie wybrano — tabela ma być pusta.
- Połączenie ma być utworzone przez
mysqli_connect(), zapytanie wysłane funkcjąmysqli_query(), a po zakończeniu pracy połączenie zamknięte.