php mysql crud

PHP – Read, czyli odczytywanie danych z bazy MySQL – ćwiczenia

Żeby lepiej zrozumieć na czym polega odczyt danych z bazy, warto zrealizować kilka ćwiczeń.

Niżej opracowałem więc przykładową bazę, do której można dodać przykładowe rekordy, na bazie których docelowo będzie możliwe zrealizowanie ćwiczeń, które z pewnością pozwolą lepiej zrozumieć element odczytu, danych z bazy MySQL. Zatem zaczynajmy..

Przykładowa baza, potrzebna do realizacji zadań:

CREATE TABLE Klienci (
id_klienta INT AUTO_INCREMENT PRIMARY KEY,
imie VARCHAR(255) NOT NULL,
nazwisko VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL,
telefon VARCHAR(255) NOT NULL
);

CREATE TABLE Kwiaty (
id_kwiatu INT AUTO_INCREMENT PRIMARY KEY,
nazwa VARCHAR(255) NOT NULL,
cena DECIMAL(10, 2) NOT NULL, -- Zakładamy dwie cyfry po przecinku dla ceny
dostepnosc INT NOT NULL
);

CREATE TABLE Zamowienia (
id_zamowienia INT AUTO_INCREMENT PRIMARY KEY,
id_klienta INT NOT NULL,
data_zamowienia DATE NOT NULL,
suma DECIMAL(10, 2) NOT NULL, -- Zakładamy dwie cyfry po przecinku dla sumy
status VARCHAR(255) NOT NULL,
CONSTRAINT fk_klient
FOREIGN KEY (id_klienta)
REFERENCES Klienci (id_klienta)
ON DELETE CASCADE -- Usunięcie klienta powoduje usunięcie jego zamówień
);

Poprawka do zadania:

ALTER TABLE Zamowienia ADD id_kwiatu INT;
ALTER TABLE Zamowienia ADD CONSTRAINT fk_kwiat FOREIGN KEY (id_kwiatu) REFERENCES Kwiaty (id_kwiatu);

Kolejno uzupełnijmy je danymi

INSERT INTO Klienci (imie, nazwisko, email, telefon) VALUES
('Jan', 'Kowalski', 'jan.kowalski@example.com', '123-456-789'),
('Anna', 'Nowak', 'anna.nowak@example.com', '987-654-321'),
('Piotr', 'Zieliński', 'piotr.zielinski@example.com', '456-789-123'),
('Katarzyna', 'Wiśniewska', 'katarzyna.wisniewska@example.com', '321-654-987'),
('Marcin', 'Wójcik', 'marcin.wojcik@example.com', '132-465-798'),
('Joanna', 'Kamińska', 'joanna.kaminska@example.com', '978-321-654'),
('Łukasz', 'Lewandowski', 'lukasz.lewandowski@example.com', '564-987-321'),
('Marta', 'Dąbrowska', 'marta.dabrowska@example.com', '675-123-890'),
('Tomasz', 'Zając', 'tomasz.zajac@example.com', '987-321-456'),
('Ewa', 'Majewska', 'ewa.majewska@example.com', '753-951-852');

INSERT INTO Kwiaty (nazwa, cena, dostepnosc) VALUES
('Róża', 10.50, 100),
('Tulipan', 8.30, 150),
('Kalia', 12.00, 50),
('Gerbera', 6.25, 80),
('Hiacynt', 9.50, 70),
('Krokus', 5.40, 200),
('Narcyz', 7.20, 120),
('Begonia', 13.45, 90),
('Amarylis', 11.00, 60),
('Magnolia', 14.75, 40),
('Dalia', 10.00, 30),
('Frezja', 8.50, 100),
('Irys', 9.00, 110),
('Jaskier', 4.75, 140),
('Lilia', 13.00, 50),
('Orchidea', 20.00, 25),
('Piwonia', 15.75, 35),
('Stokrotka', 3.45, 180),
('Słonecznik', 5.00, 150),
('Zawilec', 7.80, 90);

INSERT INTO Zamowienia (id_klienta, data_zamowienia, suma, status) VALUES
(1, '2023-04-01', 120.00, 'zakończone',1),
(2, '2023-04-03', 85.50, 'w realizacji',1),
(3, '2023-04-03', 67.75, 'nowe',2),
(4, '2023-04-05', 148.20, 'zakończone',3),
(5, '2023-04-05', 99.99, 'nowe'),4,
(6, '2023-04-06', 134.40, 'w realizacji',3),
(7, '2023-04-07', 200.00, 'zakończone',5),
(8, '2023-04-08', 180.30, 'nowe',6),
(9, '2023-04-09', 75.00, 'w realizacji',2),
(10, '2023-04-10', 90.00, 'zakończone',1);

Ok, jak już mamy dane, przejdźmy do naszych zadań

Zadanie 1: Lista wszystkich klientów w HTML:

    • Wyświetl tabelę zawierającą pełną listę klientów. Zapytanie SQL: SELECT * FROM Klienci;
    • W PHP użyj pętli while do iterowania (iteracja -powtarzanie tej samej operacji w pętli) przez wyniki i wyświetlania ich w tabeli HTML.

Rozwiązanie:

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "kwiaciarnia";

// połączenie z bazą
$conn = new mysqli($servername, $username, $password, $dbname);

// sprawdzenie połączenia z bazą
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT * FROM Klienci";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
echo "<table><tr><th>ID</th><th>Imię</th><th>Nazwisko</th><th>Email</th><th>Telefon</th></tr>";
// output data of each row
while($row = $result->fetch_assoc()) {
echo "<tr><td>" . $row["id_klienta"] . "</td><td>" . $row["imie"] . "</td><td>" . $row["nazwisko"] . "</td><td>" . $row["email"] . "</td><td>" . $row["telefon"] . "</td></tr>";
}
echo "</table>";
} else {
echo "0 results";
}
$conn->close();
?>

Zadanie 2: Wyświetlenie wszystkich dostępnych kwiatów w HTML:

    • Stwórz tabelę pokazującą wszystkie kwiaty, które mają dostępność większą niż 0. Zapytanie SQL: SELECT * FROM Kwiaty WHERE dostepnosc > 0;
    • Podobnie jak wyżej, użyj PHP do wygenerowania tabeli.

Rozwiązanie:

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "kwiaciarnia";

$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT * FROM Kwiaty WHERE dostepnosc > 0";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
echo "<table><tr><th>ID Kwiatu</th><th>Nazwa</th><th>Cena</th><th>Dostępność</th></tr>";
while($row = $result->fetch_assoc()) {
echo "<tr><td>" . $row["id_kwiatu"] . "</td><td>" . $row["nazwa"] . "</td><td>" . $row["cena"] . "</td><td>" . $row["dostepnosc"] . "</td></tr>";
}
echo "</table>";
} else {
echo "0 results";
}
$conn->close();
?>

Zadanie 3: Szczegóły zamówienia na podstawie ID zamówienia:

    • Wyświetl pełne informacje o zamówieniu, w tym dane klienta i sumę zamówienia, na podstawie ID zamówienia. Zapytanie SQL: SELECT Zamowienia.*, Klienci.imie, Klienci.nazwisko FROM Zamowienia JOIN Klienci ON Zamowienia.id_klienta = Klienci.id_klienta WHERE id_zamowienia = ?;
    • W PHP użyj metody GET do przekazania ID i wyświetlenia wyników.

Rozwiązanie:

Plik HTML z formularzem, np. wybor-zamowienia.html

<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Wyszukaj Zamówienie</title>
</head>
<body>
<h1>Wyszukaj Szczegóły Zamówienia</h1>
<form action="odczyt-danych-zamowienia.php" method="get">
<!-- Użytkownik wpisuje ID zamówienia, które chce wyszukać -->
<label for="id_zamowienia">Wpisz ID Zamówienia:</label>
<input type="number" id="id_zamowienia" name="id_zamowienia" required>
<button type="submit">Szukaj</button>
</form>
</body>
</html>

Plik docelowy, np. odczyt-danych-zamowienia.php

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "kwiaciarnia";
$id_zamowienia = $_GET['id_zamowienia']; // Przekazanie ID zamówienia przez parametr GET

$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT Zamowienia.*, Klienci.imie, Klienci.nazwisko FROM Zamowienia JOIN Klienci ON Zamowienia.id_klienta = Klienci.id_klienta WHERE id_zamowienia = ?";
$stmt = $conn->prepare($sql);
$stmt->bind_param("i", $id_zamowienia);
$stmt->execute();
$result = $stmt->get_result();

if ($result->num_rows > 0) {
echo "<table><tr><th>ID Zamówienia</th><th>Imię Klienta</th><th>Nazwisko Klienta</th><th>Data Zamówienia</th><th>Suma</th><th>Status</th></tr>";
while($row = $result->fetch_assoc()) {
echo "<tr><td>" . $row["id_zamowienia"] . "</td><td>" . $row["imie"] . "</td><td>" . $row["nazwisko"] . "</td><td>" . $row["data_zamowienia"] . "</td><td>" . $row["suma"] . "</td><td>" . $row["status"] . "</td></tr>";
}
echo "</table>";
} else {
echo "Nie znaleziono zamówienia o takim ID.";
}
$conn->close();
?>

Zadanie 4: Wykaz wszystkich zamówień danego klienta:

    • Na podstawie ID klienta, wyświetl wszystkie jego zamówienia. Zapytanie SQL: SELECT * FROM Zamowienia WHERE id_klienta = ?;
    • PHP powinien pobierać ID klienta, np. przez formularz, i wyświetlać wyniki w formacie tabeli.

Rozwiązanie:

Plik zamowienia-klienta-wybierz.html

<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>Wyszukaj Zamówienia Klienta</title>
</head>
<body>
<h1>Wyszukaj Zamówienia Klienta</h1>
<form action="zamowienia-klient-rezultat.php" method="get">
<!-- Użytkownik wpisuje ID klienta, którego zamówienia chce wyszukać -->
<label for="id_klienta">Wpisz ID Klienta:</label>
<input type="number" id="id_klienta" name="id_klienta" required>
<button type="submit">Szukaj</button>
</form>
</body>
</html>

Plik zamowienia-klient-rezultat.php

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "kwiaciarnia";
$id_klienta = $_GET['id_klienta']; // Przekazanie ID klienta przez parametr GET

$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT * FROM Zamowienia WHERE id_klienta = $id_klienta";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
echo "<table><tr><th>ID Zamówienia</th><th>Data Zamówienia</th><th>Suma</th><th>Status</th></tr>";
while($row = $result->fetch_assoc()) {
echo "<tr><td>" . $row["id_zamowienia"] . "</td><td>" . $row["data_zamowienia"] . "</td><td>" . $row["suma"] . "</td><td>" . $row["status"] . "</td></tr>";
}
echo "</table>";
} else {
echo "Ten klient nie ma żadnych zamówień.";
}
$conn->close();
?>

Zadanie 5: Zestawienie kwiatów i ich łącznej wartości w zamówieniach:

    • Wygeneruj raport pokazujący, które kwiaty i ile razy zostały zamówione, oraz jaka jest łączna wartość zamówionych kwiatów. Zapytanie SQL: SELECT Kwiaty.nazwa, COUNT(Zamowienia.id_zamowienia) AS ilosc_zamowien, SUM(Zamowienia.suma) AS suma FROM Zamowienia JOIN Kwiaty ON Zamowienia.id_kwiatu = Kwiaty.id_kwiatu GROUP BY Kwiaty.nazwa;
    • W PHP agreguj i wyświetlaj dane w tabeli HTML.

Rozwiązanie:

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "kwiaciarnia";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
$sql = "SELECT Kwiaty.nazwa, COUNT(Zamowienia.id_zamowienia) AS ilosc_zamowien, SUM(Zamowienia.suma) AS suma FROM Zamowienia JOIN Kwiaty ON Zamowienia.id_kwiatu = Kwiaty.id_kwiatu GROUP BY Kwiaty.nazwa";
$result = $conn->query($sql);
if ($result === false) {
    die("SQL error: " . $conn->error);
}
if ($result->num_rows > 0) {
    echo "<table><tr><th>Nazwa Kwiatu</th><th>Ilość Zamówień</th><th>Łączna Suma</th></tr>";
    while($row = $result->fetch_assoc()) {
        echo "<tr><td>" . htmlspecialchars($row["nazwa"]) . "</td><td>" . $row["ilosc_zamowien"] . "</td><td>" . $row["suma"] . "</td></tr>";
    }
    echo "</table>";
} else {
    echo "Brak wyników.";
}
$conn->close();
?>

Zadanie 6: Wyświetl wszystkich klientów posortowanych alfabetycznie po nazwisku

Rozwiązanie:

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "kwiaciarnia";

$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT * FROM Klienci ORDER BY nazwisko ASC";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
echo "<table><tr><th>ID</th><th>Imię</th><th>Nazwisko</th><th>Email</th><th>Telefon</th></tr>";
while($row = $result->fetch_assoc()) {
echo "<tr><td>" . $row["id_klienta"] . "</td><td>" . $row["imie"] . "</td><td>" . $row["nazwisko"] . "</td><td>" . $row["email"] . "</td><td>" . $row["telefon"] . "</td></tr>";
}
echo "</table>";
} else {
echo "Nie znaleziono klientów.";
}
$conn->close();
?>

Zadanie 7: Wyświetl wszystkie zamówienia z kwotą powyżej 100zł

Rozwiązanie:

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "kwiaciarnia";

$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT * FROM Zamowienia WHERE suma > 100";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
echo "<table><tr><th>ID Zamówienia</th><th>ID Klienta</th><th>Data Zamówienia</th><th>Suma</th><th>Status</th></tr>";
while($row = $result->fetch_assoc()) {
echo "<tr><td>" . $row["id_zamowienia"] . "</td><td>" . $row["id_klienta"] . "</td><td>" . $row["data_zamowienia"] . "</td><td>" . $row["suma"] . "</td><td>" . $row["status"] . "</td></tr>";
}
echo "</table>";
} else {
echo "Nie znaleziono zamówień o sumie większej niż 100 PLN.";
}
$conn->close();
?>

Zadanie 8. Wyświetl informacje o kwiatach, których nazwa zaczyna się na literę „R”

Rozwiązanie:

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "kwiaciarnia";

$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT * FROM Kwiaty WHERE nazwa LIKE 'R%'";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
echo "<table><tr><th>ID Kwiatu</th><th>Nazwa</th><th>Cena</th><th>Dostępność</th></tr>";
while($row = $result->fetch_assoc()) {
echo "<tr><td>" . $row["id_kwiatu"] . "</td><td>" . $row["nazwa"] . "</td><td>" . $row["cena"] . "</td><td>" . $row["dostepnosc"] . "</td></tr>";
}
echo "</table>";
} else {
echo "Nie znaleziono kwiatów zaczynających się na 'R'.";
}
$conn->close();
?>

Zadanie 9. Wyświetl liczbę zamówień dla każdego klienta

SQL:

SELECT Klienci.id_klienta, Klienci.imie, Klienci.nazwisko, COUNT(Zamowienia.id_zamowienia) AS liczba_zamowien
FROM Klienci
LEFT JOIN Zamowienia ON Klienci.id_klienta = Zamowienia.id_klienta
GROUP BY Klienci.id_klienta;

Rozwiązanie:

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "kwiaciarnia";

$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

$sql = "SELECT Klienci.id_klienta, Klienci.imie, Klienci.nazwisko, COUNT(Zamowienia.id_zamowienia) AS liczba_zamowien FROM Klienci LEFT JOIN Zamowienia ON Klienci.id_klienta = Zamowienia.id_klienta GROUP BY Klienci.id_klienta";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
echo "<table><tr><th>ID Klienta</th><th>Imię</th><th>Nazwisko</th><th>Liczba Zamówień</th></tr>";
while($row = $result->fetch_assoc()) {
echo "<tr><td>" . $row["id_klienta"] . "</td><td>" . $row["imie"] . "</td><td>" . $row["nazwisko"] . "</td><td>" . $row["liczba_zamowien"] . "</td></tr>";
}
echo "</table>";
} else {
echo "Nie znaleziono klientów.";
}
$conn->close();
?>

Zadanie 10. Wyświetl najdroższe zamówienie

SQL

SELECT * FROM Zamowienia ORDER BY suma DESC LIMIT 1;

Rozwiązanie:

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "kwiaciarnia";

$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
die("Connection failed: " . $conn's connect_error);
}

$sql = "SELECT * FROM Zamowienia ORDER BY suma DESC LIMIT 1";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
echo "<table><tr><th>ID Zamówienia</th><th>ID Klienta</th><th>Data Zamówienia</th><th>Suma</th><th>Status</th></tr>";
if($row = $result->fetch_assoc()) {
echo "<tr><td>" . $row["id_zamowienia"] . "</td><td>" . $row["id_klienta"] . "</td><td>" . $row["data_zamowienia"] . "</td><td>" . $row["suma"] . "</td><td>" . $row["status"] . "</td></tr>";
}
echo "</table>";
} else {
echo "Nie znaleziono zamówień.";
}
$conn->close();
?>