n:m-Tabelle aus einem Formular updaten

n:m-Tabelle aus einem Formular updaten

am 31.05.2006 19:59:31 von Dominik Erdmann

Hallo zusammen,

ich möchte über ein Formular eine n:m-Tabelle mit Daten füllen aber auch
später zu ändern.

Anwendung: Schaut euch bitte mal mein Adressbuch [1] an! Rechts seht ihr
die Spalte "zu Gruppe hinzufügen". Ein Kontakt wird beliebig vieler
Gruppen hinzugefügt.

Bisher mache ich das so, dass ich alle Tabelleneintrage lösche und dann
neu einfüge, wenn das Formular neu gesendet wird, da ich ja nicht wissen
kann, ob eine Gruppe geändert wurde. Ist das so ein guter/richtiger Weg?
Geht das auch besser?

[1]http://www.der-domi.de/adressbuch/index.php?MenuID=change &KontaktID=1

Vielen Dank!

--
Viele Grüße,
Dominik

http://www.der-domi.de

Re: n:m-Tabelle aus einem Formular updaten

am 01.06.2006 09:26:25 von Alex Hepp

Guten Morgen,

Dominik Erdmann schrieb:
> Hallo zusammen,
>
> ich möchte über ein Formular eine n:m-Tabelle mit Daten füllen aber auch
> später zu ändern.

Zuerst mal: Es gibt keine n:m Tabelle, sondern nur eine n:m Relation.
Dazu benötigt man in der Regel, wenn man es richtig normalisiert, 3
Tabellen.

Die eine enthält die Kontakte, eine 2. enthält alle Gruppen, und eine
Zwischentabelle enthält die gewählten Kombinationen.

> Bisher mache ich das so, dass ich alle Tabelleneintrage lösche und dann
> neu einfüge, wenn das Formular neu gesendet wird, da ich ja nicht wissen
> kann, ob eine Gruppe geändert wurde. Ist das so ein guter/richtiger Weg?
> Geht das auch besser?

Die Frage ist, ob Du zu einer Kombination noch weitere Infos speichern
möchtest, wie zb. Beitrittsdatum, etc. In diesem Fall müsstest Du es
anders machen.

Wenn es nur darum geht, zu wissen, ob ein bestimmter Kontakt einer
bestimmten Gruppe angehört, finde ich das so schon ok. Allerdings
solltest Du zb. ein event einführen, dass sich in einem hidden feld
merkt, ob überhaupt etwas geändert wurde, und nur dann tatsächlich
updaten... (Vorsicht: onClick allein reicht nich, weil man auch per Tab
und Space ändern kann.)

HTH Alex

Re: n:m-Tabelle aus einem Formular updaten

am 01.06.2006 09:44:40 von Dominik Erdmann

Hallo,

Alex Hepp schrieb:

>> ich möchte über ein Formular eine n:m-Tabelle mit Daten füllen aber
>> auch später zu ändern.
>
> Zuerst mal: Es gibt keine n:m Tabelle, sondern nur eine n:m Relation.
> Dazu benötigt man in der Regel, wenn man es richtig normalisiert, 3
> Tabellen.

Ich habe mich ungünstig (falsch) ausgedrückt. Sorry.

> Die eine enthält die Kontakte, eine 2. enthält alle Gruppen, und eine
> Zwischentabelle enthält die gewählten Kombinationen.

Ich meine die Zwischentabelle, welche nur contactid und groupid speichert.

>> Bisher mache ich das so, dass ich alle Tabelleneintrage lösche und
>> dann neu einfüge, wenn das Formular neu gesendet wird, da ich ja nicht
>> wissen kann, ob eine Gruppe geändert wurde. Ist das so ein
>> guter/richtiger Weg? Geht das auch besser?
>
> Die Frage ist, ob Du zu einer Kombination noch weitere Infos speichern
> möchtest, wie zb. Beitrittsdatum, etc. In diesem Fall müsstest Du es
> anders machen.

Benötige ich nicht.

> Wenn es nur darum geht, zu wissen, ob ein bestimmter Kontakt einer
> bestimmten Gruppe angehört, finde ich das so schon ok.

Okay!

> Allerdings
> solltest Du zb. ein event einführen, dass sich in einem hidden feld
> merkt, ob überhaupt etwas geändert wurde, und nur dann tatsächlich
> updaten... (Vorsicht: onClick allein reicht nich, weil man auch per Tab
> und Space ändern kann.)

Was für einen Vorteil hat das denn? Ein Ändern der Kontakte geschieht ja
nicht allzu oft.

Vielen Dank!

--
Viele Grüße,
Dominik

http://www.der-domi.de

Re: n:m-Tabelle aus einem Formular updaten

am 01.06.2006 09:59:51 von Alex Hepp

Hallo!

>> Allerdings
>> solltest Du zb. ein event einführen, dass sich in einem hidden feld
>> merkt, ob überhaupt etwas geändert wurde, und nur dann tatsächlich
>> updaten... (Vorsicht: onClick allein reicht nich, weil man auch per Tab
>> und Space ändern kann.)
>
> Was für einen Vorteil hat das denn? Ein Ändern der Kontakte geschieht ja
> nicht allzu oft.
>
> Vielen Dank!
>

Das ist ja der Punkt, im Augenblick speicherst Du ja jedesmal, wenn der
Benutzer das Formular abschickt, also auch, wenn beliebige Änderungen an
anderen Sachen gemacht werden. Wenn Du Dir merkst, ob an den Gruppen was
geändert wurde, machst Du diese Kompletteintragung eben nur dann, wenn
es auch Sinn macht!

Im Augenblick bringt das nicht viel Veränderung, aber wenn Du mal viele
Kontakte und viele Gruppen hast, könnte das schon was ausmachen. Auch
geht es mehr um grundsätzliche Prinzipien:

1. Ändere nichts, was nicht geändert werden muss.
2. Spare jeden DB-Zugriff, wenn möglich!

Grüße
Alex

Re: n:m-Tabelle aus einem Formular updaten

am 01.06.2006 10:10:35 von Dominik Erdmann

Hi!

Alex Hepp schrieb:

>>> Allerdings
>>> solltest Du zb. ein event einführen, dass sich in einem hidden feld
>>> merkt, ob überhaupt etwas geändert wurde, und nur dann tatsächlich
>>> updaten... (Vorsicht: onClick allein reicht nich, weil man auch per Tab
>>> und Space ändern kann.)
>>
>> Was für einen Vorteil hat das denn? Ein Ändern der Kontakte geschieht ja
>> nicht allzu oft.
>
> Das ist ja der Punkt,[...]

Stimmt, das war ja auch meine Frage :o)

> Im Augenblick bringt das nicht viel Veränderung, aber wenn Du mal viele
> Kontakte und viele Gruppen hast, könnte das schon was ausmachen. Auch
> geht es mehr um grundsätzliche Prinzipien:
>
> 1. Ändere nichts, was nicht geändert werden muss.
> 2. Spare jeden DB-Zugriff, wenn möglich!

Wie könnte man diese hidden-Feld aktualisieren? Mache ich dies über
JavaScript? Vielleicht auch alle aktuellen Verknüpfungen in
hidden-Felder mitsenden und dann vergleichen?

Vielen Dank!

--
Viele Grüße,
Dominik

http://www.der-domi.de

Re: n:m-Tabelle aus einem Formular updaten

am 01.06.2006 11:35:29 von Alex Hepp

Dominik Erdmann schrieb:

> Wie könnte man diese hidden-Feld aktualisieren? Mache ich dies über
> JavaScript? Vielleicht auch alle aktuellen Verknüpfungen in
> hidden-Felder mitsenden und dann vergleichen?

Auch, wenn das jetzt mehr ne HTML od. Javascript- Frage ist ,aber ich
steh eh nicht so ganz auf diese "Frag das dort-Mentalität" ;)

es gibt mind. 2 Möglichkeiten:

1. ein und dann
per Javascript events abfangen, bei denen die Werte der checkboxen
geändert werden, dann eben changed_groups auf 1 setzen, und in der
"action" abfragen (also dem php, an dass das form geschickt wird).

2. Ganz ohne JS, aber mit mehr Abfrageaufwand:
speichere die alten Werte in hidden-Feldern, und benenne die Checkboxen
und hiddens ähnlich, also






..
..
..

Im PHP fragst du dann nacheinander in einer schleife alles ab, und hast
einen "Wächter", der dann entscheidet, ob Du updatest, oder nicht!

Vorteile:
- Du brauchst kein JS, setzt Du aber eh JS ein, solltest Du die 1.
Variante wählen.
- Du musst nicht erst alle möglichen Events abklappern, sondern kannst
bei jedem Browser sicher sein, dass das funzt...

Nachteile:
- Immenser Vergleichsmechanismus, der wahrscheinlich den ständigen
DB-Zugriff effizienter macht. Das hängt aber von der Menge Gruppen, der
eingesetzen DB und dem Verbindungsmechanismus, usw ab...
- Je nachdem wächst das HTML unnötig an...

Soweit von mir!

gruß alex

Re: n:m-Tabelle aus einem Formular updaten

am 01.06.2006 13:32:52 von Dominik Erdmann

Danke vielmals!

Nun liegt es an mir, welches Konzept ich angehe...

Da ich kein JavaScricpt mag...

Vielen Dank und viele Grüße!

--
Viele Grüße,
Dominik

http://www.der-domi.de

Re: n:m-Tabelle aus einem Formular updaten

am 07.06.2006 16:31:07 von David Hopfmueller

Dominik Erdmann schrieb:

> Bisher mache ich das so, dass ich alle Tabelleneintrage lösche und dann
> neu einfüge, wenn das Formular neu gesendet wird, da ich ja nicht wissen
> kann, ob eine Gruppe geändert wurde. Ist das so ein guter/richtiger Weg?
> Geht das auch besser?

Warum nimmst Du nicht einfach die ursprüngliche DB-Abfrage und vergleichst
damit dann Deine POST-/GET-Daten? Damit sparst Du Dir (und dem Anwender)
JavaScript, hidden-Felder etc. Haben Änderungen stattgefunden, erfolgen
gezielte Updates bzw. Inserts, anschließend wird die Abfrage upgedated, um
die aktuellen Daten darzustellen. Halte ich für die einfachste und
problemloseste Variante. Einzig die wiederholte Abfrage könnte man
einsparen, die wird aber IMHO durch eingespartes HTML + JavaScript locker
kompensiert.

HTH,
David

Re: n:m-Tabelle aus einem Formular updaten

am 08.06.2006 11:17:20 von Dominik Erdmann

Hallo David,

David Hopfmueller schrieb:

>> Bisher mache ich das so, dass ich alle Tabelleneintrage lösche und dann
>> neu einfüge, wenn das Formular neu gesendet wird, da ich ja nicht wissen
>> kann, ob eine Gruppe geändert wurde. Ist das so ein guter/richtiger Weg?
>> Geht das auch besser?
>
> Warum nimmst Du nicht einfach die ursprüngliche DB-Abfrage und vergleichst
> damit dann Deine POST-/GET-Daten?

Was meinst du denn genau mit der ursprünglichen DB-Abfrage? Die, um
herauszufinden, welche Gruppe ich markieren muss?

> Damit sparst Du Dir (und dem Anwender)
> JavaScript, hidden-Felder etc. Haben Änderungen stattgefunden, erfolgen
> gezielte Updates bzw. Inserts, anschließend wird die Abfrage upgedated, um
> die aktuellen Daten darzustellen.

Klar, ich bin ja auch kein Freund von JavaScript..

Vielen Dank!

--
Viele Grüße,
Dominik

http://www.der-domi.de

Re: n:m-Tabelle aus einem Formular updaten

am 08.06.2006 12:49:42 von Matthias Wuebbeling

Dominik Erdmann wrote:

>>> Bisher mache ich das so, dass ich alle Tabelleneintrage lösche und dann
>>> neu einfüge, wenn das Formular neu gesendet wird, da ich ja nicht wissen
>>> kann, ob eine Gruppe geändert wurde. Ist das so ein guter/richtiger Weg?
>>> Geht das auch besser?
>> Warum nimmst Du nicht einfach die ursprüngliche DB-Abfrage und vergleichst
>> damit dann Deine POST-/GET-Daten?
>
> Was meinst du denn genau mit der ursprünglichen DB-Abfrage? Die, um
> herauszufinden, welche Gruppe ich markieren muss?

Ich denke er meint die Daten, welche du aus der Datenbank bekommen hast,
um das Formular damit zu füllen. Angenommen, du hast ein assoziatives
Array, mit dem du deine Formularfelder füllst, damit sie geändert werden.

Dann speicherst du diese Daten bspw. in der Session oder rufst sie neu
ab, wenn du die Formulardaten erhälst.

Nun hast du den Datenbanksatz z.B. in $vorher und den Formularsatz in
$_GET['formular'].

$nachher = $_GET['formular'];
foreach($nachher AS $key => $value){
if($vorher[$key] != $value){
/* Feld wurde geändert */
} else {
/* alles beim alten */
}
}

Das kannst du dann meinetwegen auch noch in $geaendert schreiben und nur
die Felder updaten, welche in $geaendert stehen.

Grüße und HTH,
Matze

Re: n:m-Tabelle aus einem Formular updaten

am 08.06.2006 13:02:40 von Matthias Wuebbeling

Matthias Wuebbeling wrote:

> [mein Text]

Habe erst nach absenden deine Seite nochmal angesehen. Du musst ja
wissen, in welcher Gruppe jemand ist, damit du in deinem Formular die
Häkchen direkt dort setzen kannst, wo der user bereits drin ist. Wenn du
nun also die Gruppen sicherst, in denen der Benutzer ist
($_SESSION['userIsIn'] oder etwas in der Art) dann kannst du nun

$nachher = $_GET['groups'];
foreach($_SESSION['userIsIn'] AS $key => $value){
if($nachher[$key] == "on"){
/* keine Veränderung */
} else {
/* Gruppe nicht ausgewaehlt */
}
unset($nachher[$key])
}

Nach diesem Durchlauf weisst du, welche du löschen musst. Wenn du bei
diesem Durchlauf zusätzlich alle ids entfernst, die du durchläufst (das
unset), dann bleiben am Ende genau die in deinem $nachher stehen, die du
neu hinzufügen musst.

nochmals Grüße und HTH,
Matze

Re: n:m-Tabelle aus einem Formular updaten

am 08.06.2006 13:47:53 von Dominik Erdmann

Super! Vielen Dank! Das werde ich so übernehmen!

--
Viele Grüße,
Dominik

http://www.der-domi.de

Re: n:m-Tabelle aus einem Formular updaten

am 08.06.2006 13:52:04 von Dominik Erdmann

schon klar!

mit bissel ausprobieren, werde ich das schon schaffen ;)

Danke!

--
Viele Grüße,
Dominik

http://www.der-domi.de