2010-04-22 290 views
0

我是PHP和MySQL的新手,我試圖存儲用戶從以下字段輸入的數據$skill, $experience, $years,如果需要,用戶還可以添加其他字段$skill, $experience, $years而不是每個字段中的1個字段可能有多個字段。使用MySQL和PHP將數據存儲在MySQL數據庫中

我想知道如何使用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) 
); 

回答

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而不是文本字段會更好。這有助於所謂的規範化(一種防止重複數據的方法)。

祝你好運。

+0

所以我應該只是將二者結合起來的表'u_skills'和'learned_skills'這是最好的? – comma 2010-04-22 22:50:19

+0

如果一個用戶可以擁有多種技能,那麼這就是1(用戶)對許多(技能)的關係。這就是我建議的DDL實現的。 – webbiedave 2010-04-22 22:52:22

+0

用戶只會輸入技能,其他的都在下拉列表中。 – comma 2010-04-22 22:52:56

0

如果有多個,你將不得不爲每個創建一個列,或者把它們放到同一個字段中,使用某種分隔符(skill1,skill2,skill3)。然後,檢索後,您可以使用該分隔符分割數組。

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++)){ 
相關問題