PHP mehrere Klassen für Produkte erstellen

@theHacker
Habe jetzt die DB etwas umgebaut und sowas in der Richtung gemacht, wie hier:
PHP:
public class Article {

  private $id;
  private $propertiesLoaded = array();

  public __construct($id) {
    $this->id = $id;
    loadMe();
  }

  private function loadMe() {
    $row = DBManager::get()->queryfResult("SELECT name, price, ... FROM article WHERE id = %u;", $this->id);
    $this->setName($row['name']);
    $this->setPrice($row['price']);
  }

  public function getProperty($propertyName) {
    if(!isset($this->propertiesLoaded[$propertyName])) {
      $row = DBManager::get()->queryfResult("SELECT value FROM articleProperty WHERE article_id = %u AND name = '%s';", $this->id, $propertyName);
      if($row)
        $this->propertiesLoaded[$propertyName] = $row['value'];
      else
        $this->propertiesLoaded[$propertyName] = null; // not set
    }
    
    return $this->propertiesLoaded[$propertyName];
  }

}
[/QUOTE]

Natürlich möchte ich über ein Eingabeformular auch Daten speichern. 
Ich habe nun Inputfelder mit 
[PHP]name="article['height']"
usw. Somit kann ich dann aus dem POST-Array den Key als Name eintragen. Ich habe aber auch im Template alle Namen per Hand eingetragen, da ich somit das Template frei gestalten kann. Es müsen also immer die Werte im Template mit den Werten aus der DB übereinstimmen bzw. wenn man einen Namen ändert muss er in der DB und Template geändert werden. Gibts da nicht noch eine bessere Variante das zu lösen?
 
Wie könnte ich es denn besser machen? Hab ich natürlich eben gemerkt, das es blöd ist, die Daten an 2 verschiedenen Stellen zu haben.

Man könnte doch die Tabelle mit den Eigenschaften auslesen und das Formular erzeugen oder hast du noch ne andere Idee?
 
Ich kenn doch von deinem Projekt nix. Die Idee is simple:
Wenn du es nicht statisch irgendall doppelt und dreifach reinschreiben willst, schreib es dynamisch an irgendEINE Stelle.

Wo du das tust, wie du das tust, hast du freie Auswahl.
Man könnte doch die Tabelle mit den Eigenschaften auslesen und das Formular erzeugen oder hast du noch ne andere Idee?
Du kannst dann nur Eigenschaften ändern, die es schon gibt. - Also gar keine am Anfang :mrgreen:
 
Du kannst dann nur Eigenschaften ändern, die es schon gibt. - Also gar keine am Anfang :mrgreen:

Ich habe es so gemacht, das es eine Tabelle gibt, die nur die Eigenschaften enthält. Eine weitere Tabelle enthält die Zuordnung von Produkt,Eigenschaft und dem entsprechenden Wert. Somit habe ich in einer Tabelle alle Eigenschaften die es geben kann bzw. können auch neue hinzukommen.
 
nochmal eine Frage:

in der Property-Tabelle gibt es doch die Spalte value. Die Values können aber unterschiedliche Datentypen sein. Wie bekomme ich das alles in eine Spalte? dort kann doch entweder ein String stehen oder eine Zahl bzw. Dezimalzahl
 
Würde mir verschiedenes einfallen:

  1. Alles in ne VARCHAR-Spalte. PHP issees doch eh wurscht, weil es keine feste Typisierung gibt.
  2. Verschiedene NULL-Spalten anlegen. Strings kommen in die String-Spalte, Daten in die Datum-Spalte, Double in die Double-Spalte.
  3. Zusätzlich kannst du in deiner Attribut-Tabelle, die du vorher erwähnt hast, den Typ abspeichern.
Ich würde wohl 1+3 machen.
 
Ich würde gern nach bestimmten Eigenschaften sortieren. Wenn alles als Varchar abgelegt ist, wird das ja bei Zahlenangaben nicht mehr funktionieren.

Welchen Vorteil hat es denn, wenn ich den Typ mit abspeichere?
 
Ich würde gern nach bestimmten Eigenschaften sortieren. Wenn alles als Varchar abgelegt ist, wird das ja bei Zahlenangaben nicht mehr funktionieren.
Richtig. Hier kannst du, da du in diesem speziellen Fall nur eine einzelne Eigenschaft selektierst, um sie vergleichen zu können, MySQL explizit zum Cast anweisen:
Code:
[FONT=Courier New][B][COLOR=#9932cc]SELECT[/COLOR][/B] varcharColumn
[B][COLOR=#9932cc]FROM[/COLOR][/B] articleProperties
[B][COLOR=#9932cc]WHERE[/COLOR][/B] propertyId = 42
[B][COLOR=#9932cc]ORDER[/COLOR][/B] [B][COLOR=#9932cc]BY[/COLOR][/B] [B][COLOR=#9932cc]CAST[/COLOR][/B][COLOR=#9932cc]([/COLOR]varcharColumn [B][COLOR=#9932cc]AS[/COLOR][/B] [B][COLOR=#9932cc]SIGNED[/COLOR][/B] [B][COLOR=#9932cc]INTEGER[/COLOR][/B][COLOR=#9932cc])[/COLOR] [B][COLOR=#9932cc]ASC[/COLOR][/B];[/FONT]
Welchen Vorteil hat es denn, wenn ich den Typ mit abspeichere?
Dass du ihn weist ;) - Oder woher willst du sonst wissen, ob es sich um eine Zahl oder um einen String handelt?

Außerdem wäre doch schön, wenn Boolean-Werte mit einer Checkbox dargestellt werden, während Text-Werte ein Textfeld haben.
 
Cool, hatte ich noch nicht gewußt das man das bei MySQL machen kann :)

Ja da hast du natürlich recht, die Spalte zum Datentyp kann ich super dazu benutzen um mir dynamisch das Formular zu generieren und je nach Typ das entsprechende Formularfeld auszugeben.

Danke theHacker :)
 
Ich hätt nochmal ne Frage zur Performance.

Da ich ja eine Attributtabelle habe und diese mit der Tabelle verknüpft ist, die alle Werte enthält, muss man einen Join der Tabellen machen.

Bei einem Produkt mit ca. 30 Eigenschaften gibt es also immer 30 Datensätze zurück und wenn man dann z.B. eine Produktliste anzeigen will multipliziert sich das ja ganz schnell. Wie ist das von der Performance her zu beurteilen?
 
Uuhhh... 30 Attribute pro Artikel und da machst du 1 Join.... die Datenbank zittert schon :ugly:

Auch wenn ich nicht der richtige Ansprechpartner zu solchen Fragen bin, kann ich dir sagen, dass deine DB auch nicht gleich schlapp macht, wenn du 1000 Datensätze kreuz 50 Datensätze kreuz 5000 Datensätze machst.
Wenn die Indizes ordentlich gesetzt sind, macht MySQL das im Schlaf und hat - bei wiederholten Zugriffen - die Sachen sogar im Cache ;)