Как передать переменные из JavaScript в PHP

Раздел: Веб-разработка (Frontend и Backend) -> Передача переменных

Передача переменных из JavaScript в PHP: методы и примеры

Как асинхронно передать данные из JavaScript в PHP без перезагрузки страницы?

Наиболее эффективный и современный способ - использование функции fetch (API Fetch). Этот метод позволяет отправлять HTTP-запросы (GET или POST) и получать ответ от сервера, не прерывая работу пользователя. Он основан на промисах и работает асинхронно.


// JavaScript (клиентская часть)
let userData = {
  name: "Иван",
  age: 30
};

fetch('process.php', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json;charset=utf-8'
  },
  body: JSON.stringify(userData)
})
.then(response => response.json())
.then(data => {
  console.log('Ответ от PHP:', data);
})
.catch(error => console.error('Ошибка:', error));
  

Javascript переменные php (передача переменных из javascript в php)


<?php // process.php (серверная часть)
$input = json_decode(file_get_contents('php://input'), true);
if ($input) {
    $name = $input['name'];
    $age = $input['age'];
    // обработка данных
    $response = ['status' => 'success', 'message' => 'Принято: ' . $name . ', ' . $age];
} else {
    $response = ['status' => 'error', 'message' => 'Некорректные данные'];
}
header('Content-Type: application/json');
echo json_encode($response);
?>
  

Пояснение: данные преобразуются в JSON на стороне JavaScript, отправляются POST-запросом. PHP получает их через поток php://input, декодирует и обрабатывает. Ответ возвращается в формате JSON.

Типичная ошибка: забыть установить заголовок Content-Type на сервере или клиенте. Тогда PHP может не распознать данные. Решение: всегда указывать 'Content-Type: application/json' в fetch и header('Content-Type: application/json') в PHP. Также стоит проверять, что данные не пустые через json_last_error().

Проблема: CORS при запросах на другой домен. Решение: настроить сервер, добавив заголовок Access-Control-Allow-Origin.

Как передать переменные из JavaScript в PHP через URL (GET-запрос)?

Этот вариант подходит для небольших данных, которые не должны быть скрыты (например, идентификаторы, поисковые запросы). Данные добавляются к URL как параметры строки запроса.


// JavaScript
let search = "JavaScript";
let url = "search.php?q=" + encodeURIComponent(search);
window.location.href = url; // переход на новую страницу
  

<?php // search.php
$query = $_GET['q'] ?? '';
echo "Вы искали: " . htmlspecialchars($query);
?>
  

Ошибка: незакодированные специальные символы в параметрах (пробелы, &). Решение: использовать encodeURIComponent() на стороне JS. На сервере - htmlspecialchars() для безопасного вывода.

Как передать данные из JavaScript в PHP через отправку формы (submit)?

Если данные уже собраны в форме, можно программно заполнить поля и отправить форму стандартным способом (с перезагрузкой страницы) или через FormData с fetch.


<form id="myForm" action="form_handler.php" method="POST">
  <input type="hidden" name="userId" id="userId">
  <button type="submit">Отправить</button>
</form>
<script>
document.getElementById('userId').value = getUserDynamicId(); // присвоить значение
</script>
  

<?php // form_handler.php
$userId = $_POST['userId'] ?? null;
// обработка
?>
  

Более гибкий вариант - отправка данных через FormData и fetch без перезагрузки:


let form = document.getElementById('myForm');
let formData = new FormData(form);
formData.append('additional', 'extra');
fetch('form_handler.php', {
  method: 'POST',
  body: formData
})
.then(response => response.text())
.then(console.log);
  

Ошибка: неверный тип кодировки - если данные содержат файлы, необходимо установить Content-Type: multipart/form-data (fetch делает это автоматически при использовании FormData).

Проблема: при использовании скрытых полей формы, если значение меняется динамически, но форма отправляется до того, как скрипт обновил поле. Решение: убедиться, что событие отправки формы обрабатывается после обновления.

Как использовать cookie для передачи переменных из JavaScript в PHP?

Cookie можно записать на стороне JavaScript и затем прочитать в PHP. Подходит для небольших объёмов данных, которые должны сохраняться между сессиями или страницами.


// JavaScript: установить cookie
document.cookie = "username=Иван; path=/";
  

<?php // чтение cookie
$username = $_COOKIE['username'] ?? null;
echo "Привет, $username";
?>
  

Ошибка: cookie не устанавливается, если страница не загружена через HTTP/HTTPS (локальный файл file://). Также ограничение по размеру (около 4KB). Решение: использовать только для идентификаторов или небольших флагов.

Проблема: безопасность - cookie могут быть перехвачены. Использовать флаг HttpOnly для защиты от JS-скриптов, но тогда их нельзя записать из JS.

Как передать переменные через сессию (косвенно, через сервер)?

Этот подход предполагает, что JavaScript отправляет запрос на сервер (например, через AJAX), сервер сохраняет данные в сессии, а затем на другом запросе PHP может их прочитать.


// JavaScript (вызов сохранения)
fetch('save_session.php', {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify({theme: 'dark'})
});
  

<?php // save_session.php
session_start();
$input = json_decode(file_get_contents('php://input'), true);
if (isset($input['theme'])) {
    $_SESSION['theme'] = $input['theme'];
}
?>
  

<?php // другой скрипт
session_start();
$theme = $_SESSION['theme'] ?? 'light';
?>
  

Ошибка: если не вызвать session_start() в каждом скрипте, данные не сохранятся. Решение: всегда вызывать session_start() до чтения/записи сессии.

Цели использования каждого варианта:

  • Fetch (JSON) - для асинхронной передачи структурированных данных (объекты, массивы) без перезагрузки. Идеально для API.
  • GET через URL - для передачи простых параметров (например, поисковый запрос) при переходе на новую страницу.
  • Отправка формы - для стандартных форм с перезагрузкой или через FormData для файлов.
  • Cookie - для небольших данных, которые нужно сохранить между сессиями (например, настройки отображения).
  • Сессия - для хранения данных на сервере, связанных с текущим пользователем (например, корзина, авторизация).

Дополнительные примеры передачи переменных из JavaScript в PHP

Пример с использованием fetch и разными методами (PUT, DELETE)

Пример

// JavaScript: обновление данных (PUT)
let updateData = {id: 1, title: 'Новый заголовок'};
fetch('api/update.php', {
  method: 'PUT',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify(updateData)
})
.then(response => response.json())
.then(data => {
    console.log('Результат обновления:', data);
});
  
Пример

<?php // api/update.php
$method = $_SERVER['REQUEST_METHOD'];
if ($method !== 'PUT') {
    http_response_code(405);
    exit;
}
$input = json_decode(file_get_contents('php://input'), true);
// имитация обновления
$response = ['updated' => true, 'received' => $input];
header('Content-Type: application/json');
echo json_encode($response);
?>
  
// Вывод в консоли браузера:
{updated: true, received: {id: 1, title: 'Новый заголовок'}}
  

Пример передачи массива данных через GET с помощью XMLHttpRequest

Пример

// JavaScript: устаревший, но иногда используемый способ
let xhr = new XMLHttpRequest();
let params = 'items[]=apple&items[]=banana&items[]=cherry';
xhr.open('GET', 'array_handler.php?' + params, true);
xhr.onload = function() {
    if (xhr.status === 200) {
        console.log(xhr.responseText);
    }
};
xhr.send();
  
Пример

<?php // array_handler.php
$items = $_GET['items'] ?? [];
if (is_array($items)) {
    echo 'Получены фрукты: ' . implode(', ', $items);
} else {
    echo 'Ожидался массив';
}
?>
  
// Вывод:
Получены фрукты: apple, banana, cherry
  

Пример отправки данных с обработкой ошибок на сервере

Пример

// JavaScript
fetch('validate.php', {
  method: 'POST',
  headers: {'Content-Type': 'application/x-www-form-urlencoded'},
  body: 'email=test@example.com&age=25'
})
.then(response => {
    if (!response.ok) throw new Error('Сервер вернул ошибку ' + response.status);
    return response.json();
})
.then(data => console.log(data))
.catch(err => console.error('Произошла ошибка:', err));
  
Пример

<?php // validate.php
$email = $_POST['email'] ?? '';
$age = $_POST['age'] ?? 0;
$errors = [];
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $errors[] = 'Некорректный email';
}
if ($age < 18) {
    $errors[] = 'Возраст должен быть не менее 18';
}
if ($errors) {
    http_response_code(400);
    echo json_encode(['status' => 'error', 'messages' => $errors]);
} else {
    echo json_encode(['status' => 'success', 'message' => 'Данные корректны']);
}
?>
  
// При корректных данных:
{status: "success", message: "Данные корректны"}
// При ошибке:
{status: "error", messages: ["Некорректный email"]}
  

Пример использования библиотеки axios для передачи данных

Пример

// JavaScript с axios (требуется подключение CDN)
axios.post('api.php', {
    name: 'Мария',
    score: 95
})
.then(response => {
    console.log(response.data);
})
.catch(error => {
    console.error(error);
});
  
Пример

<?php // api.php (тот же серверный код, что и для fetch)
$input = json_decode(file_get_contents('php://input'), true);
echo json_encode(['received' => $input]);
?>
  
// В консоли:
{received: { name: "Мария", score: 95 }}
  

Пример передачи данных через iframe (редкий способ)

Пример

<iframe name="hiddenFrame" style="display:none"></iframe>
<form action="iframe_handler.php" method="POST" target="hiddenFrame" id="hiddenForm">
  <input type="hidden" name="secret" id="secretInput">
</form>
<script>
document.getElementById('secretInput').value = 'mySecretValue';
document.getElementById('hiddenForm').submit();
</script>
  
Пример

<?php // iframe_handler.php
$secret = $_POST['secret'] ?? '';
file_put_contents('log.txt', 'Получен секрет: ' . $secret . "\n", FILE_APPEND);
echo 'ok';
?>
  
// Файл log.txt:
Получен секрет: mySecretValue
  

Передача переменных из JavaScript в PHP - comments

En
Javascript переменные php (php)