Практическая работа

Форма обратной связи с сохранением данных в SQLite

Цель работы

Создать страницу с формой обратной связи.
Данные формы сохраняются в SQLite-базу и выводятся на странице.


Итоговый результат


Структура проекта

feedback/ index.html app.js api.php data/ feedback.sqlite

Папку data создать заранее. Права на запись обязательны.


Описание формы

Поля формы:


Файл index.html

<!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <title>Форма обратной связи</title> <style> body { font-family: Arial, sans-serif; max-width: 600px; margin: 40px auto; } label { display: block; margin-top: 12px; } input, textarea, button { width: 100%; padding: 8px; margin-top: 4px; } .item { border-bottom: 1px solid #ccc; margin-top: 16px; padding-bottom: 8px; } </style> </head> <body> <h1>Обратная связь</h1> <label> Имя <input id="name"> </label> <label> Email <input id="email"> </label> <label> Сообщение <textarea id="message"></textarea> </label> <button onclick="send()">Отправить</button> <h2>Сообщения</h2> <div id="list"></div> <script src="app.js"></script> </body> </html>

Файл app.js

async function send() { const name = document.getElementById('name').value; const email = document.getElementById('email').value; const message = document.getElementById('message').value; await fetch('api.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name, email, message }) }); document.getElementById('name').value = ''; document.getElementById('email').value = ''; document.getElementById('message').value = ''; load(); } async function load() { const res = await fetch('api.php'); const data = await res.json(); const list = document.getElementById('list'); list.innerHTML = ''; data.forEach(item => { const div = document.createElement('div'); div.className = 'item'; div.innerHTML = ` <strong>${item.name}</strong> (${item.email})<br> ${item.message}<br> <small>${item.created_at}</small> `; list.appendChild(div); }); } load();

Файл api.php

<?php header('Content-Type: application/json'); $db = new PDO( 'sqlite:' . __DIR__ . '/data/feedback.sqlite' ); $db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); $db->exec(" CREATE TABLE IF NOT EXISTS feedback ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, email TEXT, message TEXT, created_at TEXT ) "); if ($_SERVER['REQUEST_METHOD'] === 'POST') { $data = json_decode( file_get_contents('php://input'), true ); $stmt = $db->prepare(" INSERT INTO feedback (name, email, message, created_at) VALUES (:name, :email, :message, :created_at) "); $stmt->execute([ ':name' => $data['name'], ':email' => $data['email'], ':message' => $data['message'], ':created_at' => date('Y-m-d H:i:s') ]); echo json_encode(['status' => 'ok']); exit; } $rows = $db->query(" SELECT * FROM feedback ORDER BY id DESC ")->fetchAll(PDO::FETCH_ASSOC); echo json_encode($rows);

Проверка работы

  1. Открыть index.html через поддомен

  2. Заполнить форму

  3. Обновить страницу

  4. Убедиться, что сообщения сохраняются

  5. Проверить наличие файла feedback.sqlite

Открыть исходную публикацию