передача большого количества переменных из 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 поля формы, при изменении одного поля, не утяжеляя"велосипедами" код. |
Ничего не понятно, единственное, что можно сказать, это следующим образом (id - переменная): pr1 - pr1p, pr2 - pr2p, pr3- pr3p - для того чтобы связать поля формы с идентификаторами записей в базе, не требуется pr1 - pr1p, pr2 - pr2p, pr3- pr3p и прочего подобного, вообще никаких ID полям формы задавать не надо.
|
Цитата:
|
Цитата:
|
Цитата:
Может я и придумываю велосипед, из того что умею, по-этому у вас тут и прошу помощи |
Цитата:
Поля формы есть коллекция элементов и JS вполне может получить эту коллекцию для работы с ней и ID для этого совсем не нужны. А вот если среди коллекции нужно индивидуально обратиться к одному элементу, тогда и полезен будет ID у такого поля. Форма отправляется как имя поля (ключ) = значение. Что вам мешает связать имена полей с идентификаторами из базы? name="record[234]" name="record[1203]" где цифры, это ключи записей в СУБД. В зависимости от метода передачи формы сервер получит GET/POST массив record, в котором ключи, это идентификаторы записей в базе, а значения, значения полей ее, которые редактировались. |
Цитата:
Цитата:
разницы в имени поля и ID (который нужен для вставки (как я понимаю) путем выполнения JS) тоже нет ? ну а по сути, каким образом можно решить эту сложную задачу в виде примера? |
Цитата:
Чтобы понять о какой задаче речь, нужно видеть форму (часть ее) с пояснением задачи. |
вот кусок
<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); |
И что за задача?
|
ножно данные json_encode($data) вывести в соответствующих таким же id Полях формы
|
Куда их вывести и зачем?
В чем сама суть вопроса: есть записи в базе, которые нужно редактировать, которые выводятся в форму и нужно связать поля этой формы с идентификаторами записей в базе? или есть форма, которой нужно добавлять N записей в соответствующие поля таблицы базы? |
в данном случае есть форма в которой есть ряд полей, одно из них
<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> зачем, - для дальнейшей генерации документа (но это уже другая, реализованная, история) |
У вас код представленный, это отправка данных, по которой можно сказать следующее, что вот так отправить значение одного поля можно
{ "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 у полей формы? |
У вас же в коде какая-то кнопка "генерить", чего генерить...
Если речь идет о запросе в базу и построение формы по JSON данным ответа, то причем тут { "num_contr" : $('input[type=text]').val()} в запросе? Вы конкретно можете описать задачу или...? |
мне не нужно в цикле строить форму, не нужно обновлять дане в базе. Зачем усложнять у уточнять (переделывать в корне) то что уже сделано? нужно только одно: данные массива json_encode($data);
$data = array( 'pdrpvt' => $row['pdrpvt'], 'rzrpvt' => $row['rzrpvt'], 'drpvt' => $row['drpvt'], 'ppvt' => $row['ppvt'], 'dkt' => $row['dkt'], ... т.е. каждую переменную вывести в уже готовые поля формы. разве это не понятно было изначально? |
я не буду выливать всю форму сюда, чего вы добиваетесь. есть конретная задача с узким направлением, вот я ее и пытаюсь решить
|
Цитата:
Я вас русским языком и об этом спрашивал - форма строится на клиенте по JSON данным получаемым из базы? Каков ваш ответ был? Я же не ясновидящий, а код и главное комментарий к нему вообще не понять. |
Цитата:
Цитата:
|
Цитата:
Словами задачу опишите что к чему и причем тут проблемы с pr1 - pr1p, вкупе с отправкой $('input[type=text]').val(), и как это увязать с JSON? |
в данный момент у меня через форму, в которой есть больше 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'] каждое значение которого будет выводиться в разные поля той же формы. |
т.е. если сейчас при выполнении
$(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, то как вывести результат массива в разные поля той же формы? |
Если сервер возвращает $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'); }); |
$(document).ready(function() {
.. сначало не нужно ? |
Нужно конечно, просто я только основное написал, и так форум глючит, и чем больше кода вставляется тем больше глюков.
PS. То-есть, думаю сами поймете как вставить не просто поле формы, но и поместить его в ячейку таблицы. |
ага, а в ajax_all.php :
$js_obj = json_encode($arr); print $js_obj; ?, где $arr - массив? приавильно ? |
Ну можно и проще:
exit(json_encode($arr)); зачем посредники, которые не нужны. |
Можно и проще, без не нужных посредников - echo json_encode($arr);
И вообще без формирования промежуточного массива $data, так как судя по коду это лишняя операция. То есть сразу echo json_encode(mysql_fetch_assoc($result)); |
Кошмарит форум по полной.
|
да, выполняеться. но куда выводит, не пойму - name="'+k+'" value="'+v+'
|
не только форум но и сайт моего хостера :( странная реакция. вроде как сервер упал, но потом все возобновилось (довольно быстро), как будтно ддос
|
Эта операция
$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) его значению. |
Цитата:
понимаю что должно работать, но хочу проверить завтра вывод на всей форме, с реальными данными. пока спасибо, отпишусь по результату. |
laimas, попробовал, и что получилось:
форма осталась не тронутая (т.е. те поля в которых ожидалась вставка - пустые), но после формы появились новые поля типа - <input name="pdrpvt" value="1">, данные выводяться с названиями и значениями соответственно правильно. Но нужно чтобы заполнялись существующие поля формы, а не формировались новые. |
Я в коде написал комментарий к тому, как получаем форму. Я же не держу все в уме, а открывать страницы ища чего там у вас когда сервер на ладан дышит тоже не из приятного.
Селектор своей формы надо было... var f = |
Цитата:
|
laimas, попробовал, то же самое - создает новые inputы.
прочитал в докум-ции - Метод .append() вставляет указанное содержимое как ПОСЛЕДНИЙ элемент в каждом из элементов коллекции jQuery. возможно нужно каким то образом уточнить именно подстановку в существующие поля? |
Цитата:
<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=""> ... |
Все правильно, этот метод добавляет указанные элементы в указанное.
А вы хотите заменять пришедшим существующее, то есть у вас в форме уже есть поля? А они откуда взялись? Я вас просил описать словами конкретно задачу - что, зачем, почему. Этого не было сделано, ну а я не фокусник. Если надо замещать существующие поля, значит нужно имеющиеся в форме поля удалять при вставке новых, то есть вот так: var f = $('#addcom').empty(); |
Цитата:
Цитата:
|
Часовой пояс GMT +3, время: 22:11. |