需要帮助INSERT记录MySQL DB

时间:2010-05-26 20:03:47

标签: php mysql arrays insert loops

我有一个在线表单,它收集成员信息并将其存储到一个非常长的MySQL数据库中。我们允许最多16个成员一次注册,最初构建数据库以允许这样做。

例如:

如果有1位会员注册,他的个人信息(名字,姓氏,地址,电话,电子邮件)将存储在一行中。

如果15名会员注册(全部一次),他们的个人信息将存储在同一行中。

该行包含所有“可能”输入的信息。我正在尝试合并此代码并让每个注册的第n个成员在数据库中放入新记录。

之前我曾经看过过多次记录,因此插入了多条记录:

  

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

这个问题有两个方面:

  1. 我不知道有多少记录 从一个人到另一个人注册 所以唯一的方法是做到 上面的陈述是使用循环
  2. 从中收集的信息 表单不是单个数组,所以我 不能遍历一个数组和 让它解析出来。我的信息是 作为单独的输入字段收集 像这样:Member1FirstName, Member1LastName,Member1Phone, Member2Firstname,Member2LastName, 会员2电话......等等
  3. 是否可以在不使用循环的情况下将信息存储在单独的行中(因此必须返回并完全重构我的表单字段名称等等(由于验证规则的构建方式,这不可能发生。)< / p>

3 个答案:

答案 0 :(得分:1)

如果你形成了结构化的所有字段都正确编号,那么“名字#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组重复的firstname / lastname / etc ..记录,那么你可以这样做:

$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. 检索该新记录的ID
  4. 继续循环其余字段
  5. 对于每个后续的有效记录集,执行先前创建的记录的更新并添加新的字段集数据。
  6. 老实说,除非你有一些非常另类的设计需要维护一个包含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 :(得分:1)

您尝试做的事情可能更简单,但要解决问题,您可以将用户信息加入一个变量中,用您选择的字符分隔并将其发送到Mysql DB ...

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

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

要提取,只需通过“;”“爆炸”该值。 如果您对所有用户数据使用相同的顺序,并且如果您发送验证字符串以防一个用户将字段留空,则工作得很好:) 嗯......如果不允许用户使用“;”这项工作就好了作为“个人数据”:)

希望它有助于你!

答案 2 :(得分:0)

我想你可能想看看“变量变量”:

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

然后你可以想象从1到15循环,而不必重命名你的表单字段。