Sie befinden sich hier im Forenarchiv von phpforum.de wenn Sie direkt ins Forum möchten, klicken Sie bitte hier. Zur Startseite kommen Sie hier.

Update ... Where Problem

Hallo,

ich habe ein Problem mit einem MySQL Befehl. Ich habe eine Datenbank in der die Ausgabe von Schlüsseln festgehalten wird. Dazu existiert eine Tabelle "schluessel". In der Tabelle gibt es die Spalten "id", "ausgabedatum", "ausgabezeit", "schluesselnr", "ausgabe_an", "ausgabe_von", "rueckgabe_datum", "rueckgabe_zeit", "ruecknahme_durch".
Das erste PHP Formular fügt die Daten für die AUSGABE ein. Dazu verwende ich

Code:                   In Zwischenablage kopieren (nur IE)
1">

Dieser Teil funktioniert auch wunderbar.
Wenn jetzt aber ein Schlüssel zurückgeben wird, dann muss diese Rückgabe auch per Formular in der DB erfasst werden.
Und JETZT fangen meine Probleme an.
Es liegt ja nahe eine UPDATE Anweisung zu benutzen.

Code:                   In Zwischenablage kopieren (nur IE)
2">

Diese Anweisung funktioniert zwar, aber jedes Mal wenn jetzt der Schlüssel erneut rausgeht wird zwar ein neuer Datensatz angelegt ABER bei der Rücknahme ersetzt die UPDATE Anweisung auch die Daten der anderen Datensätze mit der gleichen Schlüsselnummer, was ja eigentlich auch klar ist wegen dem
Code:                   In Zwischenablage kopieren (nur IE)
3">

Bei einer Anweisung
Code:                   In Zwischenablage kopieren (nur IE)
4">

würde es bestimmt einwandfrei klappen. Dumm nur, daß ich im UPDATE String die id nicht übergeben kann, da sie im Formular ja nicht abgefragt wird. Der User der das Rückgabeformular ausfüllt weiss ja nicht welche id der betreffende Datensatz hat. Er bekommt nur den Schlüssel zurück und gibt dann die Daten in das Formular ein. Mir fehlt jetzt schlicht die Idee wie ich es schaffe, daß der "richtige" Datensatz bei Rückgabe aktualisiert wird.
Kann mir bitte jemand einen Tip geben??

Danke und Gruß
Jan
Hier gehts zum Orginal Eintrag "Update ... Where Problem" im Forum

Antworten

Du weißt doch von wem welcher Schlüssel zurückgegeben wird
- das müßte reichen um den Datensatz rauszukriegen.


2.

Zitat:
Bernd456 postete
Du weißt doch von wem welcher Schlüssel zurückgegeben wird
- das müßte reichen um den Datensatz rauszukriegen.
Ja, aber auch da stellt sich das Problem, daß mySQL alle die Datensätze aktualisiert in denen der Name des Empfängers auftaucht. Also wenn Müller den Schlüssel 123 holt, aktualisiert mySQL alle Datensätze mit "Müller" oder bei der aktuellen Anweisung mit schluessel = "123"


3.

Du kannst beide Bedingungen verknüpfen: WHERE x=1 AND y=2


4.

Man kann in der where-Klausel durchaus mehrere Bedingungen angeben...


5.

Zitat:
Swiftnick postete
Man kann in der where-Klausel durchaus mehrere Bedingungen angeben...
So, jetzt habe ich endlich mal Zeit gefunden es a.) zu probieren und b.) hier zu schreiben.
Also, es ist so, daß auch bei der Bedingung
Code:                   In Zwischenablage kopieren (nur IE)
5">

mySQL alle Datensätze aktualisiert weil er ja durchaus mehrere Datensätze mit Schlüssel 123 und Müller findet. Viele Leute holen ja auch den jeden Tag den gleichen Schlüssel.
Ich müsst eine Methode haben um an die eindeutige Spalten-ID zu kommen. Alles andere wird wohl nicht funktionieren, da zuviele Datensätze ähnlich sind und mySQL dann einfach alles aktualisiert. Eine Möglichkeit wäre es vielleicht noch, eine Liste zu generieren mit allen Schlüssel die derzeit unterwegs sind und dann könnte ich auch die eindeutige ID holen. Aber leider wird dann der ganze Kram zu kompliziert, es soll ja EDV-Dau tauglich sein.
Hat noch jemand eine creative Idee??

Danke und Gruß
Jan


6.

Hallo

Ich würde an deiner Stelle in das Formular noch zwei "HIDDEN"-Felder einbauen. In der ersten speicherst du die Schlüssel-ID und in der zweiten die "AusgabeID". Mit Ausgabe-ID meine ich die Zeile die für die Schlüsselausgabe angelegt wird. Damit hast du den Vorteil das für jede Schlüsselausgabe eine eigene Zeile existiert und du auch auf Fehler überprüfen kannst bzw. ob Schlüssel zur rechten Zeit oder überhaupt zurückgegeben wurden.

Wenn ich das richtig verstanden habe kannst du momentan nicht korrekt prüfen ob ein Vorgang abgeschlossen ist oder nicht, da du jedes mal die gleiche Zeile überschreibst.

Gruß

UwBach


7.

Zitat:
UwBach postete

Wenn ich das richtig verstanden habe kannst du momentan nicht korrekt prüfen ob ein Vorgang abgeschlossen ist oder nicht, da du jedes mal die gleiche Zeile überschreibst.

Ja, es gestaltet sich so, daß mysql z.B. die Rückgabeuhrzeit oder das Datum bei allen übereinstimmenden Spalten auf den gleichen Wert setzt.

Wie kann ich denn erreichen, daß ich ich von mysql die ID zurückgegeben bekomme? Da gibts zwar den Befehl, der die letzte vergebene ID zurückgibt, aber auch den müsste ich dann in einer eigenen Spalte speichern um ihn dauerhaft zu halten, wobei das ja das gleiche Problem darstellt als wie wenn ich direkt die richtige Spalten-ID aus der "normalen" Tabelle lese.
Die hidden-fields müssen ja auch mit nem Wert gefüllt werden, der bei Rückgabe dem Bediener des Formulars nicht bekannt ist.


8.

Das Problem liegt schon im Datenbankdesign. Du speicherst Werte in die Tabelle Schlüssel. Da gehören die Daten nicht hin. Du brauchst im Prinzip drei Tabellen Tabelle SCHLÜSSEL (mit den Angaben zum Schlüssel und natürlich die SCHLÜSSEL-ID), eine Tabelle BENUTZER(mit einer eindeutigen ID) und eine Tabelle AUSGABE(mit einer ID und den Fremdschlüsseln SCHLÜSSEL-ID und BENUTZER-ID).

Nur dann kann in der Tabelle BENUTZER auch für jede Ausgabe ein eigener Eintrag gemacht werden und du bekommst eindeutige Werte. Über die AUSGABE-ID kann dann alles weitere geregelt werden. Wird dann eine Ausleihe gemacht (also ein INSERT) kannst du über

Code:                   In Zwischenablage kopieren (nur IE)
6">

die ID wieder herausbekommen und kannst die dann "verbauen".

Gruß

UwBach


9.

Hallo kenpo,

ich bin ein Anfägner in PHP und möchte dir einfach mal danken weil du diesen PHP Quellcode:

Code:                   In Zwischenablage kopieren (nur IE)
7">

oben genannt hast. Ich habe ihn gebraucht und suchte nach einer antwort in einem anderen Forum schon seit ein paar Tagen und jetzt seh ich hier zfällig den Code den ich brauche. ^^ Echt nice.


10.

Zitat:
IfGaAaWeDsM postete
Ich habe ihn gebraucht und suchte nach einer antwort in einem anderen Forum schon seit ein paar Tagen und jetzt seh ich hier zfällig den Code den ich brauche.
Keine Ursache :)
Ich hoffe, daß er für deine Zwecke funktioniert, da ich meinen Code ja nicht komplett gepostet habe, sondern nur in Teilen um das Problem zu verdeutlichen.

Gruß
Jan


11.

Zitat:
mySQL alle Datensätze aktualisiert weil er ja durchaus mehrere Datensätze mit Schlüssel 123 und Müller findet. Viele Leute holen ja auch den jeden Tag den gleichen Schlüssel.
Ich müsst eine Methode haben um an die eindeutige Spalten-ID zu kommen. Alles andere wird wohl nicht funktionieren, da zuviele Datensätze ähnlich sind und mySQL dann einfach alles aktualisiert.
das versteh ich jetzt nicht so ganz: Es gibt doch nur EINEN Schlüssel123 und nur EINEN Herr Müller.

Der gleiche Schlüssel kann nicht gleichzeitig bei verschiedenen Personen sein.

Also mußt Du dafür sorgen, daß Schlüssel und Personenname nur einmal vorkommen
und daß nur dann ein Schlüssel ausgegeben werden kann, wenn die vorherige Rückgabe bstätigt wurde.

übrigens:
mich würd mal der Hintergrund interessieren:
was für ein Projekt ist das denn? Hotelreception?


12.

Zitat:
UwBach postete
eine Tabelle BENUTZER (mit einer eindeutigen ID)

Meinst du mit "Benutzer "die Leute die in Frage kommen das sie Schlüssel ausgehändigt bekommen, oder die Leute die das Ausgabe- / Rücknahmeformular bedienen. Weil für die Bediener gibt es bereits eine Liste zur Anmeldung an der Anwendung.

Gruß
Jan


13.

Zitat:
Bernd456 postete
das versteh ich jetzt nicht so ganz: Es gibt doch nur EINEN Schlüssel123 und nur EINEN Herr Müller.

Der gleiche Schlüssel kann nicht gleichzeitig bei verschiedenen Personen sein.
Das ist richtig, es kann aber vorkommen das Hr. Müller den Schlüssel 123 jeden Tag holt, oder mehrmals am Tag. Es ist also unbedingt zu vermeiden das plötzlich alle Datensätze Hr. Müller und Schlüssel 123 betreffend auf z.B. Rückgabe 16.05.2006 um 12:23 Uhr gesetzt werden wo sie gerade noch auf 15.05.2006 19:19 Uhr standen, jede Schlüsselbewegung muss erfasst werden und nachvollziehabr sein.

Zitat:
übrigens:
mich würd mal der Hintergrund interessieren:
was für ein Projekt ist das denn? Hotelreception?
Es ist eine Verwaltung von Firmenschlüsselbunden, etwa 1000 an der Zahl. Und etwa 20 - 25 Leuten die in Frage kommen die Schlüssel zu holen.


14.

ob Müller den Schlüssel jeden Tag oder mehrmals am Tag holt ist egal,
es darf halt nur einen Datensatz mit Schlüssel123 und Müller geben.

bei der Ausgabe wird KEIN neuer Datensatz angelegt, sondern ein Update gemacht
(je Schlüssel existiert bereits ein Datensatz):

Ausgabe:
Schlüsselnummer: 123 Empfänger: Müller Ausgabezeit: 12.03.06 06:00 Rückgabezeit: 00.00.06 00:00 Schlüsselweg: [color="orange"]JA[/color]

Rückgabe:
Schlüsselnummer: 123 Empfänger: Müller Ausgabezeit: 12.03.06 06:00 Rückgabezeit: 12.03.06 08:00 Schlüsselweg: [color="orange"]NEIN[/color]

So siehst dann auch immer welche Schlüssel momentan im Haus sind und welche nicht.


15.

ergänze dein insert-statement wie folgt :

Code:                   In Zwischenablage kopieren (nur IE)
8">

und verwende dann folgendes update-statement :
Code:                   In Zwischenablage kopieren (nur IE)
9">




16.

Zitat:
Bernd456 postete
bei der Ausgabe wird KEIN neuer Datensatz angelegt, sondern ein Update gemacht
(je Schlüssel existiert bereits ein Datensatz):

Okay, aber wie vollziehe ich dann nach, wer wann welchen Schlüssel geholt hat...Wenn ich als Suchkriterium Schlüssel 123 eingebe brauche ich ne Liste ALLER Schlüsselbewegungen für Mai oder für 2006. Und das suchbar nach Name, Schlüsselnummer, Datum, Monat und Jahr. Daher brauche ich für jede Schlüsselbewegung einen separaten Eintrag. Also muss die Ausgabe per INSERT sein und die Rückgabe per UPDATE. INSERT legt nen neuen Datensatz für die Ausgabe an und UPDATE trägt die Rückgabe ein. Das ist ja soweit auch machbar, bis auf die einwandfreie Zuordnung.
Es MUSS definitiv über UPDATE ... WHERE id = "eindeutige_ID_der_Spalte" gemacht werden. *bumms* und schon würde es funktionieren, ich stehe nur vor dem Problem bei dem UPDATE die ID zu übergeben. Meine Kollegen aus den anderen Abteilungen wissen ja die ID nicht, nichtmal ich weiss die so ohne weiteres. WENN ich also im Formular ein Feld "ID" einfüge muss da ja was rein, entweder gibbet nen Trick die ID VOR dem Absenden des Formulars auszulesen und zu übergeben oder ich mache eine Liste die per SELECT * FROM schluessel eine Liste aller Schlüssel holt und man dann mit ner Checkbox den Fehlenden Schlüssel anhakt, dann habe ich auch die Spalten-ID als value für die Checkbox. Aber das ist bei 1000 Schlüsseln und ca. 100 Bewegungen am Tag "etwas" zu kompliziert. Die Ideallösung wäre ein Form wo nur 3 Elemente sichtbar drauf sind. Nämlich "Schlüsselnummer", "Rückgabezeit" und ein "Senden" Button.
*buhhhhuuu* Ich werde bekloppt, wieso habe ich mir das aufhalsen lassen?

Gruß Jan


17.

Zitat:
Meine Kollegen aus den anderen Abteilungen wissen ja die ID nicht, nichtmal ich weiss die so ohne weiteres
Genau das ist Dein Problem und nun vergiss einfach mal PHP und SQL.

Du mußt Dir eine Methode einfallen lassen, wie ein Schlüssel EINDEUTIG identifiziert werden kann. Am besten klebst Du auf jeden Schlüssel eine eindeutige Nummer - das KANN auch die ID sein, die von MySQL vergeben wird, wenn Du den Schlüssel in eine Datenbank einträgst. Aber das braucht es nicht zu sein - Du darfst (und das ist durchaus auch legitim) die Schlüssel auch selbständig benennen/bekleben.

Jeder Schlüssel bekommt einen Anhänger (wie im Hotel) wo EINDEUTIG erkennbar ist, welcher Schlüssel das ist. In der Datenbank nachher wird dieses Feld mit aufgenommen, man macht einen UNIQUE INDEX daraus und über diesen UNIQUE INDEX steuerst Du den INSERT und den UPDATE.

Anders geht es nicht. Du MUSST die Schlüssel kennzeichnen. Ohne wenn und ohne aber. Wobei ich eigentlich das Gefühl hatte, dass die sog. "Schlüsselnummer" doch genau das entsprechende Feld ist - oder gibt es verschiedene Schlüssel mit der gleichen Nummer? Das wäre schlecht, dann mußt Du eine neue Schlüsselnummer erfinden.


18.

Zitat:
Rana postete
Anders geht es nicht. Du MUSST die Schlüssel kennzeichnen. Ohne wenn und ohne aber.
Sie sind gekennzeichnet. Schlüssel 001 - 999. Jeder Schlüssel hat ne eigene Nummer und nen Haken im Tresor. Ich kann sogar sagen, daß Schlüssel 123 z.B. die Werkstatt ist, oder das Chefbüro oder das Lager.
Also du meinst ich soll die Schlüsselnummer (Hakennummer) = ID nehmen. Aber auch da würde sich doch auch das Problem stellen, daß die mehrmals vorkommt, wenn der Schlüssel 123 oder 931 oder whatever mehrmals am Tag rausgeht. Denke ich schon zu abstrakt oder warum sehe ich den Wald vor lauter Bäumen nicht?

Gruß
Jan


19.

wenn Du alle Schlüsselbwegungen brauchst, dann ist das was anderes,
dann brauchst Du bei jeder Ausgabe und jeder Rückgabe ein INSERT.

also:

SchlüsselNr. = 123
Rückgabe = JA
AusgabeNr = 885
Ausgabeuhrzeit = 00.00.00 00:00
Rückgabeuhrzeit = 02.04.06 22:00
Ausgabean: Müller

Ausgabenr wäre dann eine fortlaufende Nummer für die
es genau 2 Datensätze gibt (einmal Rückgabe=JA und einmal Rückgabe=NEIN)

So kannst auch nach allen Schlüsseln suchen die Müller im Moment hat, oder in
einem bestimmten Zeitraum hatte.


20.

Es geht doch nicht darum den Schlüssel zu identifizieren sondern den LETZTEN Ausgabesatz zu einem Schlüssel ! Eine Möglichkeit habe ich in meinem Posting Nr. 15 beschrieben, es gibt aber sicherlich noch andere Möglichkeiten.


21.

Zitat:
Also du meinst ich soll die Schlüsselnummer (Hakennummer) = ID nehmen
Nein, das würde ich nicht tun.
Zitat:
Aber auch da würde sich doch auch das Problem stellen, daß die mehrmals vorkommt, wenn der Schlüssel 123 oder 931 oder whatever mehrmals am Tag rausgeht. Denke ich schon zu abstrakt oder warum sehe ich den Wald vor lauter Bäumen nicht?
Du siehst in der Tat den Wald vor lauter Bäumen nicht und verwechselst ein paar IDs miteinander:

Du brauchst eine Tabelle "Schluessel" - dort werden alle Schlüssel eingetragen. Die Tabelle hat meinetwegen nur zwei Felder, die ID und die Schlüsselnummer. Weil aber die Schlüsselnummer eindeutig ist und weil sonst in dieser Tabelle nichts steht, kannst Du theoretisch auf diese Tabelle verzichten - es sei denn, dort soll noch eine Beschreibung aufgenommen werden, beispielsweise "Schlüssel für die Werktstatt", oder es soll vielleicht eine Bedingung aufgenommen werden ("Schlüssel darf nicht Sonntags verliehen werden") usw. Das müssen wir noch klären. In jedem Fall ist wäre dann DIESE(!) ID evtl auch wegzulassen, weil die Schlüsselnummer ja schon eindeutig ist (= Primärschlüssel). Weil man aber sagt, man solle mit dem Primärschlüssel KEINERLEI Eigenschaften eines Objekts verbinden, würde ich es trotzdem so machen, dass Du eine ID für jeden Schlüssel vergeben läßt, die natürlich verschieden sein wird von der Schlüsselnummer (oder auch zufällig mal gleich).

Dann hast Du die Tabelle "Bewegungen" - und dort setzt irgendwie Dein Verstand aus. Diese Bewegungen protokollieren, wer wann welchen Schlüssel bekommen hat und wann er zurückgegeben wurde. Für jede Bewegung wird beim Neuanlegen eine ID erzeugt - aber diese ID ist NICHT(!!!!!) die Schlüssel-ID. Das verwechselst Du offensichtlich. Das ist nur eine fortlaufende Nummer, wie oft (insgesamt) Schlüssel verliehen wurden. Du hast blöderweise die Bewegungstabelle "schluessel" genannt - daher Deine Konfusion. Nenne sie um und Du begreifst es besser. Ich nenne sie fortan "Bewegungen".

Du hast das technische Modell gewählt, dass für jedes Verleihen ein neuer Datensatz angelegt wird, der kennt ein Ausgabedatum und ein Rückkehrdatum. Außerdem kennt es die "Schlüsselnummer". An dieser Stelle könntest Du anstatt der Schlüsselnummer die Schlüssel-ID abspeichern - die steht zwar nicht auf dem Schlüssel drauf, aber mit Hilfe der Tabelle "Schluessel" und mit Hilfe der Schlüsselnummer findest Du die Schlüssel-ID ja heraus. Nur - das ist ggf. eine Abfrage zu viel, man kann ja (wie gesagt) auf die Schlüssel-ID verzichten, wenn man ganz auf die Schlüsseltabelle verzichtet. Das mußt Du entscheiden.

Nun gehts weiter. Ein Schlüssel wird vergeben, ein neuer Datensatz wird angelegt (und genau diesen willst Du später wiederfinden - deswegen "glaubst" Du, Du bräuchtest die ID von diesem Datensatz: brauchst Du aber nicht!). Natürlich könntest Du (wie in einer Videothek) dem Schlüsselauslieher einen Zettel mitgeben, dort steht eine "Vorgangsnummer" drauf - genau die ID, die Du gerne hättest. Zum Zurückgeben des Schlüssels müßte man diesen Zettel mitbringen. Aber das ist Krampf - und die Zettel werden verloren.

Es geht doch einfach: woran erkennst Du denn, was der "richtige" Datensatz für Deinen UPDATE ist? Ist doch einfach: das ist der Datensatz, der die Schlüsselnummer besitzt, die Schlüssel steht UND es ist (weil es ja viele solche Sätze gibt) derjenige, der das NEUESTE Ausgabedatum hat. Oder (noch eine Möglichkeit), der noch KEIN Rückgabedatum eingetragen hat (kannst Du auf NULL o.ä· abfragen). Du mußt natürlich die Uhrzeit mit speichern (das Format dazu heißt DATE_TIME - bzw. besser ist es sogar, das Format TIMESTAMP zu nehmen, das versorgt MySQL von alleine!).

Also, so findest Du diesen Satz:

Code:                   In Zwischenablage kopieren (nur IE)
10">

Die obige Abfrage liefert Dir die ID des neuesten Datensatz, wann der Schlüssel mit der Nummer $schluesselnummer zuletzt vergeben wurde. Mit ein bischen PHP Code ermittelst Du daraus die $id und machst dann direkt den UPDATE:

Code:                   In Zwischenablage kopieren (nur IE)
11">

So einfach ist das!


22.

Vielen Dank an alle, die hier Vorschläge gepostet haben. Ich habe jetzt als Ansatz die Vorschläge von "UwBach" und "rana" aufgegriffen.
Ich hoffe das ich damit endlich mein Projekt abschließen kann :)

Vielen Dank nochmal an alle, die sich die Mühe gemacht haben hier im Thread zu posten!

Gruß
Jan


Hier gehts zum Orginal Eintrag "Update ... Where Problem" im Forum
 
phpforum.de | Impressum