Нужна помощь ВСТАВИТЬ записи (ы) MySQL DB - PullRequest
0 голосов
/ 27 мая 2010

У меня есть онлайн-форма, которая собирает информацию об участниках и сохраняет ее в очень длинной базе данных MySQL. Мы допускаем одновременную регистрацию до 16 участников и изначально структурировали БД, чтобы это разрешалось.

Например:

Если регистрируется 1 участник, его личные данные (имя, фамилия, адрес, телефон, адрес электронной почты) хранятся в одной строке.

Если 15 участников регистрируются (все сразу), их личная информация сохраняется в одной и той же строке.

В строке есть столбцы с информационным корпусом для всех «возможных» входов. Я пытаюсь объединить этот код, и каждый зачисленный n-й член записывается в новую запись в базе данных.

Я уже видел предложения для вставки нескольких записей как таковых:

INSERT INTO tablename VALUES (('$ f1name', '$ f1address', '$ f1phone'), ('$ f2name', '$ f2address', '$ f2phone') ...

Проблема с этим в два раза:

  1. Я не знаю, сколько записей зачисление от человека к человеку так что единственный способ сделать Заявление выше, чтобы использовать цикл
  2. Информация, полученная от формы не один массив, поэтому я не может перебрать один массив и это разобрать. Моя информация собраны как отдельные поля ввода как такой: Member1FirstName, Member1LastName, Member1Phone, Member2Firstname, Member2LastName, Member2Phone ... и т. Д.

Можно ли хранить информацию в отдельных строках БЕЗ использования цикла (и, следовательно, необходимости возвращаться назад и полностью реструктурировать имена полей формы и т. Д. (Что не может произойти из-за способа построения правил проверки). *

Ответы [ 3 ]

1 голос
/ 27 мая 2010

Если вы структурировали форму так, чтобы все поля были пронумерованы правильно, чтобы «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");
       }
    }
}

Это некрасиво, но в основном:

  1. перебирайте наборы полей формы, пока не найдете правильный набор (все обязательные поля заполнены, введены правильные данные и т. Д.
  2. Вставить этот набор данных в базу данных, чтобы создать новую запись
  3. получить идентификатор этой новой записи
  4. продолжить цикл по остальным полям
  5. для каждого последующего набора действительных записей выполните обновление ранее созданной записи и добавьте новые данные набора полей.

Хотя, если честно, если у вас нет какого-то необычного дизайна, вам нужно поддерживать одну таблицу с 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 ...
    }
 }   
1 голос
/ 28 мая 2010

То, что вы пытаетесь сделать, может быть проще, но для решения проблемы вы можете объединить информацию о пользователе в одну переменную, разделенную выбранным символом, и отправить ее в Mysql DB ...

$user1 = $f1name . ';' . $f1address . ';' . $f1phone;
$user2 = $f2name . ';' . $f2address . ';' . $f2phone;
$user3 = $f3name . ';' . $f3address . ';' . $f3phone;

INSERT INTO table-name VALUES('$user1','$user2','$user3')

Чтобы извлечь, просто "взорвать" значение с помощью ";". Если вы используете один и тот же порядок для всех данных пользователей, и если вы отправляете строку подтверждения в случае, если один пользователь оставляет поле пустым, работает просто отлично :) хм ... эта работа просто отлично, если пользователю не разрешено использовать ";" как "личные данные":)

Надеюсь, это поможет вам!

0 голосов
/ 27 мая 2010

Я думаю, вы можете посмотреть на "переменные переменные":

http://php.net/manual/en/language.variables.variable.php

Тогда вы, вероятно, можете переходить от 1 до 15 без необходимости переименовывать поля формы.

...