Struktur
Helmut Weber
- programmiertechnik
0 TomIRL0 Helmut Weber0 Struppi
0 Maulwurf0 Ludger0 Helmut Weber
Guten Morgen SelfForum.
Ich habe einen Online-Produktkatalog erstellet, mit dem der Kunde seine Produkte selbst pflegen kann.
Das Skript zur Pflege der Produkte ist im Prinzip in 5 Unterprogramme aufgeteilt: Index, New, Edit, Save und Delete.
Die Unterprogramme "New" und "Edit" öffnen das selbe HTML-Formular, nur das eben bei "Edit" die Formularfelder aus der Datenbank gefüllt werden. Im Formular gibt es ein "hidden"-Feld, in dem die Datensatz-ID eines zu ändernden Produktes eingetragen wird.
Im Unterprogramm "Save" speichere ich die Daten des HTML-Formulars in eine Datenbank. Wenn eine Datensatz-ID übergeben wurde handelt es sich um eine Änderung (also SQL-UPDATE), wenn nicht um eine Neuanlage (SQL-INSERT).
Soweit so gut!
Jetzt möchte ich aber einen Produkt auch ein Bild aus der Datenbank zuordnen können können. Das mache ich über eine Kreutztabelle (Produkt-ID und Bild-ID). Dazu brauche ich im HTML-Formular jedoch eine Produkt-ID, die bei der Neuanlage eines Produktes noch nicht zur Verfügung steht. Diese wird erst per auto_inkrement von der Datenbakn beim Anlegen des Produktes erzeugt. Also muss jedes neue Produkt erst gespeichert werden, dann zum Editieren neu geöffnet werden, und kann dann mit einem Bild verknüpft werden (umständlich für den Benutzer).
Ein weiterer Lösungsansatz wäre, im Unterprogramm "New" ein neues "leeres" Produkt in der Datenbank anzulegen, die ID ermitteln, und diese dann an das Formular zu übergeben. Im Unterprogramm "Save" gibt es daher dann nur noch ein SQL-UPDATE, das die Neuanlage schon im Unterprogramm "New" gemacht wurde.
Dabei habe ich allerdings das Problem, dass es in der Datenbank zu unvollständigen Datensätzen kommen kann, wenn enin Benutzer das Anlegen eines Produktes abbricht. Diese unvollständigen Daten muss ich dann irgendwie herausfiltern und/oder löschen.
Ich hoffe mein Anliegen ist einigermaßen verständlich ;)
Mich würde es interessieren, wie Ihr in solchen Fällen vorgeht, und was eurer Ansicht nach der bessere Weg ist. Vielleicht gibt es gar eine ganz andere Lösung, die mir biher verborgen blieb :9
Gruß
Helmut Weber
Moin,
Mühseeliges unterfangen....
Anderer Weg, Du legst beim absenden des Formulars zuerst den Artikel an.
mysql_insert_id liefert die ID der letzten Insert Operation, und die fügst Du dann ein:-)
Allet schön so?
TomIRL
Hallo Tom,
nicht ganz ;)
Ich stehe ja sonst nicht so auf PopUps, aber in diesem Fall sind sie ganz hilfreich. Im HTML-Formular gibt es einen Link "Bild hinzufügen", der ein PopUp-Fenster öffnet, in dem in der "Bildergalerie" navigiert werden kann. Wenn der Benutzer dann das gewünschte Bild gefunden hat, wird es beim Anklicken mit dem Produkt in der Datenbank verknüpft, und er kann zu diesem Produkt noch weitere Bilder hinzufügen, ohne dass er das Produkt jedes mal neu speichern muss.
Ich brauche also (soweit ich meinen Hirnwindungen folgen kann ;) die Produkt-ID auf jedem Fall schon im HTML-Formular.
Gruß
Helmut Weber
Ich stehe ja sonst nicht so auf PopUps, aber in diesem Fall sind sie ganz hilfreich. Im HTML-Formular gibt es einen Link "Bild hinzufügen", der ein PopUp-Fenster öffnet, in dem in der "Bildergalerie" navigiert werden kann. Wenn der Benutzer dann das gewünschte Bild gefunden hat, wird es beim Anklicken mit dem Produkt in der Datenbank verknüpft, und er kann zu diesem Produkt noch weitere Bilder hinzufügen, ohne dass er das Produkt jedes mal neu speichern muss.
Ich brauche also (soweit ich meinen Hirnwindungen folgen kann ;) die Produkt-ID auf jedem Fall schon im HTML-Formular.
Dir bleibt in dem Falle der Weg, das du die Bilder IDs dem Formular übergibst (mit JS z.b.), ansonsten bliebe nur die Möglichkeit dies in 2 Schritten zu erledigen (erst Produkt speichern und ID rausfinden und dann Bilder auswählen)
Struppi.
Hallo
Dabei habe ich allerdings das Problem, dass es in der Datenbank zu unvollständigen Datensätzen kommen kann, wenn enin Benutzer das Anlegen eines Produktes abbricht. Diese unvollständigen Daten muss ich dann irgendwie herausfiltern und/oder löschen.
Ic habe das Problem schon gehabt.
Lösung: "Garbage collector" programmieren (Cronjob oder etwas ähnliches) die alle unvollständige DB-Sätze löscht und protokolliert
Gruss
Maulwurf
Hallo Maulwurf,
ich werde diese Funktion im Skript selbst platzieren (z.B. im Aufruf der Produkt-Übersicht).
Ich finde es jedoch unschön und für fehlerträchtig. Da mehere Benutzer gleichzeitig in der Produktverwaltung arbeiten können, muss ich aufpassen, dass ich Datensätze aus aktuellen Sitzungen nicht lösche.
In der Darstellung muss ich ebenfalls eingreifen, um noch nicht fertig angelegte Produkte nicht auszugeben.
Bisher fällt mir jedoch kein schönerer Weg ein, und habe auf einen Tipp aus dem Forum gehofft ;)
Gruß
Helmut Weber
Hi,
[...]
Das mache ich über eine Kreutztabelle (Produkt-ID und Bild-ID).
[...]
ich vermute, dass Du irgendwo in Deiner datenhaltung die Notwendigkeit geschaffen hast fuer jedes Produkt auch ein Bild zu halten? Ansonsten kann ich bisher keine Probleme erkennen.
Gruss,
Ludger
Hallo Ludger,
ich vermute, dass Du irgendwo in Deiner datenhaltung die Notwendigkeit geschaffen hast fuer jedes Produkt auch ein Bild zu halten? Ansonsten kann ich bisher keine Probleme erkennen.
Ein Produkt kann auch kein Bild enthalten. Nach oben hin ist auch keine Grenze gesetzt. D.h. es kann auch vorkommen, dass ein Produkt 10 Bilder oder mehr enthält.
Deshalb möchte ich nicht im HTML-Formular 5 Felder (Bild1 bis Bild5) haben, in denen ich die Verknüpfung zum Bild ablegen kann. Weil ich mich dabei auf eine Zahl x beschränken würde.
Wenn ein Benutzer also ein Produkt ändert, kann er auf "Bild hinzufügen" klicken, und im darauf folgenden PopUp-Fenster aus einer grafischen Oberfläche das gewünschte Bild auswählen.
Nach dem Auswählen wird automatisch das Formular mit der vorhandenen Informationen abgeschickt, das Bild mit dem Produkt in der Kreuztabelle verknüpft, und das Formular mit den vorhandenen Angaben wieder angezeigt (Plus der Verknüpfung des Bildes).
Dieser Vorgang geht aber natürlich nur, wenn für das Produkt schon eine ID existiert, was aber bei einer Neuanlage des Produktes noch nicht der Fall ist. Die Daten zum Produkt selbst (Titel, Beschreibung, Preis, usw.) werden erst gespeichert, wenn das Formular über den Button "Produkt speichern" vom Benutzer abgesendet wird. Ich kann auch da erst eine Datensatz-ID für das neue Produkt aus der Datenbank auslesen, außer ich würde bei einer Neuanlage eines Produktes eine Datensatz-ID in der Datenbank "reservieren".
Damit schliesst sich der Kreis wieder zu meinem Anfangs beschriebenen Problem ;) Datensatz-ID bei einer Neuerstellung eines Produktes erzeugen, und die dadurch möglichen "Datenleichen" nachträglich abfangen, oder bei der Neuanlage eines Produktes auf die Verknüpfungsmöglichkeit verzichten, oder gibt es gar einen ganz anderen (Königs)-Weg?
Helmut Weber
Hi,
Du musst also das Beifuegen eines Bildes zu einem Produkt unterstuetzen, dass noch gar nicht "da ist"!
Nun, wie Du in der Realitaet einem nichtvorhandenen Mann einen Hund beifuegen kannst, wirst Du auch diese Herausforderung nicht ohne wieteres bearbeiten koennen.
Irgendwo hattest Du mal geschrieben, dass Du ein "leeres Dummy-Produkt" anlegen wolltest, dass Dir das aber nicht "profi-korrekt" (in meinen Worten) erschien.
Nun, lass Dich beruhigen, das ist profikorrekt. Und mache Dir wegen Datensaetzen der Produkttabelle, die "leer" sind, keine Sorgen. Auch "leere" Datensaetze tragen Information und bestehen nicht nur aus Daten.
Gruss,
Ludger
Hallo Ludger,
danke für deine Hilfe.
Ich werde beim Erstellen eines neuen Prdouktes in der Datenban kein leeres Prodjekt anlegen, die erzeugte Datensatz-ID ermitteln, und diese dann an das HTML-Formular weitergeben.
Somit existiert das Produkt schon im Sinne der Datenbank, und hat eben noch keinen Inhalt. Dafür kann ich dieses Produkt schon für sämtliche Verknüpfungen nutzen. (Neben Bildern gibt es auch noch Dokumente und Unterprodukte).
Für den Fall, das ein Benutzer ein neues Produkt zwar anlegt, jedoch nicht speichert werde ich eine kleine Anweisung schreiben, die solche Daten-Leichen entfernt.
Ein Vorteil hat die ganze Geschichte:
In meiner Speicher-Funktion habe ich bisher immer einen if-else-Zweig:
if ( $ID ) {
SQL_UPDATE
}
else{
SQL_INSERT
}
Hat mich schon immer gestört, und fällt jett weg, da es beim Speichern _immer_ ein SQL_UPADTE ist. SQL_INSERT geschieht schon in meiner New-Funktion.
Gruß
Helmut Weber
Deshalb möchte ich nicht im HTML-Formular 5 Felder (Bild1 bis Bild5) haben, in denen ich die Verknüpfung zum Bild ablegen kann. Weil ich mich dabei auf eine Zahl x beschränken würde.
Du kannst ohne Probleme einem hidden Feld z.b. die Bild IDs komma separiert zuweisen und dann im Skript entsprechent trennen.
Das halte ich für sauberer, als jedesmal erst potientielle Datenleichen zu löschen müssen.
Struppi.