Files
2p_pracownia_programowania_php/Tematy/T60a - praca z bazą danych/index.php
2025-10-08 09:28:54 +02:00

189 lines
6.8 KiB
PHP

<?php
$txtPath = 'pracownicy.txt';
function h(string $v) {
return htmlspecialchars($v, ENT_QUOTES, 'UTF-8');
}
$messages = [];
$rows = [];
$shouldShowData = false;
$db = mysqli_connect('localhost', 'root', '', '3p_1_baza_pracownikow');
if ($db) {
mysqli_set_charset($db, 'utf8mb4');
} else {
$messages[] = 'Błąd połączenia z bazą: ' . h(mysqli_connect_error());
}
$action = $_POST['action'] ?? null;
$sqlCreate = "
CREATE TABLE IF NOT EXISTS pracownicy (
numer_id INT NOT NULL PRIMARY KEY,
nazwisko VARCHAR(100) NOT NULL,
imie VARCHAR(100) NOT NULL,
stanowisko VARCHAR(120) NOT NULL,
dzial VARCHAR(120) NOT NULL,
sekcja VARCHAR(120) NOT NULL
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
";
if ($db) {
if ($action === 'create_table') {
if (mysqli_query($db, $sqlCreate)) {
$messages[] = 'Tabela „pracownicy” utworzona (jeśli nie istniała).';
} else {
$messages[] = 'Błąd tworzenia tabeli: ' . h(mysqli_error($db));
}
} elseif ($action === 'load_data') {
$exists = false;
$check = mysqli_query($db, "SELECT 1 FROM pracownicy LIMIT 1");
if ($check) {
$exists = true;
mysqli_free_result($check);
}
if (!$exists) {
$messages[] = 'Tabela „pracownicy” nie istnieje. Najpierw utwórz ją przyciskiem „Utwórz tabelę”.';
} else {
if (!is_file($txtPath)) {
$messages[] = 'Brak pliku pracownicy.txt w katalogu projektu.';
} else {
if (!mysqli_query($db, "TRUNCATE TABLE pracownicy")) {
$messages[] = 'Nie udało się wyczyścić tabeli: ' . h(mysqli_error($db));
} else {
$stmt = mysqli_prepare(
$db,
"INSERT INTO pracownicy (numer_id, nazwisko, imie, stanowisko, dzial, sekcja) VALUES (?, ?, ?, ?, ?, ?)"
);
if (!$stmt) {
$messages[] = 'Nie udało się przygotować zapytania: ' . h(mysqli_error($db));
} else {
$countOk = 0;
$countErr = 0;
$fh = fopen($txtPath, 'rb');
if ($fh === false) {
$messages[] = 'Nie można otworzyć pliku pracownicy.txt.';
} else {
$first = fgetcsv($fh, 0, ';');
while (($row = fgetcsv($fh, 0, ';')) !== false) {
if (!is_array($row) || count($row) < 6) {
$countErr++;
continue;
}
$id = (int)trim((string)$row[0]);
$nazwisko = trim((string)$row[1]);
$imie = trim((string)$row[2]);
$stanowisko = trim((string)$row[3]);
$dzial = trim((string)$row[4]);
$sekcja = trim((string)$row[5]);
mysqli_stmt_bind_param($stmt, 'isssss', $id, $nazwisko, $imie, $stanowisko, $dzial, $sekcja);
if (!mysqli_stmt_execute($stmt)) {
$countErr++;
} else {
$countOk++;
}
}
fclose($fh);
}
mysqli_stmt_close($stmt);
$messages[] = "Załadowano rekordów: {$countOk}. Błędnych wierszy: {$countErr}.";
}
}
}
}
} elseif ($action === 'show_data') {
$shouldShowData = true;
$res = mysqli_query($db, "SELECT numer_id, nazwisko, imie, stanowisko, dzial, sekcja FROM pracownicy ORDER BY numer_id");
if ($res) {
$rows = mysqli_fetch_all($res, MYSQLI_ASSOC) ?: [];
mysqli_free_result($res);
} else {
$messages[] = 'Nie udało się pobrać danych: ' . h(mysqli_error($db));
}
}
}
$messagesHtml = '';
if ($messages) {
$items = '';
foreach ($messages as $m) {
$items .= '<li>' . h($m) . '</li>';
}
$messagesHtml = '<strong>Komunikaty:</strong><ul style="margin:8px 0 0 18px;">' . $items . '</ul>';
}
$dataHtml = '';
if ($shouldShowData) {
if (!$rows) {
$dataHtml = '<div class="empty">Brak danych do wyświetlenia.</div>';
} else {
$trs = '';
foreach ($rows as $r) {
$trs .= '<tr>'
. '<td>' . (int)$r['numer_id'] . '</td>'
. '<td>' . h($r['nazwisko']) . '</td>'
. '<td>' . h($r['imie']) . '</td>'
. '<td>' . h($r['stanowisko']) . '</td>'
. '<td>' . h($r['dzial']) . '</td>'
. '<td>' . h($r['sekcja']) . '</td>'
. '</tr>';
}
$dataHtml = '<table>'
. '<thead><tr>'
. '<th>ID</th><th>Nazwisko</th><th>Imię</th><th>Stanowisko</th><th>Dział</th><th>Sekcja</th>'
. '</tr></thead>'
. '<tbody>' . $trs . '</tbody>'
. '</table>';
}
}
echo <<<HTML
<!doctype html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<title>T60a - praca z bazą danych</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="style.css" >
</head>
<body>
<header>
<h1>Zadanie T60a</h1>
<h2>Autor: Jakub Grzegorczyk</h2>
</header>
<div class="box">
<p>
Tym razem zadanie jest bardziej złożone. Oto co należy zrobić:
<ul>
<li>Utwórz bazę danych o nazwie 3p_1_baza_pracownikow.</li>
<li>Do zadania dołączony został plik zawierający dane 114 pracowników - dokonaj konwersji tych danych do formaty txt (uzyskaj plik z danymi pracownicy.txt.</li>
<li>Na utworzonej stronie projektu znajduje się przycisk "Utwórz tabelę", który w bazie 3p_1_baza_pracownikow tworzy tabelę pracownicy.</li>
<li>Drugi przycisk "Załaduj dane" dodaje dane z pliku tekstowego pracownicy.txt do tabeli pracownicy.</li>
<li>Trzeci przycisk wyświetla dane z tabeli pracownicy w postaci tabelarycznej.</li>
</ul>
</p>
</div>
<div class="box">
<form method="post">
<div class="actions">
<button type="submit" name="action" value="create_table">Utwórz tabelę</button><br>
<button type="submit" name="action" value="load_data">Załaduj dane z pracownicy.txt</button><br>
<button type="submit" name="action" value="show_data">Pokaż dane</button>
</div>
</form>
</div>
<div class="box">
{$messagesHtml}
{$dataHtml}
</div>
</body>
</html>
HTML;