Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчет лаба 2 Магальник интернет технологии.docx
Скачиваний:
0
Добавлен:
12.02.2026
Размер:
642.65 Кб
Скачать

3) Разработать программу, содержащую элементы системы формирования заказов через Internet:

  • включить проверку корректности адреса электронной почты,

  • заказ отправляется в виде текста, с возможностью проверки и дополнения;

  • заказ передается на сервер в базу данных последовательно;

  • если по каким-либо причинам заказ оказался незавершенным, по истечении определенного промежутка времени заказ аннулируется;

  • оперативные данные о покупателях хранить в текстовом файле list.txt,

  • завершенные заказы заносить в файл order.txt;

  • каждый клиент связан со своей сессией, каждая сессия, соответственно, содержит информацию о поведении своего клиента.

Управляющие файлы index.php, look.php, send.php разместить в папке zakaz.

Ход работы.

1)

Рис. 1. Содержимое папки lab2, в которой лежат необходимые для работы форума файлы.

Листинг 1. Файл equation.php для решения квадратного уравнения.

<!DOCTYPE html>

<html>

<head>

<title>Решение квадратного уравнения</title>

<style>

body { font-family: Arial, sans-serif; margin: 20px; }

.form-group { margin: 10px 0; }

input[type="number"], button { padding: 5px; margin-right: 10px; }

</style>

</head>

<body>

<h2>Решение уравнения ax² + bx + c = 0</h2>

<form method="POST">

<div class="form-group">

a: <input type="number" name="a" step="0.01" required>

b: <input type="number" name="b" step="0.01" required>

c: <input type="number" name="c" step="0.01" required>

</div>

<button type="submit" name="action" value="solve">Решить</button>

<button type="submit" name="action" value="clear">Очистить</button>

</form>

<?php

if ($_SERVER['REQUEST_METHOD'] == 'POST') {

if ($_POST['action'] == 'solve') {

$a = floatval($_POST['a']);

$b = floatval($_POST['b']);

$c = floatval($_POST['c']);

if ($a == 0) {

echo "<p><strong>Ошибка:</strong> a не может быть равно 0 (это не квадратное уравнение).</p>";

} else {

$discriminant = $b * $b - 4 * $a * $c;

if ($discriminant > 0) {

$x1 = (-$b + sqrt($discriminant)) / (2 * $a);

$x2 = (-$b - sqrt($discriminant)) / (2 * $a);

echo "<p><strong>Корни уравнения:</strong> x₁ = " . number_format($x1, 3) . ", x₂ = " . number_format($x2, 3) . "</p>";

} elseif ($discriminant == 0) {

$x = -$b / (2 * $a);

echo "<p><strong>Единственный корень:</strong> x = " . number_format($x, 3) . "</p>";

} else {

echo "<p><strong>Нет действительных корней.</strong></p>";

}

}

} elseif ($_POST['action'] == 'clear') {

// Очистка — перезагрузка страницы

header("Location: " . $_SERVER['PHP_SELF']);

exit;

}

}

?>

</body>

</html>

Демонстрация работы программы.

Рис. 2. Результат работы программы.

Листинг 2. Файл user_input.php для сохранения пользовательских данных.

<!DOCTYPE html>

<html>

<head>

<title>Ввод данных пользователя</title>

<style>

body { font-family: Arial, sans-serif; margin: 20px; }

label { display: block; margin: 10px 0 5px; }

input[type="text"], textarea, select { width: 300px; padding: 5px; }

button { padding: 8px 15px; margin-top: 10px; }

</style>

</head>

<body>

<h2>Форма ввода данных</h2>

<form method="POST">

<label>Имя пользователя: <input type="text" name="username" required></label>

<label>e-mail: <input type="email" name="email" required></label>

<label>Комментарий: <textarea name="comment" rows="4"></textarea></label>

<label>Выберите ваш любимый цвет:</label>

<select name="color">

<option value="red">Красный</option>

<option value="blue">Синий</option>

<option value="green">Зелёный</option>

<option value="black">Чёрный</option>

</select>

<label>Какие языки программирования вы знаете?</label>

<div>

<input type="checkbox" name="languages[]" value="PHP"> PHP<br>

<input type="checkbox" name="languages[]" value="Python"> Python<br>

<input type="checkbox" name="languages[]" value="JavaScript"> JavaScript<br>

<input type="checkbox" name="languages[]" value="Java"> Java<br>

</div>

<button type="submit" name="submit">Отправить</button>

</form>

<?php

if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['submit'])) {

$username = htmlspecialchars($_POST['username'] ?? '');

$email = htmlspecialchars($_POST['email'] ?? '');

$comment = htmlspecialchars($_POST['comment'] ?? '');

$color = $_POST['color'] ?? 'red'; // значение по умолчанию

$languages = $_POST['languages'] ?? [];

echo "<hr><h3>Ваши данные:</h3>";

echo "<p><strong>Имя:</strong> $username</p>";

echo "<p><strong>Email:</strong> $email</p>";

echo "<p><strong>Комментарий:</strong> " . nl2br($comment) . "</p>";

echo "<p><strong>Любимый цвет:</strong> $color</p>";

if (!empty($languages)) {

echo "<p><strong>Языки программирования:</strong> " . implode(", ", $languages) . "</p>";

} else {

echo "<p><strong>Языки программирования:</strong> Не выбраны (значение по умолчанию: не указано)</p>";

}

}

?>

</body>

</html>

Демонстрация работы программы.

Рис. 3. Форма для заполнения данных.

Рис. 4. Результат заполнения формы.

Листинг 3. Файл index.php Конференция.

<!DOCTYPE html>

<html>

<head>

<title>Конференция</title>

<style>

table { border-collapse: collapse; width: 100%; }

th, td { border: 1px solid #ccc; padding: 8px; text-align: left; }

th { background-color: #f2f2f2; }

form { margin: 20px 0; }

</style>

</head>

<body>

<h2>Конференция: Обсуждение темы</h2>

<?php

$themeFile = 'tema.txt';

$theme = file_exists($themeFile) ? file_get_contents($themeFile) : "Тема не задана.";

echo "<h3>Текущая тема: " . htmlspecialchars($theme) . "</h3>";

// Показать сообщения

$topicNumber = 1; // Условно, пусть тема №1

$messagesFile = "m{$topicNumber}.txt";

if (file_exists($messagesFile)) {

$messages = file($messagesFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

echo "<h3>Сообщения по теме №{$topicNumber}:</h3>";

echo "<table>";

echo "<tr><th>Автор</th><th>Дата</th><th>Сообщение</th></tr>";

foreach ($messages as $msg) {

$parts = explode('|', $msg, 3);

if (count($parts) >= 3) {

$author = htmlspecialchars($parts[0]);

$date = htmlspecialchars($parts[1]);

$text = htmlspecialchars($parts[2]);

echo "<tr><td>$author</td><td>$date</td><td>$text</td></tr>";

}

}

echo "</table>";

} else {

echo "<p>Сообщений пока нет.</p>";

}

// Форма для добавления сообщения

?>

<h3>Оставить свое мнение:</h3>

<form method="POST" action="add.php">

<label>Имя: <input type="text" name="name" required></label><br>

<label>Сообщение: <textarea name="message" rows="4" required></textarea></label><br>

<input type="hidden" name="topic" value="<?php echo $topicNumber; ?>">

<button type="submit">Отправить</button>

</form>

</body>

</html>

Демонстрация работы программы.

Рис. 5. Форма для добавления сообщений.

Рис. 6. Оповещение о том, что сообщение было сохранено.

Рис. 7. Обсуждение после добавления нового сообщения.

2)

Рис. 8. Содержимое папки forum, необходимое для корректной работы форума.

Рис. 9. Содержимое папки data, в которой сохраняются все данные с форума.

Листинг 4. Файл index.php Форум.

<?php

// Обработка ошибок

$error = '';

if (isset($_GET['error'])) {

switch ($_GET['error']) {

case 'empty_topic': $error = 'Название темы не может быть пустым'; break;

case 'empty_message': $error = 'Сообщение не может быть пустым'; break;

case 'empty_name': $error = 'Имя пользователя не может быть пустым'; break;

case 'empty_email': $error = 'Email не может быть пустым'; break;

case 'invalid_email': $error = 'Введите корректный email'; break;

case 'empty_all': $error = 'Заполните все обязательные поля'; break;

}

}

?>

<!DOCTYPE html>

<html lang="ru">

<head>

<meta charset="UTF-8">

<title>Форум</title>

<style>

body { font-family: Arial, sans-serif; margin: 20px; }

.error { color: red; margin: 10px 0; padding: 10px; border: 1px solid red; }

.container { max-width: 800px; margin: 0 auto; }

.form-group { margin: 15px 0; }

label { display: block; margin-bottom: 5px; font-weight: bold; }

.required:after { content: " *"; color: red; }

input[type="text"], input[type="email"], textarea, select {

width: 100%; padding: 8px; border: 1px solid #ddd; border-radius: 4px;

box-sizing: border-box;

}

textarea { height: 100px; }

.user-info { display: flex; gap: 15px; }

.user-info .form-group { flex: 1; }

.btn { background: #007cba; color: white; padding: 10px 20px; border: none; border-radius: 4px; cursor: pointer; }

.btn:hover { background: #005a87; }

.back-btn { background: #6c757d; margin-left: 10px; }

.back-btn:hover { background: #545b62; }

.forum-section { border: 1px solid #ddd; padding: 20px; margin: 20px 0; border-radius: 5px; }

</style>

</head>

<body>

<div class="container">

<h1>Форум</h1>

<?php if ($error): ?>

<div class="error">

<strong>Ошибка:</strong> <?php echo $error; ?>

<br><br>

<button class="btn back-btn" onclick="history.back()">Назад</button>

</div>

<?php endif; ?>

<div class="forum-section">

<h2>Просмотр тем</h2>

<form action="look.php" method="post">

<div class="form-group">

<label for="topic">Выберите тему для просмотра:</label>

<?php

// Чтение списка тем

$topics = [];

if (file_exists('tems.txt')) {

$topics = file('tems.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

}

$topicCount = count($topics);

$selectHeight = min($topicCount, 5);

?>

<select name="topic" id="topic" size="<?php echo $selectHeight; ?>" style="height: <?php echo $selectHeight * 40; ?>px; overflow-y: auto;">

<?php foreach ($topics as $index => $topic): ?>

<option value="<?php echo $index + 1; ?>"><?php echo htmlspecialchars($topic); ?></option>

<?php endforeach; ?>

<?php if (empty($topics)): ?>

<option value="">Нет доступных тем</option>

<?php endif; ?>

</select>

</div>

<button type="submit" class="btn">Просмотреть тему</button>

</form>

</div>

<div class="forum-section">

<h2>Создать новую тему</h2>

<form action="add.php" method="post">

<div class="form-group">

<label for="new_topic" class="required">Название темы:</label>

<input type="text" id="new_topic" name="new_topic" required>

</div>

<div class="user-info">

<div class="form-group">

<label for="user_name" class="required">Ваше имя:</label>

<input type="text" id="user_name" name="user_name" required>

</div>

<div class="form-group">

<label for="user_email" class="required">Ваш email:</label>

<input type="email" id="user_email" name="user_email" required>

</div>

</div>

<div class="form-group">

<label for="message" class="required">Сообщение:</label>

<textarea id="message" name="message" required></textarea>

</div>

<input type="hidden" name="action" value="new_topic">

<button type="submit" class="btn">Отправить в форум</button>

</form>

</div>

<div class="forum-section">

<h2>Добавить сообщение в существующую тему</h2>

<form action="add.php" method="post">

<div class="form-group">

<label for="existing_topic" class="required">Выберите тему:</label>

<select name="existing_topic" id="existing_topic" required>

<option value="">-- Выберите тему --</option>

<?php foreach ($topics as $index => $topic): ?>

<option value="<?php echo $index + 1; ?>"><?php echo htmlspecialchars($topic); ?></option>

<?php endforeach; ?>

<?php if (empty($topics)): ?>

<option value="">Нет доступных тем</option>

<?php endif; ?>

</select>

</div>

<div class="user-info">

<div class="form-group">

<label for="reply_user_name" class="required">Ваше имя:</label>

<input type="text" id="reply_user_name" name="user_name" required>

</div>

<div class="form-group">

<label for="reply_user_email" class="required">Ваш email:</label>

<input type="email" id="reply_user_email" name="user_email" required>

</div>

</div>

<div class="form-group">

<label for="reply_message" class="required">Сообщение:</label>

<textarea id="reply_message" name="reply_message" required></textarea>

</div>

<input type="hidden" name="action" value="reply">

<button type="submit" class="btn">Отправить в форум</button>

</form>

</div>

</div>

</body>

</html>

Демонстрация работы программы.

Рис. 10. Начальное окно форума.

Рис. 11. Продолжение начального окна форума.

Листинг 5. Файл look.php для просмотра сообщений с Форума.

<?php

// Проверка выбранной темы

if (!isset($_POST['topic']) || empty($_POST['topic'])) {

header('Location: index.php?error=empty_topic');

exit;

}

$topicId = (int)$_POST['topic'];

// Чтение списка тем

$topics = [];

if (file_exists('tems.txt')) {

$topics = file('tems.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

}

// Проверка существования темы

if (!isset($topics[$topicId - 1])) {

header('Location: index.php?error=empty_topic');

exit;

}

$topicName = $topics[$topicId - 1];

// Чтение сообщений

$messages = [];

$messagesFile = "nn{$topicId}.txt";

if (file_exists($messagesFile)) {

$messages = file($messagesFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

}

// Функция для форматирования сообщения

function formatMessage($messageLine) {

$parts = explode('|', $messageLine);

if (count($parts) >= 4) {

return [

'name' => $parts[0],

'email' => $parts[1],

'timestamp' => $parts[2],

'message' => $parts[3]

];

}

return null;

}

?>

<!DOCTYPE html>

<html lang="ru">

<head>

<meta charset="UTF-8">

<title>Тема: <?php echo htmlspecialchars($topicName); ?></title>

<style>

body { font-family: Arial, sans-serif; margin: 20px; }

.container { max-width: 800px; margin: 0 auto; }

.message {

border: 1px solid #ddd;

padding: 15px;

margin: 10px 0;

border-radius: 5px;

background: #f9f9f9;

}

.message-header {

border-bottom: 1px solid #eee;

padding-bottom: 10px;

margin-bottom: 10px;

display: flex;

justify-content: space-between;

align-items: center;

}

.user-name { font-weight: bold; color: #007cba; }

.user-email { color: #666; font-size: 0.9em; }

.message-time { color: #888; font-size: 0.8em; }

.message-text { line-height: 1.5; }

.back-btn {

background: #6c757d;

color: white;

padding: 10px 20px;

border: none;

border-radius: 4px;

cursor: pointer;

text-decoration: none;

display: inline-block;

}

.back-btn:hover { background: #545b62; }

.topic-header {

background: #f8f9fa;

padding: 20px;

border-radius: 5px;

margin-bottom: 20px;

}

.no-messages {

text-align: center;

color: #666;

padding: 40px;

font-style: italic;

}

</style>

</head>

<body>

<div class="container">

<div class="topic-header">

<h1><?php echo htmlspecialchars($topicName); ?></h1>

<p>Всего сообщений: <?php echo count($messages); ?></p>

</div>

<?php if (empty($messages)): ?>

<div class="no-messages">

В этой теме пока нет сообщений. Будьте первым, кто оставит сообщение!

</div>

<?php else: ?>

<?php foreach ($messages as $index => $messageLine):

$messageData = formatMessage($messageLine);

if ($messageData): ?>

<div class="message">

<div class="message-header">

<div>

<span class="user-name"><?php echo htmlspecialchars($messageData['name']); ?></span>

<span class="user-email">(<?php echo htmlspecialchars($messageData['email']); ?>)</span>

</div>

<div class="message-time">

Сообщение #<?php echo $index + 1; ?> • <?php echo htmlspecialchars($messageData['timestamp']); ?>

</div>

</div>

<div class="message-text">

<?php echo nl2br(htmlspecialchars($messageData['message'])); ?>

</div>

</div>

<?php endif; ?>

<?php endforeach; ?>

<?php endif; ?>

<br>

<a href="index.php" class="back-btn">Вернуться к форуму</a>

</div>

</body>

</html>

Демонстрация работы программы.

Рис. 13. Окно для просмотра сообщений из разных тем на Форуме.

3)

Рис. 13. Содержимое папки zakaz, необходимое для корректной работы Заказов.

Листинг 6. Файл index.php

<?php

session_start(); // Для привязки клиента к сессии

// Инициализация сессии, если ещё не создана

if (!isset($_SESSION['client_id'])) {

$_SESSION['client_id'] = uniqid('client_');

$_SESSION['orders'] = []; // Хранение истории заказов текущей сессии

}

// Обработка формы отправки заказа

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['send_order'])) {

$email = trim($_POST['email']);

$orderText = trim($_POST['order_text']);

// Проверка email

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {

$error = "Некорректный адрес электронной почты.";

} elseif (empty($orderText)) {

$error = "Заказ не может быть пустым.";

} else {

// Генерируем ID заказа

$orderId = uniqid('order_');

// Время истечения (например, 5 минут)

$expireTime = time() + 300; // 5 минут

// Сохраняем заказ в сессию

$_SESSION['orders'][$orderId] = [

'email' => $email,

'text' => $orderText,

'time' => time(),

'expire' => $expireTime,

'status' => 'pending'

];

// Сохраняем оперативные данные о клиенте

$clientData = $_SESSION['client_id'] . " | " . $email . " | " . date('Y-m-d H:i:s') . "\n";

file_put_contents('list.txt', $clientData, FILE_APPEND);

// Перенаправляем на страницу подтверждения

header("Location: send.php?order_id=" . $orderId);

exit();

}

}

?>

<!DOCTYPE html>

<html lang="ru">

<head>

<meta charset="UTF-8">

<title>Оформить заказ</title>

</head>

<body>

<h2>Оформить заказ</h2>

<?php if (isset($error)): ?>

<p style="color: red;"><?= htmlspecialchars($error) ?></p>

<a href="index.php">« Назад</a>

<?php else: ?>

<form method="POST">

<label for="email">Email:</label><br>

<input type="email" name="email" id="email" required style="width: 300px;"><br><br>

<label for="order_text">Текст заказа:</label><br>

<textarea name="order_text" id="order_text" rows="5" cols="60" required placeholder="Опишите ваш заказ..."></textarea><br><br>

<input type="submit" name="send_order" value="Отправить заказ">

</form>

<?php endif; ?>

<hr>

<a href="look.php">Просмотреть историю заказов</a>

</body>

</html>

Демонстрация работы программы.

Рис. 14. Форма для добавления нового заказа.

Рис. 15. Окно с сохраненным заказом.

Листинг 7. Файл look.php для просмотра заказов.

<?php

session_start();

// Показываем историю заказов текущей сессии

$orders = $_SESSION['orders'] ?? [];

echo "<h2>История ваших заказов (в этой сессии)</h2>";

if (empty($orders)) {

echo "<p>У вас пока нет заказов.</p>";

} else {

echo "<ul>";

foreach ($orders as $id => $order) {

$status = $order['status'];

$time = date('Y-m-d H:i:s', $order['time']);

echo "<li><strong>Заказ №{$id}</strong> ({$time}) — статус: {$status}<br>";

echo "Email: " . htmlspecialchars($order['email']) . "<br>";

echo "Текст: " . nl2br(htmlspecialchars($order['text'])) . "</li><br>";

}

echo "</ul>";

}

echo '<hr>';

echo '<a href="index.php">Оформить новый заказ</a>';

?>

Демонстрация работы программы.

Рис. 16. Окно с просмотром всех заказов.