PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : generelles Logikproblem


tsunamitsunami
26.10.2009, 16:44:54
Hallo Forum,

ich habe mal ein grundsätzliches Logikproblem. Also:

Wenn ich zB einen shop habe, habe ich verschiedene Gruppen: Blumentöpfe, Radios, PCs.
Je nach Gruppe habe ich verschiedene Eckdaten:

Beim Blumentopf: Volumen, Material, Farbe,Durchmesser, Form,usw.
Beim PC: Speicher, CPU, LAN, HDD, usw
Beim Radio: USB, Sendeplätze, Leistung, Freisprecheinrichtung, MP3,usw.

Wie bekomme ich eine flexible Artikelverwaltung hin?

Die erste Idee war eine lange Tabelle mit allen Beschreibungen und als Standartwert unwichtig.
Als Auswahl dann alle Werte wo !=“unwichtig“
Allerdings wird die Tabelle dann sehr lang und unübersichtlich.

Dann hatte ich die Idee das Ganze an einer Gruppe fest zu machen. Also wenn gruppe=1 nehme Tabelle pcs, wenn gruppe=2 nehme Tabelle blumentöpfe. Bei der Erfassung neuer Artikel dann via select als erstes die Gruppe wählen, die per javascript abschicken und dann die die Felder generieren.

Ein weitere Ansatz war die Überschriften zu den Gruppen als String zusammen mit den tabellennamen in einer Tabelle ab zu speichern:
1 „cputakt,speicher,hdd,kartenleser,brenner“ pcs;
2 „aussendurchmesser,innendurchmesser,höhe,farbe“ blumentoepfe;
3 „sendeplätze,usb,mp3,leistung,freisprecheinrichtung“radios;
Ein array generieren und darau ein Formular basteln.

Bei allen Ansätzen scheitere ich an der fehlenden Dynamik beim speichern. Natürlich kann ich sagen
if(klasse=1) insert into pcs...
else if(klasse=2) insert into blumentoepfe...
else if(klasse=3) insert into autoradios...

Kommt dann eine Gruppe z.B. Lampen hinzu, müsste ich manuell eine weitere else if Anweisung einfügen.

Gibt es dafür ein Patenrezept? Das Problem müsste doch eigendlich jeder Shopentwickler haben.
Wie löse ich sowas sauber? Danke für eure Mühe
Gruß
tsunamitsunami

vt1816
26.10.2009, 16:53:06
[...]
Bei allen Ansätzen scheitere ich an der fehlenden Dynamik beim speichern. Natürlich kann ich sagen
if(klasse=1) insert into pcs...
else if(klasse=2) insert into blumentoepfe...
else if(klasse=3) insert into autoradios...

Kommt dann eine Gruppe z.B. Lampen hinzu, müsste ich manuell eine weitere else if Anweisung einfügen.

Gibt es dafür ein Patenrezept? Das Problem müsste doch eigendlich jeder Shopentwickler haben.
Wie löse ich sowas sauber? Danke für eure Mühe
Gruß
tsunamitsunami

Da solltest Du mit Array's weiterkommen...

Alle benötigten Dateinamen ins Array und Klasse=1 entspricht dem Array-Index.

feuervogel
26.10.2009, 16:54:26
du hast eine tabelle kategorien

id | name
1 | blumentopf

dann gibts für alle kategorien eine tabelle mit attributen

id | kat_id | name | default_value | type
1 | 1 | | Volumen | 0 | numeric

und dann noch eine tabelle mit werten

id | a_id | article_id | value
1 | 1 | 1 | 25

und dann kann der admin eine neue artikel-kategorie anlegen, dafür die attribute definieren, für die artikel dann ne kategorie aussuchen und die passenden werte eintragen.

tsunamitsunami
26.10.2009, 17:28:59
Hallo,
das ging ja schnell! Danke! :)

@Feuervogel. So ähnlich war meine Idee2 ja auch.
Das würde, wenn ichs richtig verstanden habe, heissen, nicht neuen Artikel hinzufügen, sondern Neuen PC hinzufügen, Neues Autoradio hinzufügen, Neuen Blumentopf hinzufügen usw., oder?

@vt1816. Das klingt ähnlich wie meine 3. Idee.



$array[1]="cpu,speicher,hdd";
$array[2]="sendeplaetze,usb,mp3,leistung";
...

... und dann eine DB-Tabelle Artikel mit den Spalten: ID, Klasse und Beschreibung.
Unter Beschreibung steht dann ein fest definierter string?
Sehr guter Ansatz...
Aber auch dann müsste ich sagen Neuer PC, Neuer Topf, Neues Radio usw. statt Neuer Artikel, oder?

bisher habe ich halt:
id Artikelname guppe_id objektwert genauebeschreibung
1 Gamer PC 1 6000 19
2 Kaktustopf 2 23 19

Wenn gruppe_id=1 suche in Tabelle pc nach id 19. Wenn gruppe:id=2 suche in Tabelle blumentopf nach id 19. Geht so also wohl nicht und ich muss das Ganze unterteilen, oder bin ich auf dem Holzweg?

tsunamitsunami
26.10.2009, 18:13:58
Nochmal @feuervogel zum Verständnis:
Dann würde die Tabelle Werte doch in etwa so aussehen. Anhang...

feuervogel
27.10.2009, 15:01:12
Nochmal @feuervogel zum Verständnis:
Dann würde die Tabelle Werte doch in etwa so aussehen. Anhang...

ja, so in etwa dachte ich mir das.

tsunamitsunami
27.10.2009, 15:16:53
Danke für eure Hilfe! Ich denke damit werde ich weiterkommen.

tsunamitsunami
04.11.2009, 12:49:40
Hallo zusammen!

Wen es interessiert: Ich habe es nun teil-lösen können. Alerdings sehr unbefriedigend:

--
Ausgabe aller Schuhe:

$sql_sub="select objekte.wert, attribute.attributname,objekte.objekt_id from attribute,objekte,kathegorien
where attribute.kathegorie_id=1 and kathegorien.id=attribute.kathegorie_id and attribute.id=objekte.attribut_id AND attribute.attributname != 'id' order by objekte.objekt_id";
$letzteproduktid=0;

$mssub=mysql_query($sql_sub); $letzterwert="0";
while($ausgabe_schuhx=mysql_fetch_assoc($mssub))
{ if($letzteproduktid != $ausgabe_schuhx["objekt_id"])echo " <td class='datenzelle'>&nbsp;</td></tr><tr>";
if(in_array($ausgabe_schuhx["attributname"],$wichtigschuharray))
print "<td class='datenzelle'>".$ausgabe_schuhx["wert"]."</td>";
$letzteproduktid = $ausgabe_personx["objekt_id"];
}



if(in_array($ausgabe_schuhx["attributname"],$wichtigschuharray))

Dient nur zu Filterzwecken. Felder wie id und timestamp will ich nicht ausgeben.
Ich möchte erstmal eine Grobübersicht haben. Mehr später im Tooltipp.

So funktioniert es.
Nun habe ich aber ein Problem, wenn die Werte aus irgend einem Grund mal nicht in der selben Reihenfolge in der Spalte stehen...
Und: Wie kann ich sowas sortieren/filtern? ZB nach Schuhersteller. Die Werte stehen ja in der Spalte Wert untereinander. Die sind über die Tabelle attribute verknüpft.

Also Tabelle attribute:

id|kathegorie_id|attributname
1|1|Größe
2|1|Hersteller
3|2|cpu

Tabelle kathegorien:

id|Name
1|PCs
2|Schuhe
3|Blumentöpfe

Tabelle Werte:
id|attribut_id|objekt_id|wert
1|1|1|Tower
2|2|1|HP
3|3|1|3.4

Soll heissen Kathegorie 1(PCs) Objekt1(also PC1) Attribute 1-3.
In der gleichen Spalte stehen aber auch Farbe eines Blumentopfs oder Schuhgröße.
zB 3(Blumentöpfe) Objekt3(also Topf3) Attribute 1-3.

Ihr hattet mir ja schon geraten, das ganze in ein Array zu packen.

Das war auch ein Ansatz. Den attribut-Namen als Schlüssel nehmen und die Objektwerte dahinterpacken.


while($ausgabe=mysql_fetch_assoc($msquery))
{
$schuharray[$ausgabe['attributname']]=$ausgabe['objektwert']
}


Aber ich habe die Unterteilung des Arrays in die einzelnen Objekte nicht hinbekommen.
Der Array-Schlüssel muss eindeutig sein und in meinem Fall habe ich zB mehrere PCs in der Datenbank. Ich müsste also das Array
füllen. Sortieren. Ausgeben. leeren.
füllen. Sortieren...
Eine Idee wäre noch mehrere Arrays zu erzeugen jeweils mit der Objektid als Anhängsel.
Aber das ist doch Müll, oder? Vor allem, wenn da zB "nur" 100 PCs in der DB sind.
--
Bin schon fast so weit, wieder zu den Wurzeln zurück zu gehen und einfach den Tabellennamen mit zu übergeben.
$sql="select * from ".$_GET['tabellenname']...

Für jede Kathegorie eigene Formulare zu nehmen und gut.

Weil so scheint es nicht lösbar zu sein. Vor allem wenn ich zB noch filtern oder sortieren möchte.