Php 表单中的Sql表关系
我有一个表格,用来收集联系人的信息,并在联系人簿中使用。我需要创建两个表。一个用于大多数数据,另一个用于单独的电话号码,因为每个人可以有多个电话号码。显然,我希望这些表是可关联的,但我不知道如何将表单中的数据输入到两个表中,以便它们共享一个关系。我还需要能够将数据连接到主表中的单个PhoneNumber列中 这一想法可以从以下几个方面得到说明:Php 表单中的Sql表关系,php,mysql,Php,Mysql,我有一个表格,用来收集联系人的信息,并在联系人簿中使用。我需要创建两个表。一个用于大多数数据,另一个用于单独的电话号码,因为每个人可以有多个电话号码。显然,我希望这些表是可关联的,但我不知道如何将表单中的数据输入到两个表中,以便它们共享一个关系。我还需要能够将数据连接到主表中的单个PhoneNumber列中 这一想法可以从以下几个方面得到说明: (来源:) 使用tableA_id填充PhoneNumber字段。我如何从表单中输入数据才能做到这一点 更新代码 11 //Form Validati
(来源:) 使用tableA_id填充PhoneNumber字段。我如何从表单中输入数据才能做到这一点 更新代码
11 //Form Validation
12 $name = $email = $gender = $comment = $website = "";
13
14 if ($_SERVER["REQUEST_METHOD"] == "POST")
15 {
16 $firstname = test_input($_POST["firstname"]);
17 $email = test_input($_POST["email"]);
18 $lastname = test_input($_POST["lastname"]);
19 $street = test_input($_POST["street"]);
20 $city = test_input($_POST["city"]);
21 $state = test_input($_POST["state"]);
22 $country = test_input($_POST["country"]);
23 $workphone = test_input($_POST["workphone"]);
24 $mobilephone = test_input($_POST["mobilephone"]);
25 $homephone = test_input($_POST["homephone"]);
26 $phonearray = array("$workphone","$mobilephone","$homephone");
27
28
29 }
30
31 function test_input($data)
32 {
33 $data = trim($data);
34 $data = stripslashes($data);
35 $data = htmlspecialchars($data);
36 return $data;
37 }
//After validation we input the data into the tables.
84
85 $sql="INSERT INTO nameaddress
86 (FirstName, LastName, Street, City, State, Country,email,photo)
87 VALUES
88 ('$firstname','$lastname','$street','$city','$state','$country','$email','$uploadfile')";
89
90
91
92
93
94 if (!mysqli_query($con,$sql))
95 {
96 die('Error: ' . mysqli_error($con));
97 }
98
99 $lastInsertId=mysqli_insert_id($con);
100 foreach ($phonearray as $a) {
101 $select="INSERT INTO userphones(phonenumbers,nameaddress_id)102
102 VALUES ($a,".$lastInsertId.")";
103 mysqli_query($con,$select);
104 }
为大多数数据在第一个表中添加一个主键(例如,“id”)。phonenumber数据的第二个表应具有第一个表中主键的索引字段。
然后,您需要首先将非电话号码数据插入此表。然后使用SELECT LAST_INSERT_ID()获取此INSERT的主键,并将其添加到第二个表的INSERT中。这样,phonenumber表中的所有条目都将有一个索引字段,该字段将指向第一个表中的用户。
此stackoverflow线程对使用LAST_INSERT_ID()进行了很好的讨论:
要插入数据,需要在php的循环中插入数据,如下所示(伪代码): 单个
插入表格(名字、姓氏、地址、电子邮件)
获取上次插入的id(或)
在循环中插入所有电话号码:foreach$phonenumber
插入电话(电话号码,从插入表格A的最后一个ID)
对于需要使用的输出,您的查询将如下所示:
select a.*, group_concat(b.phonenumbers)
from tableA as a
inner join
phones as b
on (a.id=b.tableA_id)
group by a.id
select *
from tableA as a
inner join
(
select tableA_id, group_concat(phonenumbers)
from tableB
group by tableA_id
) as q
on (a.id=q.tableA_id)
group by a.id
注意:使用严格模式的mysql将不允许您使用group by中只有a.id的*,您需要这样做:
select a.*, group_concat(b.phonenumbers)
from tableA as a
inner join
phones as b
on (a.id=b.tableA_id)
group by a.id
select *
from tableA as a
inner join
(
select tableA_id, group_concat(phonenumbers)
from tableB
group by tableA_id
) as q
on (a.id=q.tableA_id)
group by a.id
我无法使环路正常工作。我将在原始问题中发布一段代码。@user2872127为什么要将变量$lastsinsert设置为奇怪的字符串值并尝试将其插入数据库?也许您想执行它并存储结果?或者你应该使用mysqli_insert_id-会更简单好吧,我更改了它,我认为mysqli_insert_id语法是正确的,但我不确定。@user2872127语法不正确,如果你处理mysqli_查询中的错误,你会看到它,将它更改为
$lastInsertId=mysqli_insert_id($con)
在FOREACH之前和其中$select=“插入到用户电话(mobilephone,nameaddress_id)102个值($a,“.$lastInsertId”)”好吧,我又换了一次。它不会抛出错误,但不会在我的电话号码表中插入任何内容。