Связываем фронтенд и бэкенд: практическое руководство по PHP, MySQL, JavaScript, HTML5
Основные сценарии взаимодействия клиента и сервера
В современной веб-разработке связка PHP, MySQL, JavaScript и HTML5 обеспечивает полный цикл обработки данных: от интерфейса до хранения. Рассмотрим ключевые подходы к интеграции.
Асинхронная отправка формы через Fetch API с сохранением в MySQL
Как передать данные из формы на сервер без перезагрузки страницы и записать их в базу данных?
Предположим, есть форма обратной связи (HTML5). JavaScript перехватывает событие submit, формирует JSON и отправляет на PHP-скрипт. PHP принимает данные, использует подготовленные выражения (PDO) для вставки в MySQL и возвращает JSON-ответ.
<form id="feedbackForm">
<input type="text" name="name" required>
<input type="email" name="email" required>
<textarea name="message"></textarea>
<button type="submit">Отправить</button>
</form>
<script>
document.getElementById('feedbackForm').addEventListener('submit', async (e) => {
e.preventDefault();
const formData = new FormData(e.target);
const data = Object.fromEntries(formData);
const response = await fetch('save.php', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(data)
});
const result = await response.json();
alert(result.message);
});
</script>
Web php mysql (веб php mysql)
<?php
// save.php
header('Content-Type: application/json');
$input = json_decode(file_get_contents('php://input'), true);
$dsn = 'mysql:host=localhost;dbname=test;charset=utf8';
$pdo = new PDO($dsn, 'user', 'pass', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
$stmt = $pdo->prepare('INSERT INTO feedback (name, email, message) VALUES (:name, :email, :message)');
$stmt->execute([
':name' => $input['name'],
':email' => $input['email'],
':message' => $input['message']
]);
echo json_encode(['success' => true, 'message' => 'Данные сохранены']);
Css javascript php mysql (css javascript php mysql)
Типичные ошибки:
- Ошибка CORS – если фронтенд и бэкенд на разных доменах, PHP должен отправлять заголовок
Access-Control-Allow-Origin. - Некорректный Content-Type – сервер ожидает JSON, а клиент отправляет form-data. Проверить заголовки в fetch.
- SQL-инъекция – избегать конкатенации строк, всегда использовать подготовленные запросы (PDO или MySQLi).
- Неверный формат даты/времени – если в таблице есть поле timestamp, передавать его как строку в формате YYYY-MM-DD HH:MM:SS.
Вариант 1: Традиционный POST с обновлением страницы
Как реализовать сохранение данных с полной перезагрузкой страницы, используя PHP и HTML форму?
Этот подход проще в реализации и подходит для случаев, где асинхронность не требуется. Данные отправляются через стандартный атрибут action формы. PHP обрабатывает запрос, сохраняет в MySQL и перенаправляет пользователя.
<form action="save.php" method="POST">
<input type="text" name="name">
<input type="submit" value="Отправить">
</form>
Html php mysql (html php mysql)
<?php
// save.php
$name = $_POST['name'] ?? '';
// подключение к БД и вставка...
header('Location: success.php');
Html css php mysql (html css php mysql)
Проблема: потеря пользовательского ввода при ошибке валидации. Решение – сохранять данные в сессии или использовать AJAX.
Вариант 2: jQuery.ajax с сервером на PHP
Как использовать библиотеку jQuery для отправки данных и получения ответа без перезагрузки?
Хотя Fetch API и нативный XMLHttpRequest вытесняют jQuery, на многих старых проектах он все еще встречается.
$.ajax({
url: 'save.php',
method: 'POST',
data: { name: $('#name').val(), email: $('#email').val() },
dataType: 'json',
success: function(response) {
alert(response.message);
},
error: function(xhr) {
console.error(xhr.responseText);
}
});
Html css javascript php mysql (html css javascript php mysql)
Ошибка: если PHP возвращает не JSON (например, ошибку синтаксиса), jQuery может выдать parseerror. Рекомендуется всегда устанавливать Content-Type: application/json в PHP.
Вариант 3: Отправка FormData с файлами через Fetch
Как загрузить файл на сервер и сохранить информацию о нем в MySQL?
Для файлов не подходит JSON, используется FormData. PHP обрабатывает $_FILES.
const form = document.getElementById('uploadForm');
form.addEventListener('submit', async (e) => {
e.preventDefault();
const formData = new FormData(form);
const response = await fetch('upload.php', { method: 'POST', body: formData });
const result = await response.text();
console.log(result);
});
Php mysql javascripts (php mysql и javascript)
<?php
// upload.php
$uploadDir = 'uploads/';
$fileName = basename($_FILES['file']['name']);
move_uploaded_file($_FILES['file']['tmp_name'], $uploadDir . $fileName);
// запись имени в БД...
Проблема: превышение лимита upload_max_filesize в php.ini. Решение – увеличить значение или обрабатывать ошибку UPLOAD_ERR_INI_SIZE.
Расширенные примеры с пошаговыми пояснениями
Пример 1: Динамическая загрузка записей из MySQL через AJAX
Создадим страницу, которая отображает список пользователей из базы данных. При нажатии на кнопку «Загрузить» JavaScript получает данные через Fetch и вставляет их в DOM.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Загрузка данных</title>
</head>
<body>
<div id="usersList"></div>
<button id="loadBtn">Загрузить пользователей</button>
<script>
document.getElementById('loadBtn').addEventListener('click', async () => {
const response = await fetch('get_users.php');
const users = await response.json();
const list = document.getElementById('usersList');
list.innerHTML = users.map(u => `<p>${u.name} (${u.email})</p>`).join('');
});
</script>
</body>
</html>
<?php
// get_users.php
header('Content-Type: application/json');
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'user', 'pass');
$stmt = $pdo->query('SELECT name, email FROM users');
echo json_encode($stmt->fetchAll(PDO::FETCH_ASSOC));
Результат (в консоли браузера или на странице):
[{"name":"Иван","email":"ivan@example.com"},{"name":"Петр","email":"petr@example.com"}]
Пояснение: PHP возвращает массив в формате JSON, JavaScript преобразует его и строит HTML. Важно, чтобы в PHP не было лишнего вывода (например, ошибок) - иначе JSON будет поврежден.
Пример 2: Проверка уникальности email через AJAX (валидация на лету)
Пользователь вводит email, и JavaScript отправляет запрос на сервер, чтобы проверить, не занят ли он. Результат показывается под полем ввода.
<input type="email" id="email" name="email">
<span id="emailStatus"></span>
<script>
document.getElementById('email').addEventListener('blur', async (e) => {
const email = e.target.value;
const response = await fetch('check_email.php?email=' + encodeURIComponent(email));
const data = await response.json();
const status = document.getElementById('emailStatus');
if (data.available) {
status.textContent = 'Доступен';
status.style.color = 'green';
} else {
status.textContent = 'Уже используется';
status.style.color = 'red';
}
});
</script>
<?php
// check_email.php
header('Content-Type: application/json');
$email = $_GET['email'] ?? '';
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'user', 'pass');
$stmt = $pdo->prepare('SELECT COUNT(*) FROM users WHERE email = :email');
$stmt->execute([':email' => $email]);
$count = $stmt->fetchColumn();
echo json_encode(['available' => $count == 0]);
Результат (если email 'test@test.com' уже есть):
{"available":false}
Ошибка: если email содержит спецсимволы, нужно использовать encodeURIComponent в JavaScript, иначе PHP может неверно распарсить строку.
Пример 3: Обновление данных в реальном времени с помощью Server-Sent Events (SSE)
Используем EventSource для прослушивания событий от PHP скрипта, который читает новые записи из MySQL каждые несколько секунд.
// frontend.html
<script>
const evtSource = new EventSource('stream.php');
evtSource.onmessage = function(event) {
const data = JSON.parse(event.data);
document.getElementById('messages').innerHTML += `<p>${data.text}</p>`;
};
</script>
<?php
// stream.php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'user', 'pass');
$lastId = 0;
while (true) {
$stmt = $pdo->prepare('SELECT id, text FROM messages WHERE id > :lastId');
$stmt->execute([':lastId' => $lastId]);
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($rows as $row) {
echo "data: " . json_encode($row) . "\n\n";
ob_flush();
flush();
$lastId = $row['id'];
}
sleep(2);
}
Пояснение: SSE проще WebSocket, но работает только в одну сторону - от сервера к клиенту. Для двустороннего обмена нужны WebSocket (через Ratchet или другие библиотеки).
Пример 4: RESTful API на PHP с поддержкой CRUD и авторизацией через токен
Создадим API для управления задачами (tasks). Клиент (JavaScript) отправляет GET, POST, PUT, DELETE запросы с Bearer токеном. PHP проверяет токен и выполняет операции с MySQL.
// api.php – простой роутер
header('Content-Type: application/json');
$token = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
if (!validateToken($token)) {
http_response_code(401);
echo json_encode(['error' => 'Unauthorized']);
exit;
}
$method = $_SERVER['REQUEST_METHOD'];
$input = json_decode(file_get_contents('php://input'), true);
switch ($method) {
case 'GET':
// получить все задачи
break;
case 'POST':
// создать задачу
break;
// ...
}
// Пример JavaScript запроса с токеном
fetch('api.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + localStorage.getItem('token')
},
body: JSON.stringify({title: 'Новая задача'})
});
Ответ (при успехе):
{"id":42, "title":"Новая задача", "completed":false}
Проблемы: необходима защита от CSRF (если токен не используется правильно), а также валидация входных данных. В реальном проекте лучше использовать готовые фреймворки (Laravel, Symfony).