Организация взаимодействия интерфейса пользователя с базой данных через PHP

Раздел: Веб-разработка -> Интеграция фронтенда и бэкенда

Основные подходы к интеграции фронтенда и бэкенда на PHP и MySQL

Как выполнять запросы к серверу и получать данные без перезагрузки страницы?

Наиболее эффективный способ - использование AJAX-запросов из JavaScript к PHP-скрипту, который обращается к MySQL и возвращает данные в формате JSON. Это позволяет обновлять содержимое страницы динамически.

Пример фронтенд-кода с использованием Fetch API:


// script.js
fetch('api.php?action=list')
  .then(response => response.json())
  .then(data => {
    console.log(data);
    // отрисовка данных
  })
  .catch(err => console.error('Ошибка:', err));

Web php mysql (веб php mysql)

Пример PHP-скрипта (api.php):


<?php
header('Content-Type: application/json; charset=utf-8');
$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
if ($mysqli->connect_error) {
    http_response_code(500);
    echo json_encode(['error' => 'DB connection failed']);
    exit;
}
$result = $mysqli->query('SELECT id, name FROM users');
$users = $result->fetch_all(MYSQLI_ASSOC);
echo json_encode($users);
$mysqli->close();
?>

Css javascript php mysql (css javascript php mysql)

Возможные проблемы:

  • CORS-ошибки, если фронтенд и бэкенд на разных доменах. Решение: установить заголовок Access-Control-Allow-Origin.
  • Некорректная кодировка JSON: убедитесь, что PHP возвращает UTF-8, и MySQL настроен на utf8mb4.
  • Ошибки подключения к БД: проверяйте объект $mysqli->connect_errno и возвращайте соответствующий HTTP-статус.

Как отправить данные HTML-формы на сервер и сохранить их в MySQL?

Традиционный метод - отправка формы методом POST с последующей перезагрузкой страницы. Этот подход прост и подходит для простых сайтов.

HTML-форма:


<form action="save_user.php" method="post">
  <input type="text" name="name" placeholder="Имя" required>
  <input type="email" name="email" placeholder="Email" required>
  <button type="submit">Сохранить</button>
</form>

Html php mysql (html php mysql)

PHP-обработчик save_user.php:


<?php
$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$stmt = $mysqli->prepare('INSERT INTO users (name, email) VALUES (?, ?)');
$stmt->bind_param('ss', $_POST['name'], $_POST['email']);
if ($stmt->execute()) {
    header('Location: success.html');
} else {
    echo 'Ошибка: ' . $stmt->error;
}
$stmt->close();
$mysqli->close();
?>

Html css php mysql (html css php mysql)

Типичные ошибки:

  • SQL-инъекции: всегда используйте подготовленные запросы (prepare/bind_param).
  • Отсутствие валидации на сервере: проверяйте типы данных, длину, обязательность полей.
  • Проблемы с кодировкой: установите SET NAMES utf8mb4 после подключения.

Как загрузить файл на сервер через форму и ссылаться на него в базе данных?

Для загрузки файлов используется форма с атрибутом enctype="multipart/form-data". PHP обрабатывает файл через суперглобальный массив $_FILES.

Форма:


<form action="upload.php" method="post" enctype="multipart/form-data">
  <input type="file" name="avatar" accept="image/*" required>
  <button type="submit">Загрузить</button>
</form>

Html css javascript php mysql (html css javascript php mysql)

PHP-скрипт upload.php:


<?php
$targetDir = 'uploads/';
$fileName = uniqid() . '_' . basename($_FILES['avatar']['name']);
$targetFile = $targetDir . $fileName;
$allowedTypes = ['image/jpeg', 'image/png'];
if (!in_array($_FILES['avatar']['type'], $allowedTypes)) {
    die('Неподдерживаемый тип файла');
}
if ($_FILES['avatar']['size'] > 2 * 1024 * 1024) {
    die('Файл слишком велик');
}
if (move_uploaded_file($_FILES['avatar']['tmp_name'], $targetFile)) {
    $mysqli = new mysqli('localhost', 'user', 'pass', 'test');
    $stmt = $mysqli->prepare('UPDATE users SET avatar = ? WHERE id = ?');
    $stmt->bind_param('si', $targetFile, $_POST['user_id']);
    $stmt->execute();
    echo 'Файл загружен: ' . $targetFile;
} else {
    echo 'Ошибка при загрузке';
}
?>

Php mysql javascripts (php mysql и javascript)

Проблемы:

  • Превышение лимита upload_max_filesize в php.ini - увеличьте значение или предупредите пользователя.
  • Проверка MIME-типа может быть подделана; используйте getimagesize() для изображений.
  • Безопасность: не используйте оригинальное имя файла, генерируйте уникальное.
Как создать простой RESTful API на PHP для взаимодействия с фронтендом?

REST API позволяет клиентам (например, SPA) получать и изменять ресурсы через HTTP методы. В PHP можно реализовать простую маршрутизацию через $_GET['action'] или PATH_INFO.

Типичная структура API:


<?php
header('Content-Type: application/json; charset=utf-8');
$method = $_SERVER['REQUEST_METHOD'];
$action = $_GET['action'] ?? null;
switch ($action) {
    case 'list':
        if ($method === 'GET') {
            // вернуть список пользователей
        }
        break;
    case 'create':
        if ($method === 'POST') {
            // создать нового пользователя
        }
        break;
    default:
        http_response_code(404);
        echo json_encode(['error' => 'Unknown action']);
}
?>

Php mysql javascript html5 (php mysql javascript html5)

Фронтенд может обращаться к API так:


fetch('api.php?action=create', {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify({name: 'Иван', email: 'ivan@example.com'})
})
.then(res => res.json())
.then(data => console.log(data));

Проблемы и их решения:

  • Необработанные исключения БД - используйте try/catch и возвращайте 500.
  • Валидация входных данных - проверяйте наличие всех обязательных полей.
  • Для PUT/DELETE потребуется читать raw-тело запроса: file_get_contents('php://input').
Как организовать двустороннюю связь в реальном времени?

Для веб-приложений с постоянным обновлением данных (чаты, уведомления) подходят WebSocket. На PHP это можно реализовать с помощью библиотеки Ratchet или ReactPHP с расширением WebSocket. Альтернатива - Server-Sent Events (SSE), которые проще в реализации, но работают только в одну сторону (от сервера к клиенту).

Пример SSE на PHP:


<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
while (true) {
    $result = $mysqli->query('SELECT COUNT(*) as cnt FROM messages WHERE seen=0');
    $row = $result->fetch_assoc();
    echo "data: " . json_encode($row) . "\n\n";
    ob_flush(); flush();
    sleep(5);
}
?>

Проблемы:

  • WebSocket требует особых настроек сервера (не все хостинги поддерживают).
  • SSE тайм-ауты по умолчанию - настройте keep-alive.
  • Безопасность: проверяйте подлинность соединения.

Расширенный пример: CRUD приложение с AJAX и PHP MySQL

В этом примере реализованы операции создания, чтения, обновления и удаления записей (users) через асинхронные запросы. Используется один PHP файл api.php, который обрабатывает все действия на основе параметра action и HTTP метода.

Структура базы данных:

Пример

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

PHP api.php - полный код:

Пример

<?php
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    exit(0);
}

$mysqli = new mysqli('localhost', 'root', '', 'test');
$mysqli->set_charset('utf8mb4');

$method = $_SERVER['REQUEST_METHOD'];
$action = $_GET['action'] ?? '';

switch ($action) {
    case 'list':
        if ($method !== 'GET') {
            http_response_code(405);
            echo json_encode(['error' => 'Method not allowed']);
            break;
        }
        $result = $mysqli->query('SELECT id, name, email, created_at FROM users ORDER BY id DESC');
        $users = $result->fetch_all(MYSQLI_ASSOC);
        echo json_encode($users);
        break;

    case 'get':
        if ($method !== 'GET') {
            http_response_code(405);
            break;
        }
        $id = (int)$_GET['id'];
        $stmt = $mysqli->prepare('SELECT id, name, email FROM users WHERE id = ?');
        $stmt->bind_param('i', $id);
        $stmt->execute();
        $result = $stmt->get_result();
        $user = $result->fetch_assoc();
        echo json_encode($user ?: ['error' => 'User not found']);
        break;

    case 'create':
        if ($method !== 'POST') {
            http_response_code(405);
            break;
        }
        $input = json_decode(file_get_contents('php://input'), true);
        $name = $input['name'] ?? '';
        $email = $input['email'] ?? '';
        if (empty($name) || empty($email)) {
            http_response_code(400);
            echo json_encode(['error' => 'Name and email required']);
            break;
        }
        $stmt = $mysqli->prepare('INSERT INTO users (name, email) VALUES (?, ?)');
        $stmt->bind_param('ss', $name, $email);
        if ($stmt->execute()) {
            echo json_encode(['id' => $stmt->insert_id, 'message' => 'User created']);
        } else {
            http_response_code(500);
            echo json_encode(['error' => 'Database error']);
        }
        break;

    case 'update':
        if ($method !== 'PUT') {
            http_response_code(405);
            break;
        }
        $input = json_decode(file_get_contents('php://input'), true);
        $id = (int)$_GET['id'];
        $name = $input['name'] ?? '';
        $email = $input['email'] ?? '';
        $stmt = $mysqli->prepare('UPDATE users SET name = ?, email = ? WHERE id = ?');
        $stmt->bind_param('ssi', $name, $email, $id);
        if ($stmt->execute() && $stmt->affected_rows > 0) {
            echo json_encode(['message' => 'User updated']);
        } else {
            http_response_code(404);
            echo json_encode(['error' => 'User not found or no changes']);
        }
        break;

    case 'delete':
        if ($method !== 'DELETE') {
            http_response_code(405);
            break;
        }
        $id = (int)$_GET['id'];
        $stmt = $mysqli->prepare('DELETE FROM users WHERE id = ?');
        $stmt->bind_param('i', $id);
        if ($stmt->execute() && $stmt->affected_rows > 0) {
            echo json_encode(['message' => 'User deleted']);
        } else {
            http_response_code(404);
            echo json_encode(['error' => 'User not found']);
        }
        break;

    default:
        http_response_code(404);
        echo json_encode(['error' => 'Unknown action']);
}
$mysqli->close();
?>

Фронтенд (HTML + JavaScript):

Пример

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>CRUD Users</title>
</head>
<body>
    <h2>Управление пользователями</h2>
    <div>
        <input type="text" id="name" placeholder="Имя">
        <input type="email" id="email" placeholder="Email">
        <button onclick="createUser()">Добавить</button>
    </div>
    <table border="1">
        <thead><tr><th>ID</th><th>Имя</th><th>Email</th><th>Действия</th></tr></thead>
        <tbody id="userList"></tbody>
    </table>
    <script>
    async function fetchUsers() {
        const res = await fetch('api.php?action=list');
        const data = await res.json();
        const tbody = document.getElementById('userList');
        tbody.innerHTML = '';
        data.forEach(user => {
            const tr = document.createElement('tr');
            tr.innerHTML = `<td>${user.id}</td><td>${user.name}</td><td>${user.email}</td>
                <td><button onclick="deleteUser(${user.id})">Удалить</button></td>`;
            tbody.appendChild(tr);
        });
    }
    async function createUser() {
        const name = document.getElementById('name').value;
        const email = document.getElementById('email').value;
        const res = await fetch('api.php?action=create', {
            method: 'POST',
            headers: {'Content-Type': 'application/json'},
            body: JSON.stringify({name, email})
        });
        const data = await res.json();
        if (data.error) alert(data.error);
        else fetchUsers();
    }
    async function deleteUser(id) {
        const res = await fetch('api.php?action=delete&id=' + id, {method: 'DELETE'});
        const data = await res.json();
        if (data.error) alert(data.error);
        else fetchUsers();
    }
    fetchUsers();
    </script>
</body>
</html>

Примеры ответов JSON от API:

// GET api.php?action=list
[
  {"id":1,"name":"Иван","email":"ivan@example.com","created_at":"2025-03-10 12:00:00"},
  {"id":2,"name":"Мария","email":"maria@test.com","created_at":"2025-03-10 12:05:00"}
]
// POST api.php?action=create  body: {"name":"Петр","email":"peter@mail.ru"}
{"id":3,"message":"User created"}
// DELETE api.php?action=delete&id=3
{"message":"User deleted"}
// GET api.php?action=get&id=99
{"error":"User not found"}

Типичные ошибки при реализации CRUD:

  • Неверное определение метода: например, DELETE передаётся как POST. Проверяйте $_SERVER['REQUEST_METHOD'].
  • Отсутствие проверки входного JSON: используйте json_decode с параметром true, проверяйте на null.
  • SQL-уязвимость: используйте подготовленные запросы, как показано выше.
  • Ошибки CORS: добавьте заголовки в PHP.

Веб PHP MySQL - comments

En
Web php mysql (php)