/
al.anatolyev
/
web4stud
Обзор
Документация
Войти
/
al.anatolyev
/
web4stud
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
workshop/drafts/using-databases.deep.txt
324 строки
16 KB
aag
%1
19 май 2026, 12:36
19 май 2026, 12:36
1775bad
Код
Авторство
О чём код?
Напиши указания к лабораторной работе по Веб-программированию по теме "Использование БД в серверных php-скриптах". Структура лабораторной работы должна быть такой: 1. Цель 2. Задачи 3. Задания для выполнения (нужно учесть, что у всех студентов есть индивидуальные темы, поэтому задания должны быть обобщенными). 4. Указания к работе В работе должны рассматриваться следующие моменты: 4.1. Все примеры в окружении Debian GNU/Linux. 4.2. Подключение к БД: - MySQl/MariaDB через mysqli; - PostgreSQL и SQLite через PDO. 4.3. Создание структуры БД (запросы CREATE) 4.4. Выполнение запросов SELECT (WHERE, ORDER BY). Для выборки использовать данные, полученные из $_GET (санитизация не рассматривается, т.к. будет в другой теме). 4.5. Дополнительно: - использование simplexml для работы с xml-файлами в качестве БД 4.6. Заключение с упоминанием других источников данных (CSV, text/plain, JSON и т.п.) 5. Для иллюстрации возможностей использовать сущность "новость" в таблице news (ID, newsText, newsTimestamp, newsRating). 6. Форма отчета о выполнении лабораторной работы (кр Контрольные вопросы ------------------------------------------ ДИПСИК Ниже приведен подробный текст лабораторной работы, полностью соответствующий вашей структуре и требованиям. --- # Лабораторная работа: Использование БД в серверных php-скриптах ## 1. Цель работы Получить практические навыки подключения и взаимодействия с реляционными базами данных (MySQL/MariaDB, PostgreSQL, SQLite) из PHP-скриптов, а также освоить альтернативный способ хранения данных с использованием XML-файлов. ## 2. Задачи - Научиться подключаться к СУБД из PHP разными расширениями (`mysqli`, `PDO`). - Освоить создание таблиц и выполнение запросов `SELECT`, `INSERT`. - Научиться передавать параметры в SQL-запросы через `$_GET`. - Познакомиться с выборкой данных из XML-файла как с примером нетрадиционного источника данных. ## 3. Задания для выполнения (обобщенные) Каждый студент работает в соответствии со своей индивидуальной темой (например: «Новости технологий», «Спортивные новости», «Музыкальные релизы» и т.п.). Сущность «новость» обязательна, но смысловое наполнение полей может соответствовать теме. **Базовый уровень (обязательный):** 1. Создать базу данных и таблицу `news` с полями: `id`, `newsText`, `newsTimestamp`, `newsRating`. 2. Реализовать PHP-скрипт, который через `mysqli` подключается к MySQL/MariaDB и выводит список новостей, отсортированных по `newsTimestamp` (свежие сверху). 3. Добавить форму с параметром `?min_rating=N`, чтобы выводить только новости с рейтингом больше заданного (`WHERE newsRating > N`). Данные получать из `$_GET`. **Повышенный уровень (вариативная часть по выбору или по заданию преподавателя):** 4. Реализовать скрипт подключения к PostgreSQL через PDO (аналогичный п.2-3). 5. Реализовать скрипт для SQLite (файловая БД) через PDO. 6. Реализовать добавление новой новости через `$_GET` (например, `?add=1&text=...&rating=5`). 7. Реализовать чтение/запись новостей в XML-файл с помощью `simplexml`. ## 4. Указания к работе ### 4.1. Общая информация по окружению Все примеры выполняются в ОС **Debian GNU/Linux** (актуальные версии: 11/12). Предполагается, что установлены пакеты: - `php-cli`, `php-mysql`, `php-pgsql`, `php-sqlite3`, `php-xml` - `mariadb-server` (или `mysql-server`) - `postgresql` - `sqlite3` Проверка установки: ```bash php -v sudo systemctl status mariadb sudo systemctl status postgresql ``` ### 4.2. Подключение к БД #### 4.2.1. MySQL / MariaDB через mysqli ```php <?php $host = 'localhost'; $user = 'student'; $password = 'pass123'; $database = 'news_db'; $conn = new mysqli($host, $user, $password, $database); if ($conn->connect_error) { die("Ошибка подключения: " . $conn->connect_error); } echo "Успешное подключение к MySQL"; $conn->close(); ?> ``` #### 4.2.2. PostgreSQL и SQLite через PDO **PostgreSQL:** ```php <?php $dsn = "pgsql:host=localhost;dbname=news_db;port=5432"; $user = "student"; $password = "pass123"; try { $pdo = new PDO($dsn, $user, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "Успешное подключение к PostgreSQL"; } catch (PDOException $e) { die("Ошибка: " . $e->getMessage()); } ?> ``` **SQLite (файловая БД):** ```php <?php $dsn = "sqlite:" . __DIR__ . "/news.db"; try { $pdo = new PDO($dsn); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "Успешное подключение к SQLite (файл news.db)"; } catch (PDOException $e) { die("Ошибка: " . $e->getMessage()); } ?> ``` ### 4.3. Создание структуры БД (запросы CREATE) Пример для MySQL/MariaDB: ```sql CREATE DATABASE news_db; USE news_db; CREATE TABLE news ( id INT AUTO_INCREMENT PRIMARY KEY, newsText TEXT NOT NULL, newsTimestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, newsRating INT DEFAULT 0 ); -- Добавление тестовых записей INSERT INTO news (newsText, newsRating) VALUES ('Первая новость', 5), ('Важное событие', 8), ('Обычная новость', 3); ``` Для PostgreSQL (автоинкремент через `SERIAL`): ```sql CREATE TABLE news ( id SERIAL PRIMARY KEY, newsText TEXT NOT NULL, newsTimestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, newsRating INT DEFAULT 0 ); ``` Для SQLite (автоинкремент через `AUTOINCREMENT`): ```sql CREATE TABLE news ( id INTEGER PRIMARY KEY AUTOINCREMENT, newsText TEXT NOT NULL, newsTimestamp DATETIME DEFAULT CURRENT_TIMESTAMP, newsRating INTEGER DEFAULT 0 ); ``` Все эти запросы можно выполнить вручную (`mysql -u root -p`, `psql -U student`, `sqlite3 news.db`) или программно через `$conn->multi_query()` / `$pdo->exec()`. ### 4.4. Выполнение запросов SELECT (WHERE, ORDER BY) с данными из $_GET **Пример (mysqli) – файл `list_news.php`:** ```php <?php $conn = new mysqli("localhost", "student", "pass123", "news_db"); if ($conn->connect_error) die("Ошибка: " . $conn->connect_error); $min_rating = isset($_GET['min_rating']) ? (int)$_GET['min_rating'] : 0; $sql = "SELECT id, newsText, newsTimestamp, newsRating FROM news WHERE newsRating > $min_rting ORDE BY newsTimestamp DESC"; $result = $con->query($sql); if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { echo "<p><b>{$row['newsTimestamp']}</b> [рейтинг: {$row['newsRating']}]<br>{$row['newsText']}</p>"; } } else { echo "Новостей с рейтингом > $min_rating нет."; } $conn->close(); ?> ``` Доступ к скрипту: `http://localhost/list_news.php?min_rating=4` > **имечание:** санитизация (очистка) входных данных здесь не рассматривается, так как будет отдельной темой. Однако прямое подставление переменной в SQL (как выше) **опасно** для реальных проектов – позже вы изучите подготовленные выражения (`prepared statements`). **Вариант с PDO (PostgreSQL):** ```php <?php $pdo = new PDO("pgsql:host=localhost;dbname=news_db", "student", "pass123"); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $min_rating = isset($_GET['min_rating']) ? (int)$_GET['min_rating'] : 0; $sql = "SELECT * FROM news WHERE newsRating > :min ORDER BY newsTimestamp DESC"; $stmt = $pdo->prepare($sql); $stmt->execute([':min' => $min_rating]); while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { echo "{$row['newsTimestamp']}: {$row['newsText']} (рейтинг {$row['newsRating']})<br>"; } ?> ``` ### 4.5. Дополнительно: использование SimpleXML для работы с XML-файлами в качестве БД Структура файла `news.xml`: ```xml <?xml version="1.0" encoding="UTF-8"?> <newslist> <news> <id>1</id> <text>Первая новость из XML</text> <timestamp>2025-03-20 12:00:00</timestamp> <rating>4</rating> </news> <news> <id>2</id> <text>Вторая новость</text> <timestamp>2025-03-21 09:30:00</timestamp> <rating>7</rating> </news> </newslist> ``` **Чтение новостей с фильтром по рейтингу:** ```php <?php $xml = simplexml_load_file('news.xml'); $min_rating = isset($_GET['min_rating']) ? (int)$_GET['min_rating'] : 0; $result = []; foreach ($xml->news as $news) { if ((int)$news->rating > $min_rating) { $result[] = $news; } } // Сортировка по timestamp (упрощенно: преобразуем в строки для сравнения) usort($result, function($a, $b) { return strtotime($b->timestamp) - strtotime($a->timestamp); }); foreach ($result as $item) { echo "<p><b>{$item->timestamp}</b> [{$item->rating}]<br>{$item->text}</p>"; } ?> ``` **Добавление новой новости в XML:** ```php <?php if (isset($_GET['add'], $_GET['text'], $_GET['rating'])) { $xml = simplexml_load_file('news.xml'); $new = $xml->addChild('news'); $new->addChild('id', uniqid()); $new->addChild('text', htmlspecialchars($_GET['text'])); $new->addChild('timestamp', date('Y-m-d H:i:s')); $new->addChild('rating', (int)$_GET['rating']); $xml->asXML('news.xml'); echo "Новость добавлена в XML."; } ?> ``` ### 4.6. Заключение по источникам данных В веб-программировании, помимо полноценных СУБД, данные могут храниться в разнообразных форматах: - **CSV** – для табличных данных, импорта/экспорта (функции `fgetcsv()`). - **Текстовые файлы (text/plain)** – для логов или простых записей (`file_get_contents`, `fopen`). - **JSON** – популярный формат обмена, легко читается из PHP (`json_decode`, `json_encode`). - **XML** (рассмотрен выше) – часто используется в интеграциях (например, RSS-ленты). - **NoSQL-базы** (MongoDB, Redis) – но это уже отдельная тема. Выбор источника данных зависит от требований: производительность, структурированность, масштабируемость и необходимость сложных запросов. ## 5. Используемая сущность «новость» (таблица news) | Поле | Тип | Описание | |----------------|--------------|----------------------------------------| | id | INTEGER (PK) | Уникальный идентификатор | | newsText | TEXT | Содержание новости | | newsTimestamp | TIMESTAMP | Дата и время публикации | | newsRating | INTEGER | Рейтинг (от 0 до 10, например) | Все примеры в работе строятся именно на этой таблице. ## 6. Форма отчета о выполнении лабораторной работы (кратко) Отчет должен содержать: 1. **Тема** (индивидуальная по заданию преподавателя). 2. **Листинги** всех созданных PHP-скриптов с комментариями. 3. **Скриншоты**: - Структуры таблицы (команда `DESCRIBE news` или аналог). - Результата работы скрипта `list_news.php` без параметров. - Результата работы с параметром `?min_rating=5`. - (При наличии) скриншот вывода из XML-варианта. 4. **Краткое заключение** (0.5–1 стр.) о том, какой способ подключения/хранения данных показался удобнее и почему. 5. **Ответы на контрольные вопросы** (письменно). ## 7. Контрольные вопросы 1. В чем разница между `mysqli` и `PDO`? Когда какой лучше использовать? 2. Почему в примерах п. 4.4 используется `(int)$_GET['min_rating']`? Что произойдет, если передать строку? 3. Какую проблему безопасности иллюстрирует прямой подстановка переменной в SQL-запрос? Как она решается (кратко, с упоминанием подготовленных выражений)? 4. Что такое DSN в PDO? Приведите примеры для MySQL, PostgreQL, SQLite. 5. В чем отличие `TIMESTAMP` от `DATETIME` в MySQL? 6. Какой метод SimpleXML позволяет сохранить изменения обратно в XML-файл? 7. Перечислите минимум 3 альтернативных способа хранения данных (не реляционные БД) и приведите пример сценария, где каждый из них был бы предпочтительнее. --- *Конец лабораторной работы.*