Доброй ночи! вечера! дня! Прошу помощи - уже все все перерыл, не понимаю именно следующего момента - - хочу послать асинхронный запрос Jquery (3.1.), и получить данные - без усложнения:отправляю на сервер одно поле формы, сервер обрабатывает и ВОЗВРАЩАЕТ РЕЗУЛЬТАТ ???? КУДА??? куда и как я должен ( а может не я, а сам умный сервер) результат в PHP скрипте отправить в сторону Jquery, куда передать? чтобы ОНО ЖЕ. оказалось в $data Jquery. Везде приводятся примеры , когда PHP скрипт принимает входные данные в $_GET(POST), обрабатывает и выводит в переменную посредством echo куда- то на страницу - это все понятно и не интересно. Заранее огромное спасибо! Почему у JS нет аналога $_GET(POST)??? ведь по сути взаимодействие двустороннее, т.е проще было бы взаимодействие и понятнее? А может есть?или будет?
Ну вот смотри, файлик твой например называется test.php и содержит он такие строки: PHP: $test = 'Ответ'; return $test; Вот это вот retur и есть отсвет сервера. Например ты с jquery опросишь этот файлик: Код (Javascript): $.get( "test.php", function(data) { alert(data); // выведет тебе "ответ" }); Если тебе что то нужно передать в файлик test.php отправляешь уже post запрос: Код (Javascript): var test = ' передали' $.post( "test.php", {test: test }, function( data ) { alert(data ); }); Но теперь уже в файлике test.php надо добавить строки: PHP: $test = 'ответ'; if(isset($_POST["test"])){ $test .= $_POST["test"]; } return $test; Если post запрос был, jquery вернет 'ответ передали' если нет, то просто 'ответ'.
@Artur_hopf, спасибо за разъяснение, вроде и проясняется, однако , наблюдаю во многих описаниях работы технологий одноименное название переменных и их значений, что приводит к путанице и в твоем пояснении тоже запутался Код (Text): var test = ' передали' $.post( "test.php", {test: test }, function( data ) { alert(data ); }); {test: test } - т.е первый test - это имя элемента массива POST, а второй test - это значение переменной JS ('передали'), потом это попадает в PHP и там опять уже $test, везде test, а если у меня будет в PHP return $notest возвращаться то оно и попадет в data js?ИЛИ? А если будет несколько return в одном скрипте .php, что будет уходить в data? Или каждому ajax запросу по отдельному скрипту .php? Еще возник вопросик получается в одном файле.php может быть один return? return ==это возврат значения функции, но function нигде не присутствует в коде? Извини, за глуповатые вопросы, и еще раз спасибо за твой ответ, теперь ВСЁ проясняется - получается , мы обратились к скрипту test.php из JS Код (Text): $.post( "test.php", {test: test }, function( data ) и ОН ОБЯЗАН НАМ ВЕРНУТЬ что то , и он отдает например xxx, return xxx, то, что стоит в аргументе return, т.е xxx попадает data в js function(data).Т.Е в итоге data==xxx!!! БОЛЬШОЕ СПАСИБО!!!
Вернется первый return. Не обязательно что то возвращать. Можно же делать запись в бд например. Можно использовать функции. Например: PHP: if(isset($_POST["test"])){ return myFunction($_POST["test"]); }else{ return false; } function myFunction($test){ $string = 'Результат функции : '; return $string.$test; } В общем обычный php.
@Игорь29 Спать надо в 12 часов ночи просто, и гулять периодический. Голова перезагрузиться, сам бы до этого дошел=)
@Artur_hopf И в этом ты точно прав - есть перегруз у меня сейчас, спасибо - вот ты помог порешать вопрос - сегодня точно во время спать лягу -отдохну. Еще раз спасибо!
Крайне желательно. Тут все просто - если ничего не вернул, клиент будет держать коннект в ожидании таймаута. Ты уже задачу сделал, вроде как бы, а клиент ждет. Возвращать надо что угодно, но чтобы клиент получил результат. Опять же, откуда клиенту знать, что запрос выполнен успешно? Ну вот ты послал запрос, который что-то там шевелит в БД и не должен возвращать данные. Но что, если он навернулся? Верни клиенту хотя бы "status: success" или "error", чтобы тот знал, что к чему. Сам себе жизнь облегчишь. AJAX он же не только про обновление верстки по требованию. Данные приходят "как есть", а что с ними делать - вопрос третий.
а у меня вопрос тогда.... промисы сделали эменно для этого жеж? для респонсов который могут прийти а могут не прийти?
@Fell-x27 Привет! Подскажи , точнее расскажи как ты себе представляешь, а лучше опиши своими словами( то бишь образами) КАК клиент будет держать коннект, как это выглядит на уровне браузера и JS, что с памятью локалки, что реально поддерживается в этот момент канал (труба ) внутри TCP/IP, короче как ты себе это все представляешь, заранее спасибо!!!
@Fell-x27 или где нужно остановиться, и представлять себе TCP/IP абсолютно абстрактно????На каком этапе? ИЛИ ВООБЩЕ не представлять , а лучше забыть о его существовании??? заранее спасибо!!!
Не загоняйся на низком уровне пакетов. Все проще. Клиент посылает запрос серверу. Для этого клиент устанавливает с сервером соединение. А дальше у нас всего 2 сценария - клиент либо получает ответ от сервера, либо обрывает соединение по таймауту. Установление таймаута - часть интерфейса xmlhttprequest, он же, ajax. Когда ты аяксом шлешь запрос на сервер, это ЗАПРОС. Ты не можешь послать на сервер команду-и-хер-с-ней. Ты посылаешь запрос с такими-то параметрами. После этого xmlhttprequest ждет ответ сервера. И если сервер просто проглотил команду и не выплюнул ничего в ответ, запрос считается незавершенным. Коннект продолжает висеть. Так как Интернет - штука стихийная, а сервер и клиент существуют независимо друг от друга, вполне может быть ситуация, что сервер сдох, взорвался, перезапускается и тд, крч "мало ли, чего он не отвечает". На этот случай и предусмотрен механизм таймаута. Если, в течение нескольких секунд сервер не присылает ответ, клиент считает, то сервер мертв и перестает ждать ответ, грохая соединение. https://ru.wikipedia.org/wiki/Transmission_Control_Protocol#Установка_соединения --- Добавлено --- Хотя, у тебя сервер может отвечать пустым ответом, там же по идее есть заголовки, это вот все. Но все равно, клиент лучше информировать о том, удачно ли прошел запрос, возвращая статус.
Вы замечательно всё расписали. Но я бы добавил, что в принципе использование return вне функций - довольно плохой тон. Для принудительного завершения работы скрипта есть функции exit() и die() (первая из них также может принимать аргументом код ответа, насчёт второй не уверен). https://www.php.net/manual/ru/function.exit.php Ну и да, коннект будет висеть в случае, если скрипт "завис". Если скрипт не завис и исполнился, то PHP "просигнализирует" вебсерверу, что всё ок, и тот вернёт ответ (возможно, пустой) таким образом, чтобы клиент не думал, что что-то там "в процессе". Насколько я помню, там в HTTP двойной перевод строки используется как символ конца данных, как и во многих текстовых протоколах. Также браузеру в помощь предварительно посчитанный вебсервером заголовок Content-Length. Кстати,когда долго работающий скрипт прерывается интерпретатором PHP по таймауту (превышено время исполнения) - то интерпретатор тоже посылает вебсерверу текстовое содержимое с ошибкой (если активирован вывод ошибок в браузер) и сигнал о том, что вывода от него больше ждать не стоит. И ещё: иногда бывает нужно выводить информацию из PHP в браузер "порционно", в риалтайме. И вот с этим бывают проблемы, особенно если данные поступают очень маленькими кусочками (например, считается числовой ряд). Чаще всего они не будут выведены, пока объём временного буфера в PHP не превысит довольно большую величину, что-то в районе килобайта. Чтобы с этим бороться, можно использовать функции ob_start() и ob_end_flush(). --- Добавлено --- Имхо стоит почитать про GET и POST. get и post методы в jQuery - это обёртки. Они довольно удобные, но скрывают реальную суть происходящего. Если использовать реальный XHR, всё становится намного понятнее. Вот пример запроса методом GET: Код (Javascript): var xhr = new XmlHttpRequest() xhr.open('GET', 'https://example.com', true) xhr.onload = function() { if (this.status < 300) { console.log(this.responseText) // можно заменить this на xhr, и так и так будет работать } } xhr.send(null) Также вызов open можно перенести ниже установки обработчика, это тоже не важно. В методе GET все данные передаются в строке адреса, а тело запроса (payload) - пустое. А вот так можно отправить форму через POST (обратите внимание, что это не отправка "в лоб" через form.submit(), хотя в плане передаваемых данных эти методы эквивалентны): Код (Javascript): var url = 'https://example.com' var text = document.getElementById('message').value var date = document.getElementById('date').value var time = document.getElementById('hours').value + ':' + document.getElementById('minutes').value var req = new XmlHttpRequest() req.open('POST', url, false) req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded') req.onreadystatechange = function() { if (req.readyState == 4 && req.status == 200) { console.log('Запись опубликована') } } req.send('text=' + encodeURIComponent(text) + '&date=' + date + '&time=' + time) В этом случае нам не нужно делать форме в качестве target невидимый iframe, да и сама форма, по большому счёту, не нужна Обратите внимание на заголовок Content-Type, устанавливаемый явным образом: без него, скорее всего, сервер не сможет нормально принять данные. Формат данных, как видите, идентичен тому, что используется в GET - тот же метод "склейки" параметров, даже экранирование небезопасных для URL символов производится тем же методом. Только данные на этот раз помещаются в тело запроса (после ввсех заголовков, туда же, где находится контент HTML страниц, идущих от сервера к нам). Также в данном примере используется чуть иной метод проверки статуса соединения: обработчик вешается не на событие load, а на событие readystatechange.