Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Обработка ответа $.post запроса - как в блоке div получить переменную массива (https://javascript.ru/forum/jquery/63110-obrabotka-otveta-%24-post-zaprosa-kak-v-bloke-div-poluchit-peremennuyu-massiva.html)

NeilDaniels 18.05.2016 14:30

Обработка ответа $.post запроса - как в блоке div получить переменную массива
 
По двойному клику на строке таблицы получаем значение id (номер по порядку) и возвращаем ответ в блок <div id="receiv"> </div>
<script>
$(function() {
	$(".rowlink").bind( 'dblclick', function() {
		var id = $(this).find('.id').html();
				$.post('transmission.php', {'id' : id}, function(data){$("#receiv").text(data);});
     });
});
</script>


Обработчик запроса transmission.php
<?php
if (isset($_POST['id'])) {$id = $_POST['id'];}
//здесь по id (ключу таблицы) из строки таблицы БД заполняем массив
return $BD_str[]; //возвращаем массив
?>


Блок модального окна, где принимается массив.
<div id="receiv">
<?php
//код
?>
</div>


Как в этом блоке принять переменную массива? Гугл перешарил так, что он каждый раз уже требует капчу.

laimas 18.05.2016 14:44

А что ее принимать, вот она данные приняты: function(data).
Наверное вопрос как вывести полученные данные? Ну так как вам надо, стройте по ним соответствующий html-код и вставляйте, данные то массив, а не html.

А это к чему на клиенте?

<div id="receiv">
<?php
//код
?>

</div>

Если модальное (собственно оно не модальное и не окно), значит открывается по запросу, а значит никаких РНР в нем просто быть не может.

NeilDaniels 18.05.2016 14:50

laimas, за пределами скрипта переменная недоступна, вот в чём проблема. Как скрипт передал id, так скрипт и получил (data). Как полученные данные передать блоку div с id="receiv">? Я этого так и не нашёл нигде.

По п.2 - да пока в тестовом режиме всё.

laimas 18.05.2016 15:02

return $BD_str[]; //возвращаем массив - откуда и куда?
Если это функция и из нее возврат, то запросивший ее скрипт должен выдать возвращенное значение серверу - echo main_function($_POST['id']). Причем, если после выдачи ответа серверу в РНР коде есть вывод, то не echo, а exit(main_function($_POST['id']));

Правда конструкция написанная даже с натяжкой не тянет на функцию, а значит return не при делах тут, он не выводит в браузер.

NeilDaniels 18.05.2016 15:13

laimas,
ну а как тогда transmission.php должен передать массив? Как тогда запрошенная функция с переданным ей значением и айдишником блока передаст этому блоку (а не вызывавшему функцию скрипту) сформированный массив? И как в этом блоке принять массив?
Что я неясного спрашиваю?

laimas 18.05.2016 15:19

Цитата:

Сообщение от NeilDaniels
ну а как тогда transmission.php должен передать массив?


Сервер общается с клиентом посредством HTTP, и все что он отдает клиенту, это строка, нет никаких массивов! Нет такого понятия в HTML.

Возвращать нужно в JSON формате, из которого клиент получит исходный массив.

Цитата:

Сообщение от NeilDaniels
Что я неясного спрашиваю?

Вы написали какую-то приблуду непонятную, наверное думая, что тут догадаются что вы там и как отдаете клиенту.

Прежде чем спросить и чтобы вас поняли, необходимо пояснять, тут же не чародеи однако.

NeilDaniels 18.05.2016 15:26

laimas,
хорошо, данные вернутся в JSON формате.
Как их разобрать в
<div id="receiv">
</div>
?

Извиняюсь, если выражаюсь непонятно, только учусь.

laimas 18.05.2016 15:32

Можете непосредственно указать методу .post(), что ожидаются данные в JSON, он разберет его (но при условии что нет ошибок в нем) и data будет уже массивом, если сервер отдает индексный массив, в противном случае это будет объект, в котором ключи ассоциативного массива будут являться его свойствами.

Чтобы обрабатывать ошибки возможные лучше использовать метод .ajax(), но можно и в .post() поступать так:

$.post('transmission.php', {'id' : id}, function(data){
    if(data) $("#receiv").text(data); //$("#receiv").text(data); так конечно нельзя, подразумевается, что будет сформирован  html из массива, и он будет вставляться
    else //иначе произошла ошибка
}, 'json');

NeilDaniels 18.05.2016 15:38

laimas,
да по коду скрипта вызова функции понятно, видел не раз.

Но, [нецензурно и нетерпеливо], что должно быть в блоке
<div id="receiv">

</div>

, куда (или не туда?) функция возвращает ответ?
Как там принять полученные значения??????????? Вот ни разу не видел примера, где принятые данные разбираются именно в #receiv.

laimas 18.05.2016 15:42

1) Какая функция?

2) Сервер может возвращать и готовый html код того, что должно быть вставлено на клиенте. Не зная как все это работает, почему используете массив?

Dilettante_Pro 18.05.2016 15:51

NeilDaniels,
Цитата:

Сообщение от NeilDaniels
Как там принять полученные значения??????????? Вот ни разу не видел примера, где принятые данные разбираются именно в #receiv.

В #receiv данные и не разбираются - туда размещаются разобранные данные
А разбираются они в
Цитата:

Сообщение от laimas
1 $.post('transmission.php', {'id' : id}, function(data){
2    if(data) $("#receiv").text(data); //$("#receiv").text(data); так конечно нельзя, подразумевается, что будет сформирован  html из массива, и он будет вставляться
3    else //иначе произошла ошибка
4 }, 'json');

в строчках между первой и последней

NeilDaniels 18.05.2016 15:52

laimas,
1. ### Функция transmission.php, которая по полученному id делает выборку в таблице БД, и формирует набор данных из этого же id и данных из строки таблицы, и возвращает на клиент. Вообще-то об этом выше написал.
2. Полученные от transmission.php данные должны быть приняты в блоке #receiv, он же блок модального окна, данные рассовываются по полям input (это окно для редактирования строки таблицы БД).

Что ещё непонятного????????????????????????

NeilDaniels 18.05.2016 15:54

Dilettante_Pro,
а как из этого
Цитата:

1 $.post('transmission.php', {'id' : id}, function(data){
2 if(data) $("#receiv").text(data); //$("#receiv").text(data); так конечно нельзя, подразумевается, что будет сформирован html из массива, и он будет вставляться
3 else //иначе произошла ошибка
4 }, 'json');
данные передать в #receiv? Они же за пределами скрипта уже не видны.

laimas 18.05.2016 16:06

Цитата:

Сообщение от NeilDaniels
Функция transmission.php

transmission.php - это не функция, а файл серверного скрипта, к которому будет обращаться клиент, а вот в нем уже могут быть или не быть функции.

Вы написали три строки из этого файла и пойми попробуй чего там в нем делается. Могу только заметить, что вызывать функцию (пусть в этом файле она вызывается), в которой проверяется вот это:

if (isset($_POST['id']))

это мягко говоря не прилично, логичнее вызывать функцию, если таковое установлено.

Я не маг, я не могу догадаться как и что вы делаете, что вам конкретно надо, я могу лишь написать тезисно. Есть два способа отдать клиенту:

1) Формируем из данных полученных из базы например, таблицу обрамленную формой, которая содержит ее поля. Этот код отдаем клиенту, который вставляет его как HTML в нужное место.

2) Кодируем в JSON данные из базы и отдаем их клиенту. Клиент из полученного массива/объекта (о разнице читайте выше) формирует html код таблицы обрамленной формой с ее полями и вставляет в нужное место.

Что ещё непонятного????????????????????????

Я что должен перед вами распинаться? Либо вы конкретно поясняете что отдаете клиенту и показываете эти данные, описываете что хотите получить, либо думайте сами. Я ведь тоже не собираюсь ликбезом заниматься.

NeilDaniels 18.05.2016 16:13

Цитата:

Сообщение от laimas (Сообщение 416902)
transmission.php - это не функция, а файл серверного скрипта, к которому будет обращаться клиент, а вот в нем уже могут быть или не быть функции.

Вы написали три строки из этого файла и пойми попробуй чего там в нем делается. Могу только заметить, что вызывать функцию (пусть в этом файле она вызывается), в которой проверяется вот это:

if (isset($_POST['id']))

это мягко говоря не прилично, логичнее вызывать функцию, если таковое установлено.

1) Формируем из данных полученных из базы например, таблицу обрамленную формой, которая содержит ее поля. Этот код отдаем клиенту, который вставляет его как HTML в нужное место.

2) Кодируем в JSON данные из базы и отдаем их клиенту. Клиент из полученного массива/объекта (о разнице читайте выше) формирует html код таблицы обрамленной формой с ее полями и вставляет в нужное место.

1. Что в этом неприличного? Из-за недейственности или того, что так просто непринято кодить?

2. Почему именно так? Если, скажем, несколько разных таблиц (разное количество столбцов и т.д.), то что, для каждого вида таблицы писать свой серверный обработчик - построитель таблицы?

NeilDaniels 18.05.2016 16:15

В общем, всем спасибо, тему можно даже удалить, ибо к общему согласию по моей тупости не придём.

laimas 18.05.2016 16:43

Цитата:

Сообщение от NeilDaniels
Что в этом неприличного? Из-за недейственности или того, что так просто непринято кодить?

Пишется вообще-то так
if(isset($_POST['name']) && (int)$_POST['name']) {
    //выполняем код
}


ибо если вам прислали туфту левую, то зачем же попусту делать запрос к базе, явно зная, что он ничего не вернет? Причем isset($_POST['name']) можно и опустить, если блокировать вывод предупреждений и понимать суть происходящего.

Цитата:

Сообщение от NeilDaniels
Почему именно так?

Потому, что случай 2), это возврат клиенту на его запрос "сырых данных", массива, из которого клиент сам построит необходимый html-код, а массив данных нельзя передавать по HTTP как он есть, поэтому и JSON, хотя есть и другие форматы. А если вас это не устраивает, то стройте его на сервере и отдавайте клиенту готовое. Но не я же задавал вопрос о массиве, а вы.


Цитата:

Сообщение от NeilDaniels
Если, скажем, несколько разных таблиц (разное количество столбцов и т.д.), то что, для каждого вида таблицы писать свой серверный обработчик - построитель таблицы?


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

Dilettante_Pro 18.05.2016 17:03

Цитата:

Сообщение от NeilDaniels (Сообщение 416899)
Dilettante_Pro,
а как из этого

данные передать в #receiv? Они же за пределами скрипта уже не видны.

$("#receiv").text(data); - это и есть размещение присланных данных data в #receiv, только без всякой обработки, в лоб.
Если бы пришел HTML - все легло бы идеально.
Перед размещением здесь же можно сделать любую обработку данных
http://javascript.ru/blog/gordon-fre...jax-javascript
http://professorweb.ru/my/javascript...level3/3_4.php

NeilDaniels 18.05.2016 17:11

Цитата:

Сообщение от laimas
Пишется вообще-то так
if(isset($_POST['name']) && (int)$_POST['name']) {
//выполняем код
}


ибо если вам прислали туфту левую, то зачем же попусту делать запрос к базе, явно зная, что он ничего не вернет?

Если только делать дополнительную проверку на случай того, что в id вдруг будет не целое число (хотя передаётся именно только число, и целое)?

Цитата:

Сообщение от laimas
Потому, что случай 2), это возврат клиенту на его запрос "сырых данных", массива, из которого клиент сам построит необходимый html-код, а массив данных нельзя передавать по HTTP как он есть, поэтому и JSON, хотя есть и другие форматы. А если вас это не устраивает, то стройте его на сервере и отдавайте клиенту готовое. Но не я же задавал вопрос о массиве, а вы.

Ну приму не массив как он есть, а данные в формате JSON. Как набор данных в формате JSON разобрать в блоке #receive на стороне клиента? Если данные на стороне клиента доступны только в скрипте, вызвавшем функцию на стороне сервера. Или это не так?

Насчёт запроса и форм согласен, не сообразил сразу - на таблицу с данными на стороне клиента своя таблица в БД, и запрос-то будет отличаться. Но сформировать таблицу серверным скриптом, передать её до клиента, где JS (?) формирует эту же таблицу, - а не закапризничает ли функционал вывода модального окна, где должна быть таблица (+ кнопка, по нажатию на которую пойдёт запрос на обновление строки в таблице БД)? Не проще ли на клиенте принять данные и сформировать в таблицу в модальном окне?

NeilDaniels 18.05.2016 17:16

Цитата:

Сообщение от Dilettante_Pro (Сообщение 416909)
$("#receiv").text(data); - это и есть размещение присланных данных data в #receiv, только без всякой обработки, в лоб.
Если бы пришел HTML - все легло бы идеально.
Перед размещением здесь же можно сделать любую обработку данных
http://javascript.ru/blog/gordon-fre...jax-javascript

Опять 25. Поправлю .text(data) на .html(data), и что далее?
Как в div'е ловить принятые данные? Мне нахер (извиняюсь за французский) принятые данные не нужны в скрипте-функции вызова серверного скрипта с передачей данных, мне они нужны в блоке div, который лежит за пределами JS функции. Сколько раз это нужно повторить, чтобы дошло?
И как принять данные в блоке div #receiv, я так нигде и не нашёл.

Dilettante_Pro 18.05.2016 17:20

NeilDaniels,
Цитата:

Сообщение от NeilDaniels
Мне нахер (извиняюсь за французский) принятые данные не нужны в скрипте-функции вызова серверного скрипта с передачей данных, мне они нужны в блоке div,

А нахер они вам нужны в div?
Обработка делается средствами скриптов, а не средствами html
Ловить их там не нужно - $("#receiv").text(data); или $("#receiv").html(data); их именно туда и положит

NeilDaniels 18.05.2016 17:31

В целом учебная задача такая.
Есть некая форма накладной, данные хранятся в таблице БД. Есть форма вывода данных из ТБД, есть форма добавления накладной.
По двойному клику на строке таблицы должна открываться форма редактирования накладной с уже заполненными полями. (Да, делаю через пятую точку, когда для заполнения полей формы делаю запрос к БД, а не заполняя поля напрямую из строки уже выведенной таблицы. По своим непонятным соображениям). По двойному клику передаю id строки на серверный скрипт, по запросу получаю данные из БД, и застрял на том, что не могу передать данные в div блок, в котором формируется форма редактирования (div блок изначально скрытый, рисуется через jqModal).

NeilDaniels 18.05.2016 17:33

Цитата:

Сообщение от Dilettante_Pro (Сообщение 416912)
NeilDaniels,

А нахер они вам нужны в div?
Обработка делается средствами скриптов, а не средствами html
Ловить их там не нужно - $("#receiv").text(data); или $("#receiv").html(data); их именно туда и положит

И как взять положенные $("#receiv").html(data)-ом? Эти данные тупо выводятся на экран, а мне они нужны в переменных div-а.

Dilettante_Pro 18.05.2016 17:38

NeilDaniels,
В div нет переменных - там есть (могут быть) элементы html
Переменные есть в скрипте, о чем вам так многократно и говорится.
Получили в скрипте data, разобрали их там же как угодно, сформировали массивы или что угодно - и делайте с ними что хотите. При чем тут div?

NeilDaniels 18.05.2016 17:41

Цитата:

Сообщение от Dilettante_Pro (Сообщение 416916)
NeilDaniels,
В div нет переменных - там есть (могут быть) элементы html
Переменные есть в скрипте, о чем вам так многократно и говорится.
Получили в скрипте data, разобрали их там же как угодно, сформировали массивы или что угодно - и делайте с ними что хотите. При чем тут div?

В div - код модального окна. И как получить разобранные данные из скрипта, если эти данные локального характера, и за пределы скрипта их не сунуть?

Dilettante_Pro 18.05.2016 17:46

NeilDaniels,
Цитата:

Сообщение от NeilDaniels
В div - код модального окна. И как получить разобранные данные из скрипта, если эти данные локального характера, и за пределы скрипта их не сунуть?

Скриптом какие угодно данные можно сунуть куда угодно - в любой элемент html

NeilDaniels 18.05.2016 17:50

Цитата:

Сообщение от Dilettante_Pro (Сообщение 416918)
NeilDaniels,

Скриптом какие угодно данные можно сунуть куда угодно - в любой элемент html

Ну попробую...

laimas 18.05.2016 17:56

Цитата:

Сообщение от NeilDaniels
Если только делать дополнительную проверку на случай того, что в id вдруг будет не целое число (хотя передаётся именно только число, и целое)?

(int) или (integer), это приведение значения к типу INTEGER, а ни как не получение абсолютного значения. И делается это в первую очередь в целях безопасности (читайте об инъекциях баз данных),и только во вторую очередь не делать бесполезный запрос.

Цитата:

Сообщение от NeilDaniels
Ну приму не массив как он есть, а данные в формате JSON. Как набор данных в формате JSON разобрать в блоке #receive на стороне клиента?

Я уже писал как - обходом в цикле формировать по данным html-код. Примеров этому масса и на данном форме, а конкретно ваших данных никто не знает.

Цитата:

Сообщение от NeilDaniels
Но сформировать таблицу серверным скриптом, передать её до клиента, где JS (?) формирует эту же таблицу, - а не закапризничает ли функционал вывода модального окна, где должна быть таблица (+ кнопка, по нажатию на которую пойдёт запрос на обновление строки в таблице БД)? Не проще ли на клиенте принять данные и сформировать в таблицу в модальном окне?

Вы читаете внимательно или как? Я описал два способа - один это сервер формирует ГОТОВЫЙ код html таблицы или иного нужного, а второй, это клиент сам готовит этот код вставляя в него полученный массив от сервера. Какие могут быть формировать таблицу серверным скриптом, передать её до клиента, где JS (?) формирует эту же таблицу, это вы по собственному представлению два способа в кучу, и еще задаете вопрос.

Цитата:

Сообщение от NeilDaniels
Не проще ли на клиенте принять данные и сформировать в таблицу в модальном окне?

Перечитайте внимательно написанное мною выше. А по поводу модального окна, оно такое же окно и модальное, как и бабушкина авоська является кейсом.

Цитата:

Сообщение от NeilDaniels
мне они нужны в блоке div, который лежит за пределами JS функции.

Вот это интересно - это как?

Dilettante_Pro 18.05.2016 18:07

NeilDaniels,
Цитата:

Сообщение от NeilDaniels
Ну записывал в скрипте в переменную полученные данные (просто возвращал тот же id), и ничего, за пределами скрипта переменная не видна.

Что значит не видна? Переменные никогда не видны - видны элементы html
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>

<div id="receiv">
   <input id="testdata" type="text" value='' />
</div>
<script>
  var data = "Какие-то данные";
  $('#receiv #testdata').val(data);
</script>

NeilDaniels 20.05.2016 20:05

Dilettante_Pro,
т.е.
$.post('transmission.php', {'id' : id}, function(data){$("#receiv").html(data);}, datatype: json; );
//получили ответ в формате json
var massiv = JSON.parse(data);

и далее разбирать так? Или опять не то?
$val1 = massiv.val1;
$val2 = massiv.val2;

laimas 20.05.2016 20:15

Цитата:

Сообщение от NeilDaniels
var massiv = JSON.parse(data);

Это зачем, если методу указан тип принимаемых данных? Если он указан, то data уже будет равная объекту (массиву), и JSON.parse(data) совсем не нужен. Вам же писалось об этом.

Только datatype: json; у метода $.post, это ошибка, ибо объект, это {}. Пишите просто в кавычках }, 'json');, и без точки с запятой после параметра, это тоже ошибка.

Вроде бы и ссылку давал почитать, а пишите такую отсебятину, что ...

NeilDaniels 20.05.2016 21:51

laimas,
data через data.переменная или data[1], data[2] разбирать? Или как. Мозг сломал....

laimas 21.05.2016 08:01

Если клиенту отдается индексный массив, то data[0], data[1], и т.д., причем ели это одномерный массив, а если многомерный, то обход циклом, в котором data[i][0], data[i][1], ... Если массив ассоциативный, то data.name, где name это имя поля sql-таблицы, или массив вложенный, то также в цикле.

Данные свои надо показывать, а то вам писали как делается не раз, а проку нет.

Alex_63 21.05.2016 12:31

NeilDaniels,
Дайте пример получаемых данных, и опишите внятно, что с ними надо сделать!
$.post("/transmission.php",{"id":id},function(data){
  //допустим, data = { val1: "aaa", val2: "bbb" } - объект
  for(var i in data){
     alert( data[i] ); //перебираем все элементы объекта
     $("#receiv #testdata").append( data[i] ); //вставляем в блок
  }
  //или для конкретных ключей:
  var a = data['val1']; 
  var b = data['val2']; 
  alert (a+" , "+ b)
},"json");

И да, возвращаемые данные в виде объекта или массива?

NeilDaniels 21.05.2016 13:04

Alex_63, по двойному клику на строке таблицы серверному php скрипту передаётся id (номер по порядку, он ключ таблицы базы данных). Скрипт по id из нужной строки получает данные из таблицы, формирует массив, возвращает набор данных вызвавшему JS скрипту.
Возвращаемые данные - тот же id, + 11-значное число (номер накладной), 2 адреса (отправителя и получателя), описание товара, и 4-5 чисел (объём/масса груза).
Вернуть их надо в виде массива.
В $.post же массив разобрать, и передать за пределы скрипта. Из этих данных заполняется форма редактирования накладной.

Цитата:

В целом учебная задача такая.
Есть некая форма накладной, данные хранятся в таблице БД. Есть форма вывода данных из ТБД, есть форма добавления накладной.
По двойному клику на строке таблицы должна открываться форма редактирования накладной с уже заполненными полями. (Да, делаю через пятую точку, когда для заполнения полей формы делаю запрос к БД, а не заполняя поля напрямую из строки уже выведенной таблицы. По своим непонятным соображениям). По двойному клику передаю id строки на серверный скрипт, по запросу получаю данные из БД, и застрял на том, что не могу передать данные в div блок, в котором формируется форма редактирования (div блок изначально скрытый, рисуется через jqModal).
З.Ы. Так понимаю, мне этим (web, php, mysql) даже не стоит заниматься, если не могу понять, что мне надо и как это делается?

Alex_63 21.05.2016 14:26

NeilDaniels,
Как-то так:
var arr = [];//назначаем переменную

(function () {
  $("...").on("click",function () {
    $.post("/transmission.php",{"id":id},function(data){
       arr = data;// переназначаем arr
    },"json");
  });

  function setHtml(){
     if(arr.length<1)return;
     var sel = $("#receiv #testdata");
     var str=""; 
     for(var i=0;i<arr.length;i++){
       var L= arr[i];
       if(i==0){str+="ID товара: "+L+"<br>";}
       if(i==1){str+="Номер: "+L+"</br>";}
       if(i==2){str+="Адрес отправителя: "+L+"<br>";}
       if(i==3){str+="Адрес Получателя: "+L+"<br>";}
       if(i==4){str+="Описание: "+L+"<br>";}
       //ну и так далее ...

     }
     sel.html(str);
  };

  //по какому-то событию вызываем функцию setHtml(), чтобы заполнить div данными

})();

laimas 21.05.2016 15:04

Цитата:

Сообщение от NeilDaniels
Возвращаемые данные - тот же id, + 11-значное число (номер накладной), 2 адреса (отправителя и получателя), описание товара, и 4-5 чисел (объём/масса груза).

Зачем гадать всем? Перед операцией выдачи данных (этого массива) клиенту, прописать:

print_r($name), где $name имя массива. В отладчике будет ошибка, но в консоли можно будет увидеть ответ, в котором будет структура данных этого массива. Что давно просят - покажите свои данные, причем не обязательно весь массив, а только первый вложенный его.

NeilDaniels 21.05.2016 16:51

Alex_63,
можно data как-то иначе разобрать? Если, скажем, массив индексный, то можно заполнить новый массив из data[1], data[2] и т.д., а затем передать этот массив в div?

laimas 21.05.2016 17:27

Вы структуру своего массива покажите в конце концов или нет?

Alex_63 21.05.2016 17:59

NeilDaniels,
1. Что значит - разобрать?
2. Нафиг формировать другой массив, когда есть уже массив с данными ?
3. В каком виде он должен вставляться в div ? Опишите, (просто строкой или как ? Чем не нравится мой Вариант ?
4. Как выше сказал laimas, - выложите пример массива!


Часовой пояс GMT +3, время: 14:08.