Передать данные из 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/
Статья в ближайшее время будет дописана, с большим количеством примеров.
Рекламный блок, для развития проекта