Современные способы совместного использования PHP, MySQL и JavaScript

Раздел: PHP -> Веб-разработка

Основные подходы к интеграции PHP, MySQL и JavaScript

Как выполнить асинхронный запрос к PHP скрипту для работы с базой данных с использованием современного Fetch API и PDO?

Для создания динамических веб-приложений часто требуется отправлять запросы на сервер без перезагрузки страницы. Современный подход использует Fetch API на клиенте и PDO (PHP Data Objects) на сервере для безопасной работы с MySQL. Рассмотрим пример получения списка пользователей.

Шаг 1: Создание PHP скрипта get_users.php

<?php
header('Content-Type: application/json');
try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'pass');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $pdo->query('SELECT id, name, email FROM users');
    $users = $stmt->fetchAll(PDO::FETCH_ASSOC);
    echo json_encode(['success' => true, 'data' => $users]);
} catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}
?>

Php function get (функция get в php)

Пояснение: Установка заголовка JSON, подключение к MySQL через PDO с указанием DSN, имени пользователя и пароля. Используется подготовленный запрос (в примере простой). Обработка исключений и возврат ошибки в JSON.

Шаг 2: JavaScript код с Fetch API

fetch('get_users.php')
    .then(response => {
        if (!response.ok) throw new Error('Network response was not ok');
        return response.json();
    })
    .then(data => {
        if (data.success) {
            console.log('Пользователи:', data.data);
            // отображение данных на странице
        } else {
            console.error('Ошибка сервера:', data.message);
        }
    })
    .catch(error => console.error('Fetch error:', error));

Php mysql js (php mysql и javascript)

Пояснение: Отправляем GET запрос, проверяем статус ответа, парсим JSON. В случае успеха обрабатываем данные, иначе выводим ошибку.

Типичные проблемы:

  • CORS: если скрипт расположен на другом домене, нужно настроить заголовки Access-Control-Allow-Origin.
  • Ошибки подключения к БД: неверные учетные данные, недоступность сервера.
  • SQL-инъекции: всегда использовать PDO с подготовленными запросами (в примере мы не передаем параметры, но в реальных приложениях это необходимо).
  • Неверный Content-Type: в PHP нужно обязательно выставить header('Content-Type: application/json').

Как использовать устаревший XMLHttpRequest для асинхронных запросов?

Хотя Fetch API является более современным, XMLHttpRequest все еще поддерживается и может использоваться в старых проектах или для поддержки старых браузеров.

var xhr = new XMLHttpRequest();
xhr.open('GET', 'get_users.php', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onload = function() {
    if (xhr.status === 200) {
        var data = JSON.parse(xhr.responseText);
        // обработка данных
    } else {
        console.error('Ошибка: ' + xhr.statusText);
    }
};
xhr.onerror = function() {
    console.error('Сетевая ошибка');
};
xhr.send();

файл php в html (вставка php в html)

Типичные ошибки: Забыть вызвать send(), неправильная обработка ошибок, проблемы с кросс-доменными запросами.

Как упростить асинхронные запросы с помощью jQuery AJAX?

Библиотека jQuery предоставляет удобные методы, такие как $.ajax, $.get, $.post, которые сокращают объем кода.

$.ajax({
    url: 'get_users.php',
    type: 'GET',
    dataType: 'json',
    success: function(data) {
        if (data.success) {
            console.log('Пользователи:', data.data);
        }
    },
    error: function(xhr, status, error) {
        console.error('Ошибка AJAX:', error);
    }
});

Php главный файл (главный файл php)

Можно также использовать сокращенный метод $.getJSON, если ожидается JSON ответ.

$.getJSON('get_users.php', function(data) {
    if (data.success) {
        console.log(data.data);
    }
});

файл 1 php (файл 1.php)

Проблемы: Зависимость от jQuery, увеличение размера страницы, устаревшие методы в современных проектах.

Как организовать двухстороннюю связь в реальном времени с помощью WebSocket?

Для приложений, требующих постоянного обновления данных (чат, уведомления), подходит WebSocket. На сервере обычно используется расширение Ratchet или библиотека ReactPHP. Но можно также использовать простой сценарий с PHP+WebSocket через библиотеку Textalk/websocket.

Пример клиентского кода:

const socket = new WebSocket('ws://localhost:8080');
socket.onopen = function() {
    console.log('Соединение установлено');
    socket.send(JSON.stringify({type: 'get_users'}));
};
socket.onmessage = function(event) {
    const data = JSON.parse(event.data);
    console.log('Получено:', data);
};
socket.onerror = function(error) {
    console.error('WebSocket ошибка:', error);
};

Php файлы сайта (файлы сайта на php)

Сложности: Требуется поддержка WebSocket на сервере, настройка демона, обработка большого количества соединений, ограничения хостинга.

Как отправлять обновления от сервера клиенту с помощью Server-Sent Events (SSE)?

SSE позволяет серверу отправлять данные клиенту по HTTP-соединению. Это проще WebSocket, но работает только в одну сторону.

PHP скрипт sse.php:

<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
while (true) {
    $time = date('H:i:s');
    echo "data: {\"time\": \"$time\"}\n\n";
    ob_flush();
    flush();
    sleep(1);
}
?>

Клиентский JavaScript:

const eventSource = new EventSource('sse.php');
eventSource.onmessage = function(event) {
    const data = JSON.parse(event.data);
    document.getElementById('time').innerText = data.time;
};

Проблемы: Ограничение на количество одновременных соединений, не все браузеры поддерживают (Edge устаревший), отсутствие поддержки в IE.

Расширенные примеры интеграции PHP, MySQL и JavaScript

Пример 1: Регистрация пользователя с проверкой уникальности email

PHP скрипт register.php

Пример
<?php
header('Content-Type: application/json');
$data = json_decode(file_get_contents('php://input'), true);
$name = $data['name'] ?? '';
$email = $data['email'] ?? '';
$password = password_hash($data['password'] ?? '', PASSWORD_DEFAULT);
try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'pass');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // проверка дубликата email
    $stmt = $pdo->prepare('SELECT id FROM users WHERE email = ?');
    $stmt->execute([$email]);
    if ($stmt->fetch()) {
        echo json_encode(['success' => false, 'message' => 'Email уже зарегистрирован']);
        exit;
    }
    // вставка нового пользователя
    $stmt = $pdo->prepare('INSERT INTO users (name, email, password) VALUES (?, ?, ?)');
    $stmt->execute([$name, $email, $password]);
    echo json_encode(['success' => true, 'message' => 'Регистрация успешна']);
} catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}
?>

JavaScript код (fetch с POST)

Пример
fetch('register.php', {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify({name:'Иван', email:'ivan@example.com', password:'secret'})
})
.then(res => res.json())
.then(data => {
    if (data.success) {
        console.log(data.message); // 'Регистрация успешна'
    } else {
        console.error(data.message); // 'Email уже зарегистрирован'
    }
});

Результат (пример ответа сервера):

{"success":true,"message":"Регистрация успешна"}

Пример 2: Авторизация с использованием сессий

PHP login.php

Пример
<?php
session_start();
header('Content-Type: application/json');
$data = json_decode(file_get_contents('php://input'), true);
$email = $data['email'] ?? '';
$password = $data['password'] ?? '';
try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'pass');
    $stmt = $pdo->prepare('SELECT id, password FROM users WHERE email = ?');
    $stmt->execute([$email]);
    $user = $stmt->fetch();
    if ($user && password_verify($password, $user['password'])) {
        $_SESSION['user_id'] = $user['id'];
        echo json_encode(['success' => true, 'message' => 'Вход выполнен']);
    } else {
        echo json_encode(['success' => false, 'message' => 'Неверные учетные данные']);
    }
} catch (Exception $e) {
    http_response_code(500);
    echo json_encode(['success' => false, 'message' => $e->getMessage()]);
}
?>

JavaScript код

Пример
fetch('login.php', {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify({email:'ivan@example.com', password:'secret'})
})
.then(res => res.json())
.then(data => {
    if (data.success) {
        window.location.href = 'dashboard.php';
    } else {
        alert(data.message);
    }
});

Результат при успехе:

{"success":true,"message":"Вход выполнен"}

Пример 3: Загрузка файла через AJAX с отображением прогресса

PHP upload.php

Пример
<?php
header('Content-Type: application/json');
if ($_FILES['file']['error'] === UPLOAD_ERR_OK) {
    $uploadDir = 'uploads/';
    $filename = uniqid() . '_' . basename($_FILES['file']['name']);
    if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadDir . $filename)) {
        echo json_encode(['success' => true, 'file' => $filename]);
    } else {
        echo json_encode(['success' => false, 'message' => 'Не удалось сохранить файл']);
    }
} else {
    echo json_encode(['success' => false, 'message' => 'Ошибка загрузки']);
}
?>

JavaScript с XMLHttpRequest и отслеживанием прогресса

Пример
const formData = new FormData();
formData.append('file', fileInput.files[0]);
const xhr = new XMLHttpRequest();
xhr.open('POST', 'upload.php', true);
xhr.upload.onprogress = function(e) {
    if (e.lengthComputable) {
        const percent = Math.round((e.loaded / e.total) * 100);
        console.log('Прогресс: ' + percent + '%');
    }
};
xhr.onload = function() {
    const data = JSON.parse(xhr.responseText);
    if (data.success) {
        console.log('Файл загружен:', data.file);
    } else {
        console.error(data.message);
    }
};
xhr.send(formData);

Результат при успехе:

{"success":true,"file":"5f8a3b2c1d0e4_photo.jpg"}

Пример 4: Автодополнение поиска (поиск по названию товара)

PHP search.php

Пример
<?php
header('Content-Type: application/json');
$q = $_GET['q'] ?? '';
if (strlen($q) < 2) {
    echo json_encode([]);
    exit;
}
try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'pass');
    $stmt = $pdo->prepare('SELECT name FROM products WHERE name LIKE ? LIMIT 10');
    $stmt->execute(['%' . $q . '%']);
    $products = $stmt->fetchAll(PDO::FETCH_COLUMN);
    echo json_encode($products);
} catch (Exception $e) {
    http_response_code(500);
    echo json_encode([]);
}
?>

JavaScript debounce и fetch

Пример
let timeout;
document.getElementById('searchInput').addEventListener('input', function() {
    clearTimeout(timeout);
    timeout = setTimeout(() => {
        const q = this.value;
        if (q.length < 2) { document.getElementById('suggestions').innerHTML = ''; return; }
        fetch('search.php?q=' + encodeURIComponent(q))
            .then(res => res.json())
            .then(data => {
                let html = data.map(name => '<div>' + name + '</div>').join('');
                document.getElementById('suggestions').innerHTML = html;
            });
    }, 300);
});

Результат (пример ответа при запросе q=iph)

["iPhone 14","iPhone 13","iPhone SE"]

PHP MySQL и JavaScript - comments

En
Php mysql js (php)