2017-04-18 2 views
0

Ich habe versucht, eine Antwort auf dieses Problem zu finden, aber ich kann nicht.MYSQL gibt nicht mehr als 1 Kategorie zurück

Ich habe eine mqsql-Datenbank mit 3 Tabellen. Ich verwende 1 Tabelle, um alle Produktinformationen hinzuzufügen, CarpetInfo, 1 Tabelle, um meine Kategorien, CarpetCategories, und 1 Tabelle auf Kategorien zu den Produkten hinzuzufügen, CarpetCategorySort.

Meine CarpetCategorySort-Tabelle hat 3 Spalten, Hersteller, Stil, CategoryID. Beispiel wäre Hersteller = Aladdin, Stil = Alma Mater, KategorieID = 14/15/18/19/20/21/67/

Meine CarpetCategories Tabelle hat 2 Spalten CategoryID und Kategorie. 2 Beispiele wären & CategoryID = 15, Kategorie = Gewerbe Schleife

Ich kann nur erhalten, den Code zu arbeiten, wenn ich in Gewerbe in die $ Kategorie Variable geben Sie unten CategoryId = 14, Kategorie = Gewerbe werden. Der Code wird nicht funktionieren, wenn ich Commercial Loop in die Variable $ category eintippe. Es ist so, als ob es nur die erste Zahl 14 einholt und alle anderen ignoriert werden. Die Preisangabe und alles andere funktioniert richtig, nur nicht der CategoryID-Teil.

Hier ist mein Code.

<?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');?> 

Jede Hilfe ist sehr zu schätzen!

+1

** WARNUNG **: Wenn Sie 'mysqli' verwenden, sollten Sie [parametrisierte Abfragen] (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php) und [' bind_param' verwenden ] (http://php.net/manual/en/mysqli-stmt.bind-param.php), um Benutzerdaten zu Ihrer Anfrage hinzuzufügen. ** Verwenden Sie NICHT ** String-Interpolation oder Verkettung, um dies zu erreichen, weil Sie einen schwerwiegenden [SQL injection bug] erstellt haben (http://bobby-tables.com/). ** NIEMALS ** $ _POST ',' $ _GET' oder ** irgendwelche ** Benutzerdaten direkt in eine Abfrage einfügen, es kann sehr schädlich sein, wenn jemand versucht, Ihren Fehler auszunutzen. – tadman

+1

Es ist eine gute Idee, das ein bisschen besser zu machen. Das Stören von Dingen auf einer Zeile beeinträchtigt die Lesbarkeit erheblich. – tadman

Antwort

0

Das ist ein rückständiger Weg, Dinge zu handhaben, ein Feld mit mehreren Datenpunkten, die so zusammengeschmiedet sind, hat wirklich keine Existenzberechtigung. Ich würde die Teppiche in einer Tabelle auflisten, die Kategorien in einer anderen auflisten und schließlich die Querverweise auf beide in einer anderen Tabelle auflisten, wo man an beiden Enden eine Viele-zu-Eins-Beziehung erhält.

Sie benötigen eine tatsächliche Kategorietabelle nur, wenn Sie der Meinung sind, dass so viel Platz für doppelte Informationen für jede Kategorie benötigt wird und/oder Benutzereingaben für Kategorien nicht gesteuert werden können (z. B. wenn Sie nicht nur einen Pulldown verwenden) eine Namenswahl geben).

Etwas wie:

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; 

dann Joins alle einfachen geworden und schnell .. Und genau.

+0

Ich bin mir nicht sicher, ob ich dich verstehe, das wäre ein besserer Weg. Sorry, ich bin erst seit ein paar Monaten in MySQL. Kannst du mir etwas mehr über die Gründe für deine Tabellen/Codes erzählen? – k1775

+0

@ k1775 Sie haben kein Feld, das mehrere Instanzen einer Sache auflistet - Sie haben eine separate Tabelle, die mehrere Datensätze enthält, von denen jeder eine andere Sache mit dem ursprünglichen Datensatz assoziiert. Die ehemalige Struktur ist mehr .. Excel als relationale Datenbank. Vielleicht möchten Sie etwas über die allgemeinen Prinzipien erfahren? https://www.ntu.edu.sg/home/ehchua/programmierung/sql/relational_database_design.html oder irgendein o'reilly sql Buch –

Verwandte Themen