Avatar ·

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

Всем привет! Я начинающий PHP-разработчик, и у меня возникла проблема. Я пишу простой сайт на PHP, и мне нужно передать некоторые данные из серверной части (PHP) в клиентскую (JavaScript). Например, у меня есть переменная `$username = 'Иван';`, и я хочу вывести приветствие на странице через JS: `alert("Привет, " + username);`. Проблема в том, что PHP выполняется на сервере, а JS — в браузере. Я пробовал просто вставить PHP-код внутрь JS-скрипта, вот так: ```php ``` Но в консоли браузера появляется ошибка: `Uncaught SyntaxError: Unexpected identifier`. Если переменная содержит число — работает, но со строками — нет. Я понимаю, что PHP выводит строку без кавычек, и JS воспринимает её как имя переменной, а не строку. Но как правильно экранировать? А что делать, если нужно передать массив или объект? Я перерыл кучу форумов, но везде предлагают разные способы: JSON, AJAX, скрытые поля... Подскажите, пожалуйста, какой способ самый правильный и безопасный для простых случаев? Мне нужно передавать не только строки, но и массивы данных из базы данных. Заранее спасибо! <<>>

Основные способы передачи данных из PHP в JavaScript

Вы правы — PHP работает на сервере, а JavaScript в браузере. Чтобы передать данные, нужно, чтобы PHP сгенерировал корректный JavaScript-код. Рассмотрим три надежных способа.

1. Передача простых строк и чисел (inline)

Для одиночных значений используйте json_encode(). Эта функция автоматически добавит кавычки для строк и правильно экранирует специальные символы:

<?php
$username = "Иван'Орлов"; // строка с кавычкой
$age = 25;
?>

<script>
    var username = <?php echo json_encode($username); ?>;
    var age = <?php echo json_encode($age); ?>;
    console.log(username); // "Иван'Орлов"
    console.log(age);      // 25
</script>

Почему это работает? json_encode() возвращает строку в формате JSON, которая является валидным JavaScript-кодом. Для строк это будет "Иван'Орлов" (с кавычками), для чисел — 25 (без кавычек).

2. Передача массивов и объектов (JSON)

Для сложных структур данных используйте тот же json_encode():

<?php
$user = [
    'name' => 'Иван',
    'age' => 25,
    'skills' => ['PHP', 'JavaScript', 'HTML']
];
?>

<script>
    // Передаём массив как JSON-объект
    var user = <?php echo json_encode($user); ?>;
    console.log(user.name);    // "Иван"
    console.log(user.skills);  // ["PHP","JavaScript","HTML"]
    
    // Или передаём как строку (если нужно для атрибута)
    var userString = '<?php echo json_encode($user); ?>';
    var userParsed = JSON.parse(userString);
</script>

3. Безопасная передача через data-атрибуты (рекомендуется)

Лучшая практика — не смешивать PHP и JS в одном файле. Используйте data-атрибуты HTML:

<!-- PHP генерирует HTML с данными -->
<div id="app" data-user='<?php echo json_encode($user); ?>'></div>

<!-- JavaScript читает данные -->
<script>
    var appDiv = document.getElementById('app');
    var user = JSON.parse(appDiv.dataset.user);
    console.log(user.name); // "Иван"
</script>

4. Динамическая передача через AJAX (для сложных сценариев)

Если данные меняются после загрузки страницы, используйте отдельный PHP-скрипт:

// frontend.js
fetch('/api/get-user.php?id=5')
    .then(response => response.json())
    .then(user => {
        console.log(user.name);
    });
// api/get-user.php
<?php
header('Content-Type: application/json');
$user = getUserFromDB($_GET['id']);
echo json_encode($user);
?>

Важные предостережения

  • Никогда не используйте echo $var без json_encode() — это приводит к XSS-уязвимостям. Если в строке будет </script>, ваш код сломается.
  • Для булевых значений json_encode(true) вернет true (JavaScript-логическое значение), а не строку.
  • Для null json_encode(null) вернет null.
  • Если данные большие (например, таблица из 1000 строк) — используйте AJAX, чтобы не раздувать HTML-страницу.

В итоге: для 90% случаев используйте json_encode() внутри тега <script> или data-атрибутов. Это безопасно, просто и поддерживает любые типы данных.

<<>>

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

Если вы не хотите использовать JSON, можно передавать данные через скрытые <input> поля. Этот метод особенно удобен, когда данные уже есть в форме:

<?php $username = "Иван"; ?>
<input type="hidden" id="hidden-username" value="<?php echo htmlspecialchars($username, ENT_QUOTES, 'UTF-8'); ?>">

<script>
    var username = document.getElementById('hidden-username').value;
    alert(username); // "Иван"
</script>

Важно: используйте htmlspecialchars() с флагом ENT_QUOTES, чтобы экранировать кавычки и спецсимволы. Без этого злоумышленник может внедрить свой JavaScript через поле ввода.

Плюсы: не требует JSON, работает в старых браузерах, данные доступны после отправки формы.

Минусы: не подходит для массивов и объектов (только строки), загрязняет HTML-разметку.

Этот метод хорош для простых строковых значений, например, ID пользователя или токена. Для всего остального используйте json_encode() из первого ответа.