2017-04-18 55 views
0

我試圖找到這個問題的答案,但我不能。MYSQL不會返回超過1個類別

我有一個3表格式mqsql數據庫。 我使用1表添加所有產品信息,CarpetInfo, 1表中列出我的類別,CarpetCategories, 和1表中添加產品類CarpetCategorySort。

我的CarpetCategorySort表有3列,Manufacturer,Style,CategoryID。 示例將爲製造商=阿拉丁,風格=母校,類別ID = 14/15/18/19/20/21/67/

我的地毯分類表有2列CategoryID和類別。 2例將CATEGORYID = 14,等級=商用& 類別id = 15,等級=商用循環

我只能得到的代碼,當我在商用型到下面的$類變量工作。如果我將Commercial Loop輸入$ category變量,代碼將不起作用。這就像它只會拉入第一個數字14,而其他所有數字都被忽略。定價訂單和其他一切正常,只是不是CategoryID部分。

這是我的代碼。

<?php $mill = "Aladdin"; $category = "Commercial Loop"; 
$order = mysqli_query($con, " 
SELECT * FROM CarpetInfo JOIN CarpetCategorySort USING (Manufacturer, Style) 
JOIN CarpetCategories USING (CategoryID) 
WHERE Manufacturer='$mill' AND Category LIKE '%$category%' 
order by Price = 0, Price asc, 
Style asc"); 
include($_SERVER['DOCUMENT_ROOT'].'/includes/pricing/carpet-order-test.htm');?> 

任何幫助,不勝感激!

+1

**警告**:使用'mysqli'時,您應該使用[參數化查詢](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)和['bind_param' ](http://php.net/manual/en/mysqli-stmt.bind-param.php)將用戶數據添加到您的查詢。 **不要**使用字符串插值或連接來完成此操作,因爲您創建了嚴重的[SQL注入漏洞](http://bobby-tables.com/)。 **不要**將'$ _POST','$ _GET'或**任何**用戶數據直接放入查詢中,如果有人試圖利用您的錯誤,這可能會非常有害。 – tadman

+1

這是一個好主意,把這個空間做得更好一些。干擾一行中的內容會嚴重影響可讀性。 – tadman

回答

0

這是一種處理事物的落後方式,一個擁有幾個數據點的領域就像這樣一起擦亮,實際上從來沒有任何存在的理由。我會在一張桌子上列出地毯,在另一張桌子中列出類別,最後在另一張桌子中列出兩者的交叉引用,您可以在兩端獲得多對一的關係。

只有當您認爲需要爲每個類別提供重複信息以及/或者無法控制用戶對類別的輸入(如您不僅僅是使用下拉菜單)時,您才需要實際的類別表給一個名字選擇)。

喜歡的東西:

CREATE TABLE IF NOT EXISTS `carpets` (
    `id` int(11) NOT NULL, 
    `name` varchar(50) NOT NULL, 
    `abbrev` varchar(10), 
    `description` varchar(250), 
    [...] 
    `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; 


CREATE TABLE IF NOT EXISTS `carpet_categories` (
`id` int(11) NOT NULL, 
    `carpet_id` int(11) NOT NULL, 
    `category_id` int(11) NOT NULL, 
[...] 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; 


CREATE TABLE IF NOT EXISTS `carpet_category_info` (
    `id` int(11) NOT NULL, 
    `price-per-sqf` int(11) NOT NULL, 
    `name` varchar(50), 
    [...] 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1; 

那麼你所有的聯接變得簡單,快速。而準確。

+0

我不確定我是否瞭解你,這將是更好的方式。對不起,我現在只在mysql上工作了幾個月。你能給我多一點關於你的表/代碼背後的推理的信息嗎? – k1775

+0

@ k1775你沒有一個字段列出了一個事物的幾個實例全部混合在一起 - 你有一個單獨的表,其中包含幾個記錄,每個記錄都與不同的事物與原始記錄相關聯。前者的結構比關係數據庫更多。您可能需要閱讀有關的一般原則? https://www.ntu.edu。sg/home/ehchua/programming/sql/relational_database_design.html或任何o'reilly sql書 –