我有一个在线表单,它收集成员信息并将其存储到一个非常长的MySQL数据库中。我们允许最多16个成员一次注册,最初构建数据库以允许这样做。
如果有1位会员注册,他的个人信息(名字,姓氏,地址,电话,电子邮件)将存储在一行中。
如果15名会员注册(全部一次),他们的个人信息将存储在同一行中。
该行包含所有“可能”输入的信息。我正在尝试合并此代码并让每个注册的第n个成员在数据库中放入新记录。
之前我曾经看过过多次记录,因此插入了多条记录:
INSERT INTO tablename VALUES (('$ f1name','$ f1address','$ f1phone'),('$ f2name','$ f2address','$ f2phone')...
是否可以在不使用循环的情况下将信息存储在单独的行中(因此必须返回并完全重构我的表单字段名称等等(由于验证规则的构建方式,这不可能发生。)< / p>
答案 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");
}
}
}
这很难看,但基本上是:
老实说,除非你有一些非常另类的设计需要维护一个包含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循环,而不必重命名你的表单字段。