- •Федеральное агенство воздушного транспорта (росавиация)
- •1) Запустить pнp-сценарий для вывода информации о версии pнp- машины.
- •2) Разработать программу и сценарий форума с использованием php кода, встроенного пользователю: в html-код, позволяющую любому
- •3) Разработать программу, содержащую элементы системы формирования заказов через Internet:
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. Окно с просмотром всех заказов.
