189 lines
6.8 KiB
PHP
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;
|