Если вы структурировали форму так, чтобы все поля были пронумерованы правильно, чтобы «firstname # 1» совпало со всеми остальными «# 1» пронумерованными полями, то цикл является самым простым решением.
start_transaction();
$errors = false;
for ($i = 1; $i <= 16; $i++) {
if (... all $i fields are properly filled in ...) {
$field = $_POST["field$i"];
$otherfield = $_POST["otherfield$i"];
etc...
... insert into database ...
} else {
... handle error condition here
$errors = true;
}
}
if (!$errors) {
commit_transaction();
} else {
rollback();
}
Если они нумеруются случайным образом, так что firstname1 совпадает с lastname42 и address3.1415927, то вам нужно будет создать таблицу поиска, чтобы сопоставить все случайные именования вместе, и выполнить цикл по этому
отслеживания за комментарий:
хорошо, если вы абсолютно настаиваете на поддержании этой структуры базы данных, где каждая строка содержит 16 наборов повторяющихся записей имя / фамилия / и т. Д., То вы бы сделали что-то вроде этого:
$first = true;
for ($i = 1; $i <= 16; $i++) {
if (fields at position $i are valid) {
$firstname = mysql_escape_real_string($_POST["F{$i}name"]);
$lastname = mysql_real_escape_string($_POST["F{$i}lastname"]);
if ($first) {
$dbh->query("INSERT INTO table (f{$i}name, f{$i}lastname) VALUES ($firstname, $lastname);"
$recordID = $dbh->query("SELECT last_insert_id();");
$first = false;
} else {
$dbh->query("UPDATE table SET f{$i}name=$firstname, f{$i}lastname=$lastname WHERE idfield=$recordID");
}
}
}
Это некрасиво, но в основном:
- перебирайте наборы полей формы, пока не найдете правильный набор (все обязательные поля заполнены, введены правильные данные и т. Д.
- Вставить этот набор данных в базу данных, чтобы создать новую запись
- получить идентификатор этой новой записи
- продолжить цикл по остальным полям
- для каждого последующего набора действительных записей выполните обновление ранее созданной записи и добавьте новые данные набора полей.
Хотя, если честно, если у вас нет какого-то необычного дизайна, вам нужно поддерживать одну таблицу с 16 наборами повторяющихся столбцов, вам лучше немного нормализовать и поддерживать две отдельные таблицы. Родительская таблица регистрации и дочерняя таблица участников. Таким образом, вы можете создать родительскую таблицу регистрации, а затем просто вставить новых детей, когда вы встретите их в форме.
обновление № 2:
ну, упрощенная форма нормализованного макета будет:
signups (id, name, etc...)
signup_members (id, signup_id, firstname, lastname)
и вы получите полный набор записей регистрации с помощью следующего запроса:
SELECT signups.id, signups.name, signup_members.id, firstname, lastname
FROM signups
LEFT JOIN signup_members ON signups.id = signup_members.signup_id
ORDER BY ...
Это дало бы вам ряд строк, по одной для каждой регистрации участника. Чтобы создать CSV, простой цикл с проверкой состояния, чтобы увидеть, достигли ли вы новой регистрации:
$oldid = null;
$csv = ... put column headers here if you want ...
while ($signup = $result->fetchrow()) {
if ($signup['signups.id'] != $oldid) {
// current signup doesn't match previous seen id, so got a new signup record
$csv .= "\n"; // start new line in CSV
$csv .= ... add first few columns to new csv row ...
$oldid = $signup['signups.id']; // store new record id
} else {
$csv .= ... add extra member columns to current csv row ...
}
}