Цитата:
<form id="form"> while($row = mysqli_fetch_array($rs)) { echo ' <input name="FIO" type="text" value="' . $row['FIO'] . '"> <input name="Phone" type="text" value="' . $row['Phone'] . '"> <input type="submit" value="Сохранить"> '; } </form> Что это будет означать - одна или множество кнопок submit в форме? Ну это же детские ошибки, по поводу которых даже не стоит обращаться на форум. Почему не читаем что это такое mysqli_fetch_array и что она возвращает по умолчанию? Почему не запрашивается нужное или не используется mysqli_fetch_assoc, или mysqli_fetch_object в таком случае? Может ли массив иметь одинаковые индексы или ключи? А коли это знаем, то почему вы рассчитываете получить все поля описывающие значения множества записей из базы именуя их одними и теми же именами? У вас бардак на сервере, а вы ищите ответ на вопрос как на клиенте отправить форму. Наведите порядок на сервере, а затем уже на клиенте ищите ответы. |
Цитата:
<form id="form" method="post" action="handler.php"> <input type="submit" value="Сохранить"> <?php $row=mysqli_fetch_array($rs); foreach(array('FIO','Phone') as $key) echo '<input name="'.$key.'" type="text" value="'.$row[$key].'">'; ?> <input type="submit" value="Сохранить"> </form> <script type="text/javascript"> $('#form').submit(function(e){ e.preventDefault(); var $buttons=$(this).find('[type="submit"]').attr('disabled',true); $.post(this.action,$(this).serialize(),function(res){ $buttons.removeAttr('disabled'); console.log(res); }); }); </script> handler.php: <?php if( $_SERVER['REQUEST_METHOD']!='POST' or !isset($_SERVER['HTTP_X_REQUESTED_WITH']) or $_SERVER['HTTP_X_REQUESTED_WITH']=='XMLHTTPREQUEST' ) exit('Access denied'); $fields=array_reduce(array('FIO','Phone'),function($key){ return isset($_POST[$key])?$_POST[$key]:null; },array()); var_dump($fields); |
Цитата:
mysqli_fetch_array($rs) - это полный кошмар, и для вас непростительный. :) PS. И автор, и вы вслед за ним повторяете непростительную ошибку. ;) |
Sergey1986,
вернувшись к "я не могу понять алгоритм и с чего начать". На картинке по ссылке в общем-то совсем иная задача выполняется, поэтому ставьте задачу конкретно ваших данных и что с ними нужно делать. Пусть у вас данные, это имя и телефон. Вот на "телефон" нужно заострить внимание. Телефон в общем-то есть уникальное значение и при добавлении записи в базу сервер должен проверять уникальность номера, не допуская дубликатов номеров. Это можно возложить и на SQL, определив полю хранящему номер уникальный индекс. Но вопрос в том как он хранится в базе. А его можно хранить как строковое значение, например так 79999999999 или так +79999999999. Это один и тот же номер, но для SQL это будут два разных значения. Поэтому уникальный индекс не в помощь и придется разбираться иначе. Все это к тому, что способ хранения номера может не позволить использовать поле его хранения как уникальный идентификатор записи в базе. Но в SQL существует механизм позволяющий автоматически создавать уникальный идентификатор для каждой записи, это поле с автоинкрементом и уникальным индексом являющееся первичным ключом. А полю хранящему номер определить простой индекс, он поможет в поиске по нему при проверке на уникальность номера при его добавлении. Поля имен и телефонов при выдаче их клиенту нужно связать с этим уникальным идентификатором каждой записи в БД, которой они принадлежат. Без этого вы не сможете без ошибок не обновить данные, не удалить их, если только в условии запроса не использовать значения обеих полей (два этих значения как пара значений должны гарантировать уникальность), что будет гораздо медленнее, чем при использовании первичного ключа. Пусть такое поле создано в таблице и имеет имя id (Примечание: без большой необходимости не используйте в именах SQL таблиц разный регистр, для MySQL что FIO, что fio, что fiO, это одно и тоже, а вот путаницы и ошибок в РНР можно получить прилично, если не следить и не помнить об этом). Встает вопрос как связать поля с идентификаторами их записей. РНР подготавливает данные формы как массив ее полей в суперглобальных массивах. А так как массив не может иметь двух одинаковых индексов и ключей, то именовать одноименные поля формы нужно с добавлением [], индексы РНР сам расставит, согласно порядку поля в форме. По этой же причине имя списка со множественным выбором нужно именовать также - name="name[]", иначе на сервере в массив попадут значения не всех опций выбранных в нем, а только значение последней, из выбранных, опции. Если принудительно указывать индексы в именах полей, то можно управлять порядком элементов формы в полученном на сервере массиве. А если в качестве индексов указывать идентификаторы записей, то свяжем соответствующие поля формы с их записями в базе. При этом - такое именование позволит иметь на сервере практически любую нужную структуру массива. Например, если именовать поля так: <input name="data[1][fio]" value="A" /> <input name="data[1][phone]" value="111" /> <input name="data[2][fio]" value="B" /> <input name="data[2][phone]" value="222" /> <input name="data[3][fio]" value="C" /> <input name="data[3][phone]" value="333" /> то на сервере получим массив: Array ( [data] => Array ( [1] => Array ( [fio] => A [phone] => 111 ) [2] => Array ( [fio] => B [phone] => 222 ) [3] => Array ( [fio] => C [phone] => 333 ) ) ) где под каждым идентификатором записи (1, 2, 3) содержатся значения ее полей fio и phone. Вообще, необходимая структура массива зависит от того, что с данными предполагается делать. Показанная выше структура удобна при обновлении записей, а для вставки записей удобнее будет многомерный массив, вложения которого, это массивы fio и phone. Если форма, которую вы получаете нужна для редактирования записей в базе (обновление/удаление), то кроме этих полей нужно иметь еще и поле определяющее то или иное действие. Вот тут и подошли к последнему вопросу - нужны ли куча кнопок submit в форме или нет? Если предполагается обновление/удаление по одной записи, то на каждую запись (каждые два поля в форме для каждой записи) необходимо иметь две кнопки submit, с именами, например "upd" и "del", а их значениями должны быть идентификаторы записей. Но значение кнопки submit, это текст на кнопке, поэтому использовать в этом случае нужно не type submit, а button - <button name="upd" value="1">Обновить</button> <button name="del" value="1">Удалить</button>. Полям fio и phone при этом не обязательно указывать идентификатор в имени. Клиентский сценарий должен получать соответствующие выбранной кнопке поля, отправляя их вместе с ней серверу. Но можно над записями в базе производить и групповые операции, то есть как вам и хотелось - отправлять форму одной кнопкой. В этом случае сама кнопка на сервере не обязательно и нужна, то есть она может не иметь имени вообще. А для каждой группы полей формы, то есть каждой из записей, добавляется флажок с именем "del" и значением идентификатора записи в базе. Все выбранные флажки будут переданы серверу, сообщая какие записи нужно удалить, а какие обновить. И делается это на сервере "одним махом". Можно писать код используя процедурный стиль даже для объектов, если это возможно. В mysqli возможны оба стиля, но хотя бы пробуйте объектный стиль, почему, понимание придет потом. <? //создаем объект $dbo = new mysqli('host', 'user', 'pass', 'base_name'); //указываем поля нужные, если полей в таблице больше, и в нужном порядке //так как мы свяжем поля с переменными для обработки результата запроса //при этом имена полей таблицы в запросе могут не совпадать с именами переменных, в примере для поля fio //поэтому и важен порядок полей в запросе $sql = 'SELECT id, fio, phone FROM table ORDER BY id'; //подготавливаем запрос и проверяем if($stmt = $dbo->prepare($sql)) { //выолняем запрос $stmt->execute(); //связываем поля в запросе с переменными $stmt->bind_result($id, $name, $phone); echo '<form method="post">'; //выводим форму, добавляя для полей флажок для удаления while ($stmt->fetch()):?> <input name="data[<?=$id?>][fio]" value="<?=$name?>" /> <input name="data[<?=$id?>][phone]" value="<?=$phone?>" /> <label><input type="checkbox" name="del[]" value="<?=$id?>" /> удалить</label> <? endwhile; echo '<button>Отправить</button><form>'; } ?> По отправлению формы сервер получит массив data с ранее показанной структурой. Если будут выбраны флажки для удаления, то и массив del со значениями id записей, которые надо удалить. Далее простая операция по выявлению чего надо делать: if($_POST['del']) { //если есть записи для удаления, вычтем их из массива обновлений $_POST['data'] = array_diff_key($_POST['data'], array_flip($_POST['del'])); //делаем запрос для удаления $sql = 'DELETE FROM table WHERE id IN('.implode(','.$_POST['del']).')'; } //если есть записи для обновления, обвновляем if($_POST['data']) { //..... писать не буду, эту портянку пришлось писать частями в пост, ибо нет времени } Все что здесь написано есть в руководстве, оно не сложно для понимания, нужно только изучать. Примеры написаны без учета фильтрации данных, что вы обязаны делать, и не используются ? в подстановках в подготовленных запросах. Некогда это объяснять, читайте в руководстве. |
Цитата:
В примере js я использовал метод "serialize". Цитата:
PHP в представлении изменять вовсе не собирался. Цитата:
$row=mysqli_fetch_array($rs);Я не стал проверять является ли $rs инстенсом mysqli_result, не проверил и является ли $row массивом. Если у автора по поводу отрисовки формы вопросов не возникло, значит is_array($row)===true, поэтому я подзабил на этот момент, т.к. это не относилось к цели. По-хорошему, конечно, нужно проверять вышеописанное. В использовании процедурного стиля работы с mysqli ничего такого нет. "mysqli_fetch_array" лучше заменить на "mysqli_fetch_assoc", если числовые ключи не нужны. foreach(array('FIO','Phone') as $key) echo '<input name="'.$key.'" type="text" value="'.$row[$key].'">';Судя по коду автора, известно, что из бд тянулись как минимум два поля. Я отрисовывал только одну строку из бд, поэтому не вижу в этом участке чего-либо ужасного (от конкатекации можно было избавится), имена (name) полей уникальные (лучше привести их к нижнему регистру). Про несколько сабмитов писал выше. |
Цитата:
Цитата:
Глупо, но цветочки, а что если таблица содержит BLOB, и также подготавливается массив для передачи, в этом случае не хило можно нагрузить сервер расходом памяти или вообще обрушить его. И ведь для того чтобы использовать нужное и проверять то, как вы пишите, ничего не надо. Данная функция полезна тогда, когда, например, надо объединить в запросе поля двух таблицы имеющих одинаковые имена полей. Ассоциативный набор будет переписан полями второй таблицы, а вот индексный будет содержать поля обеих таблиц. Нужно использовать по потребности. А ошибка в том, что разговор идет, даются советы, а похоже, что автор и сам не знает с чем придется работать, и в первую очередь с идентификацией данных, и его не спрашивают. А ведь это определяющее. |
Цитата:
|
Цитата:
|
Ребята спасибо за ваше отзывчивость! Все верно подмечено, я на скорую руку накидал пример (и он с ошибкой), кнопка "сохранить" одна. полей от 2х до 10ти может быть. Сборку данных их формы хотел бы сделать методом serialize() и отпарвить ajax ом
|
Цитата:
Заранее блогадарен! |
Часовой пояс GMT +3, время: 10:25. |