Передать данные из javascript PHP Ajax
Передача данных от fronted на backend(от javascript в php в нашем случае) сейчас достаточно часто используемая процедура, естественно, когда известно, как это сделать.
Что потребуется для работы:
- Сервер, где можно запустить php-скрипты;
- Текстовый редактор;
- Базовые знания PHP;
- Базовые знания Javascript;
- Понимание как работают GET и POST — запросы, в данной статье в основном будут использоваться POST — запросы.
Совсем простой пример
Несколькими годами раньше, нужно было писать большие и сложные запросы, но с приходом Jquery, все стало гораздо проще, поэтому первым шагом подключаем библиотеку jquery:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
В первом примере, будем просто отправлять строку, при помощи функции $.post Jquery, где первым параметром передается название нашего php-скрипта, вторым — данные, если они есть, третьим функция обратного вызова(callback), в аргумент data, которой к нам придет ответ от сервера, если он будет. Пример кода js:
<script> $.post("script.php", {dataReq: "Передаваемая строка"}, function(data) { console.log(data); }); </script>
В результате у Вас должен получиться файл index.php, примерно такого содержания:
<!doctype html> <html lang=ru> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Test Ajax php</title> </head> <body> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script> $.post("script.php", {dataReq: "Передаваемая строка"}, function(data) { console.log(data); }); </script> </body> </html>
В php эти данные придут в $_POST[‘dataReq’]. Поэтому в самом простом примере, мы возьмем эту строку и отправим ее обратно, без всякой проверки. Пример кода script.php:
<?php echo $_POST["dataReq"]; ?>
Открываем консоль в браузере и проверяем результат. В данном примере произошла передача данных от javascript к php и обратно, но без проверок, это было сделано специально, чтобы не усложнять и настроить коннект. В некоторых случая, когда нужно просто подгрузить данные, в фоновом режиме, этого может оказаться достаточно. Ссылка, на скачивание архива с примером, описанного выше.
Если удалось запустить файл из примера и посмотреть в консоле браузера результат, можно двигаться дальше.
Чуть сложнее
В реальности, загрузка данных происходит при наступлении какого-то события, например нажатие на кнопку, или ввод символов с троку поиска. Усложним пример, добавив обработчик на кнопку и подгрузку в div данных с сервера.
Модифицируем файл index.php, добавим кнопку,
<!doctype html> <html lang=ru> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Test Ajax php</title> </head> <body> <button id="testAjax" type="button">Загрузить данные</button> <div id="result"></div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script> $(document).on("click", "#testAjax", function() { $.post("script.php", {dataReq: 5}, function(data) { $("#result").text(data); }); }); </script> </body> </html>
Также немного изменим файл script.php, его новый код:
<?php echo $_POST["dataReq"] + 25; ?>
Теперь мы по клику передаем число 5, на сервере к пришедшему числу прибавляется 25 и выводится под кнопкой число 30. То есть, происходит отправка данных, модификация и отображение. По ссылке ниже, можно скачать новый пример:
Передача и прием объектов
Наиболее распространенным данными, при передачи Ajax являются объекты, например в формате JSON. В следующем примере разберем вариант, где будем передавать данные из поля input, на сервере будем обрабатывать приходящие данные и отправлять назад массив php преобразованный в JSON объект и наполнять из него тег select, в зависимости от отправленного числа. Для этого модифицируем файл index.php, его новый код будет таким:
<!doctype html> <html lang=ru> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Test Ajax php</title> </head> <body> <label for="numReq">Введите число от 1 до 5: </label> <input type="text" id="numReq" name="numReq"> <button id="testAjax" type="button">Отправить</button> <br> <select id="resReq"> <option selected="selected" disabled="disabled">Не выбрано</option> </select> <div id="result"> </div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script> $(document).on("click", "#testAjax", function() { //очищаем список, от предыдущих результатов $("#resReq .dinElem").remove(); // получаем значение из поля input let inputData = $("#numReq").val(); $.post("script.php", {dataReq: inputData}, function(data) { // проверка, не пришел ли нам 0, а значит запрашиваемый элемент есть if(data != 0){ //преобразуем данные в объект let dataToSelect = JSON.parse(data); //цикл по объекту, наполнение тега select for (let option in dataToSelect) { $("#resReq").append(`<option class="dinElem">${dataToSelect[option]}</option>`); } // иначе выведем сообщение, что Ничего не найдено! }else{ $("#result").text("Ничего не найдено!"); } }); }); </script> </body> </html>
В js добавилась проверка приходящего результата, если он не равен 0, то в цикле наполняем тег select. Если же нам придет в ответе 0, это означает, что такого списка нет, так как нет такого ключа в массиве на сервере, (см. ниже описание под обновленным кодом script.php). В коде js добавил комментарии, за что отвечает та или иная строка.
Также модифицируем файл script.php, его новый код будет таким:
<?php $arrToSend = array( 1 => array( 1 => "Автомобиль", 2 => "Лодка", 3 => "Дом", 4 => "Коробка", 5 => "Самокат", 6 => "Мотоцикл", 7 => "Автобус", 8 => "Баржа", ), 2 => array( 1 => "Роза", 2 => "Фиалка", 3 => "Тюльпан", 4 => "Ромашка", 5 => "Ирис", ), 3 => array( 1 => "Ресторан", 2 => "Магазин", 3 => "Кафе", 4 => "Бистро", 5 => "Пекарня", 6 => "Палатка с пирожками", ), 4 => array( 1 => "Красный", 2 => "Синий", 3 => "Белый", 4 => "Оранжевый", 5 => "Зеленый", 6 => "Фиолетовый", 7 => "Черный", 8 => "Желтый", 9 => "Серый", 10 => "Розовый", 11 => "Голубой", ), 5 => array( 1 => "Австралия", 2 => "Индия", 3 => "Китай", 4 => "Япония", 5 => "Испания", ), ); $param = $_POST['dataReq']; if(array_key_exists($param,$arrToSend)){ echo json_encode($arrToSend[$param],JSON_UNESCAPED_UNICODE); }else{ echo 0; } ?>
В нем добавился массив, с элементами, и обработка данных из запроса, в переменную $param сохраняем то, что пришло у нас от javascript, затем при помощи конструкции if else и встроенной функции array_key_exists проверяем есть ли такой ключ в массиве $arrToSend, если есть, то трансформируем вложенный массив, по этому ключу при помощи функции json_encode в формат JSON и отправляем, если же ключа в основном массиве нет, то просто отправляем 0, это нужно для проверки на стороне js.
Результат этого примера должен быть такой, как на gif-ке ниже:

Ссылка на оф. сайт Jquery, документация по функции $.post, которая используется в статье. https://api.jquery.com/jquery.post/
Статья в ближайшее время будет дописана, с большим количеством примеров.