За последние 24 часа нас посетили 22505 программистов и 1279 роботов. Сейчас ищут 806 программистов ...

ПОМОГИТЕ ПОНЯТЬ - Jquery $data откуда возникает со стороны PHP?

Тема в разделе "JavaScript и AJAX", создана пользователем Игорь29, 22 мар 2019.

  1. Игорь29

    Игорь29 Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    8
    Симпатии:
    0
    Доброй ночи! вечера! дня!
    Прошу помощи - уже все все перерыл, не понимаю именно следующего момента - - хочу послать асинхронный запрос Jquery (3.1.), и получить данные - без усложнения:отправляю на сервер одно поле формы, сервер обрабатывает и ВОЗВРАЩАЕТ РЕЗУЛЬТАТ ???? КУДА??? куда и как я должен ( а может не я, а сам умный сервер) результат в PHP скрипте отправить в сторону Jquery, куда передать? чтобы ОНО ЖЕ. оказалось в $data Jquery.
    Везде приводятся примеры , когда PHP скрипт принимает входные данные в $_GET(POST), обрабатывает и выводит в переменную посредством echo куда- то на страницу - это все понятно и не интересно.
    Заранее огромное спасибо!
    Почему у JS нет аналога $_GET(POST)??? ведь по сути взаимодействие двустороннее, т.е проще было бы взаимодействие и понятнее? А может есть?или будет?
     
  2. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Ну вот смотри, файлик твой например называется test.php и содержит он такие строки:
    PHP:
    1. $test = 'Ответ';
    2. return $test;
    Вот это вот retur и есть отсвет сервера. Например ты с jquery опросишь этот файлик:
    Код (Javascript):
    1. $.get( "test.php", function(data) {
    2.   alert(data); // выведет тебе "ответ"
    3. });
    Если тебе что то нужно передать в файлик test.php отправляешь уже post запрос:
    Код (Javascript):
    1. var test = ' передали'
    2. $.post( "test.php", {test: test }, function( data ) {
    3.     alert(data );
    4.   });
    Но теперь уже в файлике test.php надо добавить строки:
    PHP:
    1. $test = 'ответ';
    2.  
    3. if(isset($_POST["test"])){
    4.  
    5.   $test .= $_POST["test"];
    6.  
    7. }
    8.  
    9. return $test;
    Если post запрос был, jquery вернет 'ответ передали' если нет, то просто 'ответ'.
     
    Taktreba нравится это.
  3. Игорь29

    Игорь29 Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    8
    Симпатии:
    0
    @Artur_hopf, спасибо за разъяснение, вроде и проясняется, однако , наблюдаю во многих описаниях работы технологий одноименное название переменных и их значений, что приводит к путанице и в твоем пояснении тоже запутался
    Код (Text):
    1. var test = ' передали'
    2. $.post( "test.php", {test: test }, function( data ) {
    3.     alert(data );
    4.   });
    {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):
    1. $.post( "test.php", {test: test }, function( data )
    и ОН ОБЯЗАН НАМ ВЕРНУТЬ что то , и он отдает например xxx, return xxx, то, что стоит в аргументе return, т.е xxx попадает data в js function(data).Т.Е в итоге data==xxx!!!

    БОЛЬШОЕ СПАСИБО!!!
     
  4. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Вернется первый return. Не обязательно что то возвращать. Можно же делать запись в бд например.
    Можно использовать функции. Например:
    PHP:
    1. if(isset($_POST["test"])){
    2.   return myFunction($_POST["test"]);
    3. }else{
    4.   return false;
    5. }
    6. function myFunction($test){
    7.     $string = 'Результат функции : ';
    8.     return $string.$test;
    9. }
    В общем обычный php.
     
  5. Игорь29

    Игорь29 Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    8
    Симпатии:
    0
    @Artur_hopf, Спасибище!!! Все - туман рассеялся. Теперь всё ясно!
     
  6. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @Игорь29 Спать надо в 12 часов ночи просто, и гулять периодический. Голова перезагрузиться, сам бы до этого дошел=)
     
  7. Игорь29

    Игорь29 Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    8
    Симпатии:
    0
    @Artur_hopf
    И в этом ты точно прав - есть перегруз у меня сейчас, спасибо - вот ты помог порешать вопрос - сегодня точно во время спать лягу -отдохну. Еще раз спасибо!
     
  8. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Крайне желательно. Тут все просто - если ничего не вернул, клиент будет держать коннект в ожидании таймаута. Ты уже задачу сделал, вроде как бы, а клиент ждет.

    Возвращать надо что угодно, но чтобы клиент получил результат.
    Опять же, откуда клиенту знать, что запрос выполнен успешно? Ну вот ты послал запрос, который что-то там шевелит в БД и не должен возвращать данные. Но что, если он навернулся?

    Верни клиенту хотя бы "status: success" или "error", чтобы тот знал, что к чему. Сам себе жизнь облегчишь. AJAX он же не только про обновление верстки по требованию. Данные приходят "как есть", а что с ними делать - вопрос третий.
     
  9. Taktreba

    Taktreba Активный пользователь

    С нами с:
    11 янв 2017
    Сообщения:
    543
    Симпатии:
    132
    а у меня вопрос тогда.... промисы сделали эменно для этого жеж? для респонсов который могут прийти а могут не прийти?
     
  10. Игорь29

    Игорь29 Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    8
    Симпатии:
    0
    @Fell-x27
    Привет! Подскажи , точнее расскажи как ты себе представляешь, а лучше опиши своими словами( то бишь образами) КАК клиент будет держать коннект, как это выглядит на уровне браузера и JS, что с памятью локалки, что реально поддерживается в этот момент канал (труба ) внутри TCP/IP, короче как ты себе это все представляешь, заранее спасибо!!!
     
  11. Игорь29

    Игорь29 Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    8
    Симпатии:
    0
    @Fell-x27
    или где нужно остановиться, и представлять себе TCP/IP абсолютно абстрактно????На каком этапе? ИЛИ ВООБЩЕ не представлять , а лучше забыть о его существовании??? заранее спасибо!!!
     
  12. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Не загоняйся на низком уровне пакетов. Все проще.

    Клиент посылает запрос серверу. Для этого клиент устанавливает с сервером соединение. А дальше у нас всего 2 сценария - клиент либо получает ответ от сервера, либо обрывает соединение по таймауту. Установление таймаута - часть интерфейса xmlhttprequest, он же, ajax.

    Когда ты аяксом шлешь запрос на сервер, это ЗАПРОС. Ты не можешь послать на сервер команду-и-хер-с-ней. Ты посылаешь запрос с такими-то параметрами. После этого xmlhttprequest ждет ответ сервера. И если сервер просто проглотил команду и не выплюнул ничего в ответ, запрос считается незавершенным. Коннект продолжает висеть.

    Так как Интернет - штука стихийная, а сервер и клиент существуют независимо друг от друга, вполне может быть ситуация, что сервер сдох, взорвался, перезапускается и тд, крч "мало ли, чего он не отвечает". На этот случай и предусмотрен механизм таймаута. Если, в течение нескольких секунд сервер не присылает ответ, клиент считает, то сервер мертв и перестает ждать ответ, грохая соединение.

    https://ru.wikipedia.org/wiki/Transmission_Control_Protocol#Установка_соединения
    --- Добавлено ---
    Хотя, у тебя сервер может отвечать пустым ответом, там же по идее есть заголовки, это вот все.
    Но все равно, клиент лучше информировать о том, удачно ли прошел запрос, возвращая статус.
     
  13. Игорь29

    Игорь29 Новичок

    С нами с:
    21 мар 2019
    Сообщения:
    8
    Симпатии:
    0
    @Fell-x27
    Спасибо! Буду продолжать вникать!
     
  14. Alex654

    Alex654 Новичок

    С нами с:
    8 сен 2018
    Сообщения:
    18
    Симпатии:
    1
    Вы замечательно всё расписали. Но я бы добавил, что в принципе использование 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):
    1. var xhr = new XmlHttpRequest()
    2. xhr.open('GET', 'https://example.com', true)
    3. xhr.onload = function() {
    4.    if (this.status < 300) {
    5.       console.log(this.responseText)
    6.       // можно заменить this на xhr, и так и так будет работать
    7.    }
    8. }
    9. xhr.send(null)
    Также вызов open можно перенести ниже установки обработчика, это тоже не важно. В методе GET все данные передаются в строке адреса, а тело запроса (payload) - пустое.

    А вот так можно отправить форму через POST (обратите внимание, что это не отправка "в лоб" через form.submit(), хотя в плане передаваемых данных эти методы эквивалентны):

    Код (Javascript):
    1. var url = 'https://example.com'
    2. var text = document.getElementById('message').value
    3. var date = document.getElementById('date').value
    4. var time = document.getElementById('hours').value + ':' + document.getElementById('minutes').value
    5. var req = new XmlHttpRequest()
    6. req.open('POST', url, false)
    7. req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
    8. req.onreadystatechange = function() {
    9.    if (req.readyState == 4 && req.status == 200) {
    10.       console.log('Запись опубликована')
    11.    }
    12. }
    13. req.send('text=' + encodeURIComponent(text) + '&date=' + date + '&time=' + time)
    В этом случае нам не нужно делать форме в качестве target невидимый iframe, да и сама форма, по большому счёту, не нужна :)

    Обратите внимание на заголовок Content-Type, устанавливаемый явным образом: без него, скорее всего, сервер не сможет нормально принять данные.

    Формат данных, как видите, идентичен тому, что используется в GET - тот же метод "склейки" параметров, даже экранирование небезопасных для URL символов производится тем же методом. Только данные на этот раз помещаются в тело запроса (после ввсех заголовков, туда же, где находится контент HTML страниц, идущих от сервера к нам).

    Также в данном примере используется чуть иной метод проверки статуса соединения: обработчик вешается не на событие load, а на событие readystatechange.
     
    keren нравится это.