Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   передача большого количества переменных из PHP в JS (https://javascript.ru/forum/dom-window/68146-peredacha-bolshogo-kolichestva-peremennykh-iz-php-v-js.html)

dasser 28.03.2017 18:01

передача большого количества переменных из PHP в JS
 
уважаемые комрады, помогите новичку (с JS у меня слабо).
При изминении в форме поля "num_contr" обновляет зависимое поле.
рабочий кусок кода в JS:
$(document).ready(function() 
{ 
 $('input[type=text]:text').change(function (){
 $.post("ajax_all.php", { "num_contr" : $('input[type=text]').val()},

 function(data){
var	details = $("#pr1").val(data);
 });
});
   });

в ajax_all.php
.... echo $row['pr1p'];
выводит результат одного запроса из мускула и бросает его в поле с id pr1.

Ну;но, так же при изминении поля "num_contr", выводить результат php-запроса в мускул только на более 200 переменных и подставлять их в соответствующие id форми.
для наглядности id соостветствуют переменным, следующим образом (id - переменная): pr1 - pr1p, pr2 - pr2p, pr3- pr3p, ...
ps: не пойму как вывести значения множества переменных из отдельного php-обработчика в функцию для подстановки значений по id поля формы, при изменении одного поля, не утяжеляя"велосипедами" код.

laimas 28.03.2017 18:56

Ничего не понятно, единственное, что можно сказать, это следующим образом (id - переменная): pr1 - pr1p, pr2 - pr2p, pr3- pr3p - для того чтобы связать поля формы с идентификаторами записей в базе, не требуется pr1 - pr1p, pr2 - pr2p, pr3- pr3p и прочего подобного, вообще никаких ID полям формы задавать не надо.

dasser 28.03.2017 19:00

Цитата:

Сообщение от laimas (Сообщение 448730)
Ничего не понятно, единственное, что можно сказать, это следующим образом (id - переменная): pr1 - pr1p, pr2 - pr2p, pr3- pr3p - для того чтобы связать поля формы с идентификаторами записей в базе, не требуется pr1 - pr1p, pr2 - pr2p, pr3- pr3p и прочего подобного, вообще никаких ID полям формы задавать не надо.

мне их нужно привязывать так как форма со временем будет изменять, так проще редактировать, но если даже и привязывать по IS нет смысла, то как ??

laimas 28.03.2017 19:02

Цитата:

Сообщение от dasser
мне их нужно привязывать так как форма со временем будет изменять, так проще редактировать

К чему привязать? Причем туи изменения формы и привязка с СУБД? То есть по вашему геморрой именований pr1 - pr1p, pr2 - pr2p, pr3- pr3p да еще в свете "изменяться", это удобно?

dasser 28.03.2017 19:08

Цитата:

Сообщение от laimas (Сообщение 448732)
К чему привязать? Причем туи изменения формы и привязка с СУБД? То есть по вашему геморрой именований pr1 - pr1p, pr2 - pr2p, pr3- pr3p да еще в свете "изменяться", это удобно?

хорошо, а как без привязки? если полей, в которые предпологаеться вставка данных мускульного запроса больше 200?
Может я и придумываю велосипед, из того что умею, по-этому у вас тут и прошу помощи

laimas 28.03.2017 19:18

Цитата:

Сообщение от dasser
хорошо, а как без привязки?

А почему "привязать", это обязательно задать ID полю, причем какое-то дикое, типа pr1p? Вы думаете о том как серверу потом разбираться с этой требухой?

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

Форма отправляется как имя поля (ключ) = значение. Что вам мешает связать имена полей с идентификаторами из базы?

name="record[234]"
name="record[1203]"

где цифры, это ключи записей в СУБД. В зависимости от метода передачи формы сервер получит GET/POST массив record, в котором ключи, это идентификаторы записей в базе, а значения, значения полей ее, которые редактировались.

dasser 28.03.2017 19:32

Цитата:

Сообщение от laimas (Сообщение 448737)
Что вам мешает связать имена полей с идентификаторами из базы?

собственно у меня так и есть.
Цитата:

Сообщение от laimas (Сообщение 448737)
Вы думаете о том как серверу потом разбираться с этой требухой?

пользоваться этим буду только я, и никакой другой пользователь, чем особо нагрузка не будет заметна в общем потоке.
разницы в имени поля и ID (который нужен для вставки (как я понимаю) путем выполнения JS) тоже нет ?
ну а по сути, каким образом можно решить эту сложную задачу в виде примера?

laimas 28.03.2017 19:41

Цитата:

Сообщение от dasser
разницы в имени поля и ID (который нужен для вставки (как я понимаю) путем выполнения JS) тоже нет ?

Зачем вам id у полей формы?

Чтобы понять о какой задаче речь, нужно видеть форму (часть ее) с пояснением задачи.

dasser 28.03.2017 19:50

вот кусок
<form action="#"  method="POST" enctype="multipart/form-data" name="addcom" id="addcom" onSubmit="return false">
<input name="num_contr" type="text" size="150" id="num_contr" required>
<!-- ... -->
<table class="research">
                <tbody>
                    <tr class="accordion">
                        <td colspan="3" class="vt">ВТ</td>
                    </tr>
                    <tr><td class="corr">....</td><td><input / type="Text" name= "prpvt" id="prpvt"></td></tr>
                    <tr><td>....</td><td><input / type="Text" name= "pdrpvt" id="pdrpvt"></td></tr>
                    <tr><td class="corr">....</td><td><input / type="Text" name= "rzrpvt" id="rzrpvt"></td></tr>
                    <tr><td>....</td><td><input / type="Text" name= "drpvt" id="drpvt"></td></tr>
                    <tr><td class="corr">....</td><td><input / type="Text" name= "ppvt" id="ppvt"></td></tr>
                    <tr><td class="corr">....</td><td><input / type="Text" name= "dkt" id="dkt"></td></tr>
					<!-- ... -->
				</tbody>
</table>
<input class="adscom" name="button" id="start" type="button" value='генерить' onclick="doLoad(document.getElementById('addcom'))">
</form>

и кусок
$(document).ready(function() 
{ 
 $('input[type=text]:text').change(function (){
 $.post("ajax_all.php", { "num_contr" : $('input[type=text]').val()},

 function(data){
var	details = $("#prpvt").val(data);
 });
});
   });

и массив из обработчика (ajax_all.php):
$data = array(
    'pdrpvt' => $row['pdrpvt'],
    'rzrpvt' => $row['rzrpvt'],
    'drpvt' => $row['drpvt'],
    'ppvt' => $row['ppvt'],
    'dkt' => $row['dkt']
);
echo json_encode($data);

laimas 28.03.2017 20:04

И что за задача?

dasser 28.03.2017 20:42

ножно данные json_encode($data) вывести в соответствующих таким же id Полях формы

laimas 28.03.2017 20:55

Куда их вывести и зачем?

В чем сама суть вопроса:

есть записи в базе, которые нужно редактировать, которые выводятся в форму и нужно связать поля этой формы с идентификаторами записей в базе?

или

есть форма, которой нужно добавлять N записей в соответствующие поля таблицы базы?

dasser 28.03.2017 21:09

в данном случае есть форма в которой есть ряд полей, одно из них
<input name="num_contr" type="text" size="150" id="num_contr" required>
которого даеться запрос в базу и результат должен выдаваться в поля
<tr><td>....</td><td><input / type="Text" name= "pdrpvt" id="pdrpvt"></td></tr>
                    <tr><td class="corr">....</td><td><input / type="Text" name= "rzrpvt" id="rzrpvt"></td></tr>
                    <tr><td>....</td><td><input / type="Text" name= "drpvt" id="drpvt"></td></tr>
                    <tr><td class="corr">....</td><td><input / type="Text" name= "ppvt" id="ppvt"></td></tr>
                    <tr><td class="corr">....</td><td><input / type="Text" name= "dkt" id="dkt"></td></tr>

зачем, - для дальнейшей генерации документа (но это уже другая, реализованная, история)

laimas 28.03.2017 21:24

У вас код представленный, это отправка данных, по которой можно сказать следующее, что вот так отправить значение одного поля можно

{ "num_contr" : $('input[type=text]').val()}

а множества полей не стоит, есть в JQ методы для этого: .serialize() и .serializeArray().

Далее написан код обработчика полученных данных ajax_all.php. Каким тут боком и для чего echo json_encode($data); я ума не приложу.

Далее шла речь "ну так это чего-то одно... а как если много...". Много чего? Вы описываете так свою задачу, что чем дальше тем темнее.

В сторону пока JS. Есть поля в базе: a, b и c, и записи под id 10 и 12. Требуется получить эти записи, отредактировать и обновить их в базе. Для этого получаем записи из базы и в цикле строим форму. Связываем имена полей формы по ключам базы (записей):

<form method="post">
<input name="as[10][a]" value="value a-1" />
<input name="as[10][b]" value="value b-1" />
<input name="as[10][c]" value="value c-1" />
<input name="as[12][a]" value="value a-2" />
<input name="as[12][b]" value="value b-2" />
<input name="as[12][c]" value="value c-2" />
<button>GO</button>
</form>

Отправьте эту форму и выведите полученное:

<pre>
print_r($_POST);
<pre>


Понятно по этому массиву, что и как обновить? Нужны ли для этого ID у полей формы?

laimas 28.03.2017 21:26

У вас же в коде какая-то кнопка "генерить", чего генерить...

Если речь идет о запросе в базу и построение формы по JSON данным ответа, то причем тут { "num_contr" : $('input[type=text]').val()} в запросе?

Вы конкретно можете описать задачу или...?

dasser 28.03.2017 21:40

мне не нужно в цикле строить форму, не нужно обновлять дане в базе. Зачем усложнять у уточнять (переделывать в корне) то что уже сделано? нужно только одно: данные массива json_encode($data);
$data = array(
    'pdrpvt' => $row['pdrpvt'],
    'rzrpvt' => $row['rzrpvt'],
    'drpvt' => $row['drpvt'],
    'ppvt' => $row['ppvt'],
    'dkt' => $row['dkt'],
    ...

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

dasser 28.03.2017 21:44

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

laimas 28.03.2017 21:46

Цитата:

Сообщение от dasser
разве это не понятно было изначально?

Вы на код свой посмотрите, разве из него что-то можно понять, тем более о JSON?

Я вас русским языком и об этом спрашивал - форма строится на клиенте по JSON данным получаемым из базы? Каков ваш ответ был?

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

dasser 28.03.2017 21:52

Цитата:

Сообщение от laimas (Сообщение 448761)
Я вас русским языком и об этом спрашивал - форма строится на севере по JSON данным получаемым из базы?

Цитата:

Сообщение от dasser
Что вам мешает связать имена полей с идентификаторами из базы?
собственно у меня так и есть.

но, форма не строиться на сервере!

laimas 28.03.2017 21:55

Цитата:

Сообщение от dasser
но, форма не строиться на сервере!

Это я ошибся, и исправил. ;)

Словами задачу опишите что к чему и причем тут проблемы с pr1 - pr1p, вкупе с отправкой $('input[type=text]').val(), и как это увязать с JSON?

dasser 28.03.2017 22:06

в данный момент у меня через форму, в которой есть больше 200 полей, при ищменении одного конкретного поля (num_contr) отправляется цифра (переменная) в ajax_all.php для запроса в базу, после чего выводится результат запроса (тоже одно значение, не массив) в ДРУГОЕ (pr1) поле формы.Но а мне нужно чтобы при изменении num_contr, после результата выполнения ajax_all.php которым будет массив даных
$data = array(
    'pdrpvt' => $row['pdrpvt'],
    'rzrpvt' => $row['rzrpvt'],
    'drpvt' => $row['drpvt'],
    'ppvt' => $row['ppvt'],
    'dkt' => $row['dkt']

каждое значение которого будет выводиться в разные поля той же формы.

dasser 28.03.2017 22:11

т.е. если сейчас при выполнении
$(document).ready(function() 
{ 
 $('input[type=text]:text').change(function (){
 $.post("ajax_all.php", { "num_contr" : $('input[type=text]').val()},

 function(data){
var	details = $("#pr1").val(data);
 });
});
   });

результат выводится в одно поле формы с id pr1, то как вывести результат массива в разные поля той же формы?

laimas 28.03.2017 22:26

Если сервер возвращает $data как JSON, то так:

$('input[type=text]:text').change(function (){
    var f = $(this).closest('form'); //предполагается, что форма уже на странице и источник запроса принадлежит ей
    $.post("ajax_all.php", { "num_contr" : this.value}, function(data){
        $.each(data, function(k, v) {
            f.append('<input name="'+k+'" value="'+v+'">')
        })
    }, 'json');
});

dasser 28.03.2017 22:33

$(document).ready(function() {
.. сначало не нужно ?

laimas 28.03.2017 22:34

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

PS. То-есть, думаю сами поймете как вставить не просто поле формы, но и поместить его в ячейку таблицы.

dasser 28.03.2017 22:40

ага, а в ajax_all.php :
$js_obj = json_encode($arr);
print $js_obj;

?, где $arr - массив? приавильно ?

laimas 28.03.2017 22:42

Ну можно и проще:

exit(json_encode($arr));


зачем посредники, которые не нужны.

laimas 28.03.2017 22:50

Можно и проще, без не нужных посредников - echo json_encode($arr);
И вообще без формирования промежуточного массива $data, так как судя по коду это лишняя операция. То есть сразу echo json_encode(mysql_fetch_assoc($result));

laimas 28.03.2017 22:50

Кошмарит форум по полной.

dasser 28.03.2017 22:52

да, выполняеться. но куда выводит, не пойму - name="'+k+'" value="'+v+'

dasser 28.03.2017 22:58

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

laimas 28.03.2017 23:01

Эта операция

$data = array(
'pdrpvt' => $row['pdrpvt'],
'rzrpvt' => $row['rzrpvt'],
'drpvt' => $row['drpvt'],
'ppvt' => $row['ppvt'],
'dkt' => $row['dkt']

никчемная, так как фактически вы заново указываете уже существующие ключи. То есть, если запрос возвращает одну строку, то сразу отдаем массив (а результат запроса, это массив) как JSON (естественно проверив возвращено ли что-то запросом):

echo json_encode(mysql_fetch_assoc($result));

На клиенте это будет объект (нет в JS ассоциативных массивов), в котором ключи переданного массива будут его свойствами. В цикле $.each ключ массива (k) присваивается имени поля формы, а значение (v) его значению.

dasser 28.03.2017 23:08

Цитата:

Сообщение от laimas (Сообщение 448778)
Эта операция никчемная, так как фактически вы заново указываете уже существующие ключи. То есть, если запрос возвращает одну строку, то сразу отдаем массив

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

dasser 29.03.2017 09:34

laimas, попробовал, и что получилось:
форма осталась не тронутая (т.е. те поля в которых ожидалась вставка - пустые), но после формы появились новые поля типа - <input name="pdrpvt" value="1">, данные выводяться с названиями и значениями соответственно правильно.
Но нужно чтобы заполнялись существующие поля формы, а не формировались новые.

laimas 29.03.2017 12:03

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

Селектор своей формы надо было...

var f = $(this).closest('form'); $('#addcom');

laimas 29.03.2017 12:13

Цитата:

Сообщение от dasser
нужно чтобы заполнялись существующие поля формы, а не формировались новые.

Это как понять?

dasser 29.03.2017 12:18

laimas, попробовал, то же самое - создает новые inputы.
прочитал в докум-ции - Метод .append() вставляет указанное содержимое как ПОСЛЕДНИЙ элемент в каждом из элементов коллекции jQuery.
возможно нужно каким то образом уточнить именно подстановку в существующие поля?

dasser 29.03.2017 12:24

Цитата:

Сообщение от laimas (Сообщение 448817)
Это как понять?

было:
<tr><td>....</td><td><input / type="Text" name= "pdrpvt" id="pdrpvt"></td></tr>
                    <tr><td class="corr">....</td><td><input / type="Text" name= "rzrpvt" id="rzrpvt"></td></tr>
                    <tr><td>....</td><td><input / type="Text" name= "drpvt" id="drpvt"></td></tr>
                    <tr><td class="corr">....</td><td><input / type="Text" name= "ppvt" id="ppvt"></td></tr>
                    <tr><td class="corr">....</td><td><input / type="Text" name= "dkt" id="dkt"></td></tr>

после изминения
<input name="num_contr" type="text" size="150" id="num_contr" required>

внизу добавилось
<input id="prpvt" value="1">
<input id="pdrpvt" value="">
<input id="rzrpvt" value="">
...

laimas 29.03.2017 12:25

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

А вы хотите заменять пришедшим существующее, то есть у вас в форме уже есть поля? А они откуда взялись?

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

Если надо замещать существующие поля, значит нужно имеющиеся в форме поля удалять при вставке новых, то есть вот так:

var f = $('#addcom').empty();

dasser 29.03.2017 12:34

Цитата:

Сообщение от laimas (Сообщение 448822)
Все правильно, этот метод добавляет указанные элементы в указанное.

А вы хотите заменять пришедшим существующее, то есть у вас в форме уже есть поля? А они откуда взялись?

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

Если надо замещать существующие поля, значит нужно имеющиеся в форме поля удалять при вставке новых, то есть вот так:

var f = $('#addcom').empty();

я не однократно писал что форма и поля уже существуют, и (в дополнении) значения их после изменения одного поля, нужно подставлять данные из массива пришедшего от обработчика.
Цитата:

каждую переменную вывести в уже готовые поля формы


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