ID должен быть уникальным для каждой обновляемой строки. В базе у вас колонка ID, в ней значения. 1, 2, 3, 4, 5... Вот их и надо передавать обработчику.
Так он у меня уникальный для каждой строки... У меня с названиями ID беда. Я же вам говорю... У меня как получается, запускается цикл for Далее рисуется строка №1 из таблицы, заполняется нужными значениями. И допустим значению "1" из колонки ID присваивается input id='ID'. Следующей строке, где значение из колонки ID равно "2", присваивается так же input id='ID' В итоге получается что для ста значений одно название, которое и принимает JS. Поэтому у меня не получается... Вот пока что не знаю как исправить.
Так делайте массив названий. В HTML для input типа text это решается двумя способами. Либо к названию, через разделитель например, добавляется значение ID. Например name=ID_25, а обработчик уже извлекает из полученных ключей пару ключ=значение(ID=25). Либо же добавлением к названию квадратных скобок. Например ID[] Или же, что более конкретно ID[25]
Спасибо. Наверное идея с массивами подойдет мне. Скажите, допустим я сделаю массивы ID,ZN1,ZN2 через квадратные скобки вот так: Код (Text): echo "<tr><td><input type='text' value=$row[0] input id='ID[]'></td><td><input type='text' value=$row[1] input id='ZN1[]'></td><td><input type='text' value=$row[2] input id='ZN2[]'></td><td><input type=button id='btn' value='Изменить'></td></tr>"; Для начала мне же нужно будет передать массив в JS, а потом в обработчик... Передавать массив в JS нужно как то иначе, нежели переменную?
Нет. По-другому нужно обрабатывать. Допустим, так: PHP: echo $_POST['key']; вы обрабатываете строчное значение. А вот так: PHP: print_r ($_POST['key']); массив. Потренируйтесь на простой форме. Без JS.
С обработкой переменной и массива понятно. Не получается собрать массив...Я что то неправильно делаю. Вот часть кода Код (Text): input id='ID[]' Этот фрагмент кода не собирает массив. Допустим если бы было так: Код (Text): for($i=1;$i<=100;$i++) { echo <<<HTML <form action='обработчик.php' method='post'> <input type='hidden' name=info[] value='$i'> <button type="submit" class="btn">Отправить в обработчик</button> </form> HTML; Тогда бы в обработчик отправился бы массив info содержащий в себе значения от 0 до 100. А как собрать массив для передачи в JS, пока что непонятно...
Я разобрался и с формами и с переменными. И с тем как их отправлять в JS Теперь только вот в чем застрял: Код (Text): $R = array("php", "html", "css"); echo <<<HTML <input type='hidden' id='R' name='R' value='$R'> HTML; Таким образом в JS из PHP передается пустой массив...Подскажите мне пожалуйста, как массив через JS передать в обработчик...
Не подошел мне к сожалению метод с массивами... Похоже всё из-за цикла for... У меня же таблица из БД выводится построчно через цикл for. Вытягиваю из БД первую строчку, запихиваю её в массив. Далее из этого массива формирую строчку И так прогоняю эту строчку через цикл for, что бы вся таблица вышла... Если допустим я в 50 строчке нажимаю изменить значения То если отправлять через PHP (POST) сразу в обработчик, то всё нормально, значения из строк берутся нужные А если отправлять через AJAX, то почему то при изменение данных в любой строке, в обработчик отправляются значения первой строки... Код (Text): for($i=1;$i<=100;$i++) { # Записываем строчку в массив $query ="SELECT * FROM `ajax` WHERE ID = '$i'"; $result = mysqli_query($mysqli, $query) or die("ERORRRR " . mysqli_error($mysqli)); $row = mysqli_fetch_row($result); echo <<<HTML <tr><td><input type='text' value=$row[0] input id='ID'></td><td><input type='text' value=$row[1] id=ZN1 name ="ZN1[]"></td><td><input type='text' value=$row[2] input id='ZN2'></td><td><input type=button id='btn' value='Изменить'></td></tr> HTML; }
Еще раз. Вы не передаете ID записи в базе обработчику. В атрибуте name он должен быть задан явно. Указывая его вот так attrname[] и отправляя один элемент, там будет задан ключ 0
Спасибо за помощь, но я пока что не понимаю...Попробую обмозговать...И у меня же нет атрибута name... Меня вводит в замешательство следующее, вот код: Код (Text): for($i=1;$i<=100;$i++) { # Записываем строчку в массив $query ="SELECT * FROM `ajax` WHERE ID = '$i'"; $result = mysqli_query($mysqli, $query) or die("ERORRRR " . mysqli_error($mysqli)); $row = mysqli_fetch_row($result); echo <<<HTML <input type='hidden' id='R' name='R' value='$i'> <tr><td><input type='text' value=$row[0] input id='ID'></td><td><input type='text' value=$row[1] id=ZN1 name ="ZN1[]"></td><td><input type='text' value=$row[2] input id='ZN2'></td><td><input type=button id='btn' value='Изменить'></td></tr> HTML; } Как такое возможно, что в этом скрипте в части запроса к БД "WHERE ID = '$i" переменная $i согласно циклу for меняет своё значение от 0 до 100. Так же в части скрипта name='R' value='$i' переменная $i меняет своё значение от 0 до 100. Но при этом в JS значение id='R' всегда равно 1... Я думал если я нажимаю кнопку в 50-ой строчке, то и в JS должен id='R' уйти со значением 50... Во всяком случае спасибо, что объясняли мне, попробую разобраться...
В примере на чистом html вы отправляете всю форму целиком. Ключи массива имен полей ввода задаются от нуля до ста автоматически. В примере с js вы отправляете одно имя в массиве. Там задается ключ 0. Задайте ключ явно. name='atrrname[25]'
Скажите, я правильно понял. Что в моем примере, из html формы отправляются ID, ZN1, ZN2, которые уже являются массивами с автоматически проставленными ключами от 0 до 100. В JS скрипте, эти массивы отправляются в обработчик с ключом 0 по умолчанию (а это значения первой строки). А atrr(name) метод который позволяет задать ключ, и вытащить нужное значение из массива? (В моем случае из массивов ID,ZN1,ZN2)
Нет, не правильно. Атрибуты name в [] в конце имени будут преобразованы в массив. То есть ключи будут проставлены уже после нажатия кнопки. Если в [] будет что-то указано, то оно ключом и будет назначено. Не важно что это будет - число или строка. Например Код (Text): <input type=text name="text[key]" value=""> Для понимания механизма замените тип текст на чекбокс. Они отправляются только если активированы.
Давайте пожалуйста ещё раз пошагово посмотрим мой пример: 1) Я запускаю цикл for, после которого все ниже приведенные действия должны выполнится сто раз поодряд. И для каждого выполнения переменная $i будет увеличиваться на 1 2) При помощи PHP я вытаскиваю из БД строчку следующего типа: 1#это ID | 34#это первое значение ZN1 | 48#это второе значение ZN2 Эти параметры будут разные для каждой строчки 3) Рисую все эти строчки при помощи HTML 4 Подготавливаю форму HTML для обработки в JS Фрагмент кода где я обрабатываю значение строки ZN1 для JS (что бы JS смог взять нужную цифру) <td><input type='text' value=$row[1] input data-id1='$row[1]' name=ZN1> Как я понимаю в этой строке data-id1 из массива $row берет нужную мне цифру 5) Закрываю цикл for Теперь в JS я пытаюсь прочитать значение data-id1 var ZN1 = $(this).data("id1"); Так у меня ничего не получается, JS не видит значения... К сожалению я всё ещё не могу понять, правильно ли я делаю в пункте 4 и правильно ли я обрабатываю значение в JS. P.S. Если бы допустим моя таблица состояла бы из одной строки: Я бы сделал так: <td><input type='text' value=$row[1] input id='ZN1' name=ZN1> А в JS вот так: var ZN1 = $('#ZN1').val(); И всё бы работала... Но в моем случае есть цикл for который усложняет процесс...
У вас изначально неправильный подход к написанию сценария. Он основывается на том, что php и html его части заведомо рабочие. А сейчас вы говорите, что в этом не уверены. Сделайте форму на чистом html - проверьте валидатором. Извлеките из БД необходимые данные, проверьте, что они именно те, что нужны для формы. Отладьте сгенерированную из этих данных форму и обработчик. И только потом уже переходите к js.
Я разобрался с PHP и HTML У меня была ошибка в том, что когда я запускал цикл for, я закрывал открытую в цикле форму, после цикла...А нужно для каждого цикла делать свою форму... Теперь у меня через PHP при нажатии кнопки отправить, в обработчик попадает то что нужно...Для каждой строчки свои значения Теперь я так понимаю нужно полностью форму в JS передать?
Не обязательно. Но можно. Можно отдельными элементами. А можно вместо одной формы сделать сто. Так, кстати, будет правильней, для noscript http://htmlbook.ru/html/noscript
Я сделал так: Код (Text): for($i=1;$i<=100;$i++) { # Записываем строчку в массив $query ="SELECT * FROM `ajax` WHERE ID = '$i'"; $result = mysqli_query($mysqli, $query) or die("ERORRRR " . mysqli_error($mysqli)); $row = mysqli_fetch_row($result); echo "<form method='POST' id='form'>"; echo "<table>"; echo <<<HTML <tr><td><input type='text' value=$row[0] id=ID name=ID></td><td><input type='text' value=$row[1] id=ZN1 name=ZN1></td><td><input type='text' value=$row[2] ID=ZN2 name=ZN2></td><td><input type=button id='btn' value='Изменить'></td></tr> HTML; echo "</form>"; } echo "</table>"; В JS так: Код (Text): fetch_data(); $(document).on('click', '#btn', function(){ var serializeFormData = $('#form').serialize(); $.ajax({ url:"update.php", method:"POST", data:serializeFormData, dataType:"html", success:function(data) { alert(data); fetch_data(); } }) }); В обработчике update.php просто написал var_dump($_POST); В итоге у меня при нажатии на кнопку изменить на любой строчке, в обработчик всегда приходят значения последней строки... Странно, без JS всё нормально работает, если из PHP через POST передавать значения в обработчик, то для каждой строчки свои значения уходят. Как только передаю форму в JS, опять только для одной строчки уходят значения (последняя строка...)
Понятно. Или если по другому говоря, скрипт PHP запускается, выполняется от начала до конца файла, и в конце файла как раз в последнем цикле (100-ом), записывает в name последние значения... Скажите пожалуйста, именно мой метод (цикл for), возможно подкорректировать что бы атрибуты name были разные, и то чего я добиваюсь заработало..Или лучше выводить таблицу как то подругому, без цикла for...
Я так уже пробовал так делать. При нажатии кнопки, получаю ошибку ERROR: Truncated incorrect DOUBLE value: 'Array'