Связка технологий: работа с HTML, PHP и базой данных MySQL

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

Основные способы интеграции HTML, PHP и MySQL

Как организовать безопасную передачу данных из HTML-формы в базу данных MySQL с помощью PHP?

Оптимальным решением является использование PDO (PHP Data Objects) с подготовленными запросами. Это обеспечивает защиту от SQL-инъекций и упрощает работу с разными базами данных.


// file: index.php
<?php
$host = 'localhost';
$dbname = 'test';
$user = 'root';
$pass = '';
try {
    $pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $user, $pass);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die('Ошибка подключения: ' . $e->getMessage());
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $name = trim($_POST['name']);
    $email = trim($_POST['email']);
    if (empty($name) || empty($email)) {
        $error = 'Заполните все поля!';
    } else {
        $stmt = $pdo->prepare('INSERT INTO users (name, email) VALUES (:name, :email)');
        $stmt->execute(['name' => $name, 'email' => $email]);
        $success = 'Данные сохранены.';
    }
}
?>
    

Типичные ошибки: неверные параметры подключения (хост, имя БД), отсутствие драйвера PDO для MySQL, некорректный синтаксис SQL. Для устранения следует проверить логи ошибок и использовать try-catch.

Как отобразить данные из MySQL в HTML-таблице с помощью простого запроса?

Вариант с использованием mysqli (процедурный стиль) подходит для быстрой реализации. Однако он менее безопасен без экранирования.


<?php
$conn = mysqli_connect('localhost', 'root', '', 'test');
if (!$conn) {
    die('Ошибка: ' . mysqli_connect_error());
}
$result = mysqli_query($conn, 'SELECT id, name, email FROM users');
echo '<table><tr><th>ID</th><th>Имя</th><th>Email</th></tr>';
while ($row = mysqli_fetch_assoc($result)) {
    echo '<tr><td>' . $row['id'] . '</td><td>' . htmlspecialchars($row['name']) . '</td><td>' . htmlspecialchars($row['email']) . '</td></tr>';
}
echo '</table>';
mysqli_close($conn);
?>
    

Проблема: вывод без экранирования может привести к XSS-атакам. Следует экранировать вывод с помощью htmlspecialchars. Также возможна уязвимость SQL-инъекций, если данные вставляются напрямую в запрос.

Как выполнить обновление записи через HTML-форму с использованием AJAX?

Асинхронный запрос позволяет обновлять данные без перезагрузки страницы. Используется fetch API в JavaScript и PHP-скрипт, возвращающий JSON.


// edit.php (обработчик)
<?php
header('Content-Type: application/json');
if ($_SERVER['REQUEST_METHOD'] === 'PUT') {
    parse_str(file_get_contents('php://input'), $_PUT);
    $id = (int)$_PUT['id'];
    $name = trim($_PUT['name']);
    // валидация
    $pdo = new PDO(...);
    $stmt = $pdo->prepare('UPDATE users SET name = :name WHERE id = :id');
    $stmt->execute(['name' => $name, 'id' => $id]);
    echo json_encode(['success' => true]);
}
?>
    

// frontend JS (fetch)
let data = { id: 1, name: 'Новое имя' };
fetch('edit.php', {
    method: 'PUT',
    body: new URLSearchParams(data)
}).then(res => res.json()).then(console.log);
    

Распространённые ошибки: неверный Content-Type для PUT, отсутствие разбора тела запроса, некорректная обработка CORS. Для отладки удобно использовать инструменты разработчика.

Как использовать ORM для упрощения работы с MySQL в PHP?

Библиотеки типа RedBeanPHP или Eloquent позволяют избежать прямого написания SQL. Пример на RedBeanPHP:


require 'rb.php';
R::setup('mysql:host=localhost;dbname=test', 'root', '');
$user = R::dispense('users');
$user->name = 'Иван';
$user->email = 'ivan@example.com';
$id = R::store($user);
echo "Сохранён ID: $id";
$all = R::findAll('users');
foreach ($all as $u) {
    echo $u->name;
}
    

Сложность: требуется установка библиотеки через Composer, возможны конфликты версий. Для небольших проектов ORM может быть избыточной.

Расширенные примеры интеграции

Ниже представлен полный пример CRUD-приложения на одной странице с разделением логики (без шаблонизатора) с использованием PDO и подготовленных запросов.

Пример

<?php
// config.php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'root', '', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);

// actions
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (isset($_POST['add'])) {
        $stmt = $pdo->prepare('INSERT INTO articles (title, content) VALUES (?, ?)');
        $stmt->execute([$_POST['title'], $_POST['content']]);
    } elseif (isset($_POST['delete'])) {
        $stmt = $pdo->prepare('DELETE FROM articles WHERE id = ?');
        $stmt->execute([$_POST['id']]);
    } elseif (isset($_POST['update'])) {
        $stmt = $pdo->prepare('UPDATE articles SET title = ?, content = ? WHERE id = ?');
        $stmt->execute([$_POST['title'], $_POST['content'], $_POST['id']]);
    }
}

$articles = $pdo->query('SELECT * FROM articles')->fetchAll();
?>
<!DOCTYPE html>
<html>
...
</html>

В HTML-части выводится форма добавления и список статей с кнопками редактирования/удаления. Результат:

(вывод браузера: форма, таблица с данными)

Пример AJAX-запроса для проверки уникальности email:

Пример

// check_email.php
$email = $_GET['email'];
$stmt = $pdo->prepare('SELECT COUNT(*) FROM users WHERE email = ?');
$stmt->execute([$email]);
$count = $stmt->fetchColumn();
echo json_encode(['exists' => $count > 0]);
Пример

// frontend
fetch('check_email.php?email=test@test.com')
    .then(r => r.json())
    .then(d => console.log(d.exists));

Результат в консоли: true или false.

Пример использования транзакций для атомарных операций:

Пример

$pdo->beginTransaction();
try {
    $pdo->exec('UPDATE accounts SET balance = balance - 100 WHERE id = 1');
    $pdo->exec('UPDATE accounts SET balance = balance + 100 WHERE id = 2');
    $pdo->commit();
} catch (Exception $e) {
    $pdo->rollBack();
    echo 'Ошибка: ' . $e->getMessage();
}

Пример с пагинацией:

Пример

$page = max(1, (int)($_GET['page'] ?? 1));
$limit = 10;
$offset = ($page - 1) * $limit;
$stmt = $pdo->prepare('SELECT * FROM articles LIMIT :limit OFFSET :offset');
$stmt->bindValue(':limit', $limit, PDO::PARAM_INT);
$stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
$stmt->execute();
$data = $stmt->fetchAll();

Результат: массив записей для текущей страницы.

HTML PHP MySQL - comments

En
Html php mysql (php)