我是PHP和MySQL的新手,我正在尝试存储用户输入的来自以下字段$skill, $experience, $years
的数据,如果需要,用户还可以添加$skill, $experience, $years
的其他字段。每个字段中的1个可能是每个字段的倍数。
我想知道如何使用PHP和MySQL将字段存储在我的MySQL数据库中?我有以下脚本,但我知道它错了。有人可以帮我修复下面列出的脚本吗?
这是PHP和MySQL代码。
$skill = serialize($_POST['skill']);
$experience = serialize($_POST['experience']);
$years = serialize($_POST['years']);
for (($s = 0; $s < count($skill); $s++) && ($x = 0; $x < count($experience); $x++) && ($g = 0; $g < count($years); $g++)){
$mysqli = mysqli_connect("localhost", "root", "", "sitename");
$query1 = "INSERT INTO learned_skills (skill, experience, years) VALUES ('" . $skill[$s] . "', '" . $experience[$x] . "', '" . $years[$g] . "')";
if (!mysqli_query($mysqli, $query1)) {
print mysqli_error($mysqli);
return;
}
}
这是我的MySQL表。
CREATE TABLE learned_skills (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
skill TEXT NOT NULL,
experience TEXT NOT NULL,
years INT NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE u_skills (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
skill_id INT UNSIGNED NOT NULL,
users_id INT UNSIGNED NOT NULL,
PRIMARY KEY (id)
);
答案 0 :(得分:2)
您将创建两个具有1对多关系的表:
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL auto_increment,
`username` varchar(40) collate latin1_general_ci NOT NULL,
`password` varchar(255) collate latin1_general_ci NOT NULL
PRIMARY KEY (`id`),
UNIQUE KEY `username` (`username`)
);
CREATE TABLE learned_skills (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
user_id INT UNSIGNED NOT NULL,
skill TEXT NOT NULL,
experience TEXT NOT NULL,
years INT NOT NULL,
PRIMARY KEY (id)
);
这样,用户可以拥有任意数量的列出技能。如果技能实际上只是一个小文本字符串(如“PHP”或“MySQL”),那么您应该使用VARCHAR类型而不是TEXT。如果是这种情况,一旦你开始,你会发现创建一个用户可以选择的技能列表并且只有一个skill_id而不是一个文本字段会更好。这有助于称为规范化(一种防止重复数据的方法)。
祝你好运。
答案 1 :(得分:0)
如果存在倍数,则必须为每个列创建一个列,或者将它们放入具有某种分隔符(skill1,skill2,skill3)的相同字段中。然后,在检索时,您可以使用该分隔符拆分数组。
答案 2 :(得分:0)
您可以根据建议使用具有列查找的多个表。
有时您可能希望像开始那样使用序列化数组。 但是,在序列化它之后,它是一个字符串,因此尝试按索引访问值没有意义。你有
$skill = serialize($_POST['skill']);
...
$query1 = "INSERT INTO learned_skills (skill, experience, years)
VALUES ('" $skill[$s]
这不起作用。
您也可能想要做类似
的事情$counter = min(count($skill), count($experience), count($years));
for($i = 0; $i < $counter; ++$i){
而不是
for (($s = 0; $s < count($skill); $s++) && ($x = 0; $x < count($experience); $x++) && ($g = 0; $g < count($years); $g++)){