2015-05-26 54 views
1

我的數據庫保存了以下數據:如何通過表單添加多對多關係?

fish 
--- 
id 
name 
cooking_type_id 
--- 

cooking_type 
--- 
id 
name 
--- 

cooking_type_relationships 
--- 
fish_id 
cooking_type_id 
--- 

我想在其中添加一條魚到數據庫中創建窗體。這一切都正常,但添加許多關係時遇到問題。通過表單,我製作了一個複選框列表,其中包含所有烹飪類型,用戶點擊所有適合魚類的烹飪類型。但是,我如何查詢數據庫,以便很好地創建關係?

下面是創建的複選框列表的代碼:

include 'conn.php'; 
    echo "<ul class='cooking-list'>"; 
    $query = "SELECT * FROM cooking_type c"; 
    $result = $mysqli->query($query); 
    mysqli_query($mysqli, "SET NAMES 'utf8'"); 
    while($row = mysqli_fetch_array($result)) 
    {    
    // run through the results from the database, generating the checkboxes 
    echo "\n\t<li>"; 
    echo "<input id='".$row['name']."' type='checkbox' name'type_id'><p>{$row['name']}</p>"; 
    echo "</li>"; 
    echo "<br><br>"; 
    } 
    echo "</ul>"; 
    mysqli_close($mysqli); 

編輯:我沒有收到查詢才能正常工作。我現在有點困惑。下面是我想後查詢:

include 'conn.php'; 
mysqli_query($mysqli, "SET NAMES 'utf8'"); 
$query = "INSERT INTO fish (name, image, about, season_id) 
     VALUES ('$_POST[name]', '$_POST[image]', '$_POST[about]', '$_POST[season_id]'); 
     INSERT INTO cooking_type_relationships (fish_id, cooking_type_id) 
     VALUES (mysqli_insert_id, cooking_type_id);" 


$mysqli->query($query); 

mysqli_close($mysqli); 
+1

我不知道我理解你的問題,你想我們弄清楚魚和菜/烹飪類型之間的關係/模式? – Epodax

+0

您應該考慮使用PDO而不是mysqli函數。這些關係應該使用外鍵進行設置,並使用這些鍵上的連接進行選擇。學習構建一個框架 - 可以處理這些繁重的工作,包括關係,這可能是有益的。閱讀laravel,phalcon或codeigniter。 –

+0

從您的描述來看,它聽起來不像多對多的關係。你有一種魚可以有更多的烹飪類型......這是一對多的關係,你可以在烹飪類型中指向一條魚的外鍵(外鍵是一個指向魚) – broch

回答

1

要做到這一點,你需要將數據插入到兩個表,魚表和cooking_types_relationships表。

僞代碼:

insert into fish values (a, b, c); 
insert into cooking_types_relationships values (mysqli_insert_id, cooking_type_id); 

這裏的技巧是使用mysqli_insert_id

+0

這似乎是一個完美的解決方案!我試圖讓代碼現在開始,並會回來解決方案或其他問題:)謝謝! – MstrQKN

+0

我試過了,但無法啓動。你可以簡單看看它,看看你是否能找出什麼是錯的? – MstrQKN

+1

是的,你必須執行兩個查詢。第一個插入魚 - >這會生成一個mysqli_insert_id - >使用此id在cooking_types_relationships中插入一個值。這將是第二個查詢。 – marijnz0r

1

在一個查詢中不能創建2個請求。這是由於安全問題。 當你從$ _POST得到值 時,總是引用你的密鑰我假設在你的mysql表中你的id列有primary和auto_increment標誌。

然後儘量做到以下幾點:

include 'conn.php'; 
mysqli_query($mysqli, "SET NAMES 'utf8'"); 

$query = "INSERT INTO fish (name, image, about, season_id) 
    VALUES ('$_POST['name']', '$_POST['image']', '$_POST['about']', '$_POST['season_id']')"; 

mysqli_query($mysqli, $query); 
$id = mysqli_insert_id($mysqli); 

$query = "INSERT INTO cooking_type_relationships (fish_id, cooking_type_id) 
    VALUES (". $id . ", ".$cooking_type_id.")"; 
mysqli_query($mysqli, $query); 

mysqli_close($mysqli); 

你必須找到類似的方式爲魚ID正確$ cooking_type_id。或者,也許你已經知道它是否是烹飪類型的固定列表

您還困惑了製作查詢的過程式和麪向對象的方式。 $ mysqli-> query()是面向對象的,我不認爲這是你需要的。

只記得在生產中使用它之前過濾$ _POST值。截至PDO其他提到的樣子準備語句

當你想出來的數據再次,你可以做一個內部聯接,像這樣:

SELECT * FROM fish 
INNER JOIN cooking_type_relationships ON fish.id=fish_id 
INNER JOIN cooking_type ON cooking_type_id=cooking_type.id 

如果魚沒有任何烹飪的類型,但你還是要它顯示結果你只是改變內部聯接到左加入

+0

謝謝@broch這是一個很好的答案。我對此很陌生,所以我試圖掌握所有的信息。我發現PDO很混亂,但我會盡我所能學習一些:)我會盡快更新此線程 – MstrQKN

+0

歡迎您;)您不必使用PDO,儘管它是最安全的選項。您也可以使用filter_var在將字符串插入數據庫之前對其進行過濾。看看這裏:http://php.net/manual/en/function.filter-var.php (和來自哥本哈根的問候,我看到你來自哥德堡:)) – broch

相關問題