У меня есть переменное количество полей в форме. Количество текстовых полей определяется пользователем с помощью функции в jquery, но конечный код формы (пример) таков:
<form id='form_educ' name='form_educ' method='post' action='form/educ.php'> <div id='educ'> <input type='text' name='date1' id='date1'/> <input type='text' name='date2' id='date2'/> <input type='text' name='date3' id='date3'/> <input type='text' name='date4' id='date4'/> .... </div> <input type='submit' name='form_educ' value='Refresh'/> </form>
Эти текстовые поля при добавлении пользователем создают sql INSERT TO
(в другом файле):
$date = clean($_GET['date']); "INSERT INTO educ (index_of_form, date, email) VALUES('$index', '', '" .mysql_real_escape_string($_SESSION['SESS_EMAIL']). "')";
$date
– дата1 или дата2 или дата3 или дата4 (пример).
Теперь в файле educ.php
я хочу обновить все текстовые поля в базе данных mysql.
Обычно это
$example = clean($ _POST ['example']);
Я могу сделать обновление в таблице и разрешено.
Но в моем случае, как я могу получить все значения текстового поля в форме и установить $_POST
var, если количество полей является переменной (может быть date1, date2, date3, date4)?
Я не могу придумать, почему имя поля формы не должно быть неизвестной переменной. Если вы не имеете дело с повторяемыми полями, в этом случае вы должны использовать массив, например, dates[]
, и вы знаете, чего ожидать в сценарии процесса.
Дополнительную информацию см., Например: http://www.web-design-talk.co.uk/58/adding-unlimited-form-fields-with-jquery-mysql/
Слово предупреждения для будущего. Когда вы сделаете поле повторяемым, разрешите пользователям также удалять поля, которые они могут случайно вставить. Следите за тем, чтобы в скрипте процесса отсутствовали ключи массива (числовой индекс от 0 до 10 может отсутствовать некоторые значения, если пользователь удалил некоторые поля формы перед отправкой). Вы можете сбросить ключи массива с помощью функции array_merge . Отсутствующие ключи являются проблемой, если у вас есть два массива, которые вы пытаетесь добавить в базу данных, как синхронизированные.
Обновлено для ответа на комментарий.
Извините, я не задал ваш вопрос. Вам необязательно использовать скрытое поле. Вам нужна структура базы данных для соответствия вашей функции форм: для поддержки отношений друг к другу. В конце концов вы вставляете несколько дат, относящихся к одному человеку, или к определенному типу событий, или к тому, что когда-либо. Предположим, что один пользователь хочет добавить свои три любимые даты в мире. Исходный код вашей формы выглядит так:
<input type="text" name='dateLover' id='dateLover'/> <input type="text" name="dates[]" id="date1" /> //you need a increasing variable for these id numbers (or dont't put the id at all) <input type="text" name="dates[]" id="date2" /> <input type="text" name="dates[]" id="date3" />
Кроме того, у вас может быть больше полей, таких как <input type="text" name="extra" />
. В представленном массиве $_POST
будут переменные и массивы типа: $_POST['dateLover']
, $_POST['date'][0]
, $_POST['date'][1]
, $_POST['date'][2]
, $_POST['extra']
. Вы берете неизменяемые значения прямо из массива $_POST
но для обработки массива дат вам нужен foreach
(или какой-то еще цикл).
Ваша база данных должна содержать две таблицы (упрощенная структура):
person
: id
, dateLover
date
: id
, dateLover
FK to person.dateLover, date
В сценарии процесса вы должны:
dateLover
person
и используйте last_insert_id
чтобы получить его id
foreach
для вставки новой date
s в таблицу date
(с dateLover
как FK) Это все хорошо продемонстрировано в ссылке, которую я поставил ранее. На данный момент трудно привести полный пример, не рассматривая фактическую проблему.
Обновление 2.
Вы сериализуете форму, а не div
. Таким образом, ваш (динамически сгенерированный) может выглядеть так:
<form id="form_educ" name="form_educ" method="post" action="form/educ.php"> <div id="educ"> <div><!--This is for layout only--> <input type="text" name="dates[]" id="date0" /> <input type="text" name="names[]" id="name0" /> </div> <div> <input type="text" name="dates[]" id="date1" /> <input type="text" name="names[]" id="name1" /> </div> <div> <input type="text" name="dates[]" id="date2" /> <input type="text" name="names[]" id="name2" /> </div> </div> <input type="submit" name="form_educ" value="Refresh" /> </form>
И в вашем файле процесса вы берете эти массивы из массива $_POST
и вставляете их в базу данных, возможно, это так (с правильно экранированными и проверенными значениями курса …):
//dynamic part of the query $qEnd = ''; $i = -1; //this is static part of the query $qBeginning = "INSERT INTO `date` (`id`, `date`, `name`) VALUES "; foreach ($_POST['dates'] as $key => $date){ $i++; $qValues[$i] = "(null, '{$date}', '{$_POST[names][$i]}')"; //never do this, always check values... //value sets are concatenated one after another to the $qEnd $qEnd .= $qValues . ','; } //combine the query parts and remove extra "," from the end $q = $qBeginning . rtrim($qEnd, ','); //now the (single) query ($q) is ready to be executed, echo it just for the fun of it
id
должен быть автоматически приращением поля, или этот вид вещей не работает «на лету».
Опять же, все это должно быть ясно в примере ссылки jQuery, поэтому, пожалуйста, внимательно прочитайте его.
Вы должны знать все возможные столбцы, которые могут быть обновлены перед началом работы. Просто проверьте, установлены ли эти переменные в переменной $ _POST, а затем добавьте инструкцию insert или update с этими значениями.
ОПАСНО: просто цикл в переменной $ _POST, смотрящий на все параметры, может в конечном итоге вставить поля POST, связанные с базой данных, в ваш оператор insert и break.
Также при использовании этих методов будьте в курсе SQL Injection и используйте параметризованные запросы и никогда не вставляйте имена переменных или имена POST в SQL-файл.