Antworten auf deine Fragen:
Neues Thema erstellen

Vermeiden, daß mehrere gleichzeitig den selben Datensatz bearbeiten (erl. Danke)

strichcode

Nicht mehr ganz neu hier

Ja! Jetzt ist das Gemeckere weg, aber er gibt immer noch
01.01.1970 - 01:00:00
aus.
In der DB steht aber: 2014-03-28 10:53:57

Nochmal Danke, daß Du immer noch dabei bist.
 

Duddle

Posting-Frequenz: 14µHz

Ach, klar, übersehen: du stellst die Anfrage an die Datenbank, diese gibt eine Ressource zurück (quasi eine temporäre Tabelle mit dem Ergebnis). Diese Ressource musst du jetzt zeilenweise durchgehen und die eigentlichen Daten holen. In deinem Fall ist es nur eine, also brauchst du keine Schleife.
PHP:
$datefreiergebnis = mysql_query($datefrei);
$zeile = mysql_fetch_assoc($datefreiergebnis);
$stamp = $zeile['UNIX_TIMESTAMP (AENDERDATUM)'];


Duddle
 

strichcode

Nicht mehr ganz neu hier

Jawoll, jetzt gibt er das Datum aus, was auch tatsächlich in der DB steht.

Da aber die jetzige Zeit deutlich später als 60 Sekunden ab dem Datum in der DB ist,
stimmt also mein unterer Code-Teil auch nicht.
Guckst Du da nochmal drüber?

PHP:
if( time()-$stamp >= 60 ) {
$TTG_NR = $_POST['TTG_NR'];
$aendern = "UPDATE `stammdaten`
SET
`BESETZT`='ne'
WHERE
`TTG_NR`='$TTG_NR' ";
 

Duddle

Posting-Frequenz: 14µHz

Ich kann nicht ganz nachvollziehen, was jetzt dein Problem ist. Deine Logik ist: wenn 60 Sekunden oder mehr zwischen jetzt und dem Timestamp liegen, führe die Schritte im if-Block aus. Was ist jetzt genau der Fehler / das von der Erwartung abweichende Ergebnis?


Duddle
 

strichcode

Nicht mehr ganz neu hier

Ich weiß nicht, ob wir aneinander vorbeireden?
Wenn ich jetzt das Script starte, liegen mehr als 60 sekunden zwischen jetzt und dem Timestamp. Also müsste das ausgeführt werden, was in dem if-Block steht.
Macht er aber nicht.
Es wird das update (nämlich das Besetzt-Feld auf "ne" zu setzten) nicht ausgeführt.

Siehe weiter oben:
Wie anfangs gesagt, du hast ein Lock implementiert und stößt jetzt auf ein mögliches Verhungern der teilnehmenden Prozesse/Nutzer.

Ein Lösungsansatz ist dieser: du hast für jeden (gesperrten) Datensatz eine "letzte Aktivität" als Zeitstempel. Beim Aufrufen prüft die Seite, ob der Datensatz bereits gesperrt ist (siehe oben: Schritt 1): falls ja, prüfst du zusätzlich, ob die letzte Aktivität länger als 30 Minuten her ist. Wenn ja, entsperre den Artikel. Die restliche Logik (oben als 2b bezeichnet) sperrt ihn dann gleich wieder.
Zusätzlich wird bei jeder Aktion des Nutzers (im gröbsten Fall nur das Setzen einer Sperre und das Abschicken des Formulars) der Zeitstempel aktualisiert.

Das versuche ich zu erreichen. Dieses "Entsprerren meiner Karteileiche".
Ist jetzt der code im if-Block falsch?
 

Enigmon

Nicht mehr ganz neu hier

Hallo

Springt er überhaupt in den if -Block?
Check das mal mit einer Ausgabe am Anfang des if-Blocks.
Oder prüfe das Ergebnis von time()-$stamp mit einer Ausgabe vor dem if-Block.

Gruss
Thomas
 

strichcode

Nicht mehr ganz neu hier

Hallo Thomas,
schön, daß sich noch jemand erbarmt ;-) und danke für Deine Hilfe.

Wenn ich Dich richtig verstehe:

Code:
date_default_timezone_set("Europe/Berlin");
$datefrei = "SELECT UNIX_TIMESTAMP (AENDERDATUM) FROM stammdaten WHERE TTG_NR = '".$_POST['TTG_NR']."'";
$datefreiergebnis = mysql_query($datefrei);
$zeile = mysql_fetch_assoc($datefreiergebnis);
$stamp = $zeile['UNIX_TIMESTAMP (AENDERDATUM)'];

echo date("d.m.Y - H:i:s", $stamp);
if( time()-$stamp >= 60 ) {
echo date("d.m.Y - H:i:s", $stamp);
$TTG_NR = $_POST['TTG_NR'];
$aendern = "UPDATE `stammdaten`
SET
`BESETZT`='ne'
WHERE
`TTG_NR`='$TTG_NR' ";
}
}

ergibt ganz brav: 28.03.2014 - 10:53:57 28.03.2014 - 10:53:57

Ich habe jetzt
Code:
echo date("d.m.Y - H:i:s", $stamp);
einmal vor dem if und einmal in dem if-Block stehen und bekomme zweimal das ausgegeben, was auch so in der DB steht.
Also springt er in den if-Block und dieses
Code:
if( time()-$stamp >= 60 ) {
ist falsch, oder?
 

strichcode

Nicht mehr ganz neu hier

Jetzt wird es lustig:

PHP:
date_default_timezone_set("Europe/Berlin");
$datefrei = "SELECT UNIX_TIMESTAMP (AENDERDATUM) FROM stammdaten WHERE TTG_NR = '".$_POST['TTG_NR']."'";
$datefreiergebnis = mysql_query($datefrei);
$zeile = mysql_fetch_assoc($datefreiergebnis);
$stamp = $zeile['UNIX_TIMESTAMP (AENDERDATUM)'];

echo date("d.m.Y - H:i:s ", $stamp);
if( time()-$stamp >= 60 ) {
echo date("d.m.Y - H:i:s", $stamp);
$TTG_NR = $_POST['TTG_NR'];
$aendern = "UPDATE `stammdaten`
SET
`BESETZT`='ne'
WHERE
`TTG_NR`='$TTG_NR' ";
}
echo "aendern: $aendern<br>";
}

ergibt: 28.03.2014 - 10:53:57 28.03.2014 - 10:53:57aendern: UPDATE `stammdaten` SET `BESETZT`='ne' WHERE `TTG_NR`='09123456'

Stimmt aber nicht: in der DB steht immernoch in AENDERDATUM: 2014-03-28 10:53:57
und in BESETZT "on".

Da ist wohl ein größerer Bock im Script. Der Rest des Codes beinhaltet aber kein "setze besetzt auf on" mehr.

Ich bin schon wieder verwirrt.

Gleichzeitig google ich hier nach dem Ding die Zeiten zu vergleichen, kann es sein, daß
strtotime
ein richtiges Stichwort zum suchen ist?
Aber erstmal ist ja schon was anderes falsch, siehe oben.
 

strichcode

Nicht mehr ganz neu hier

Hallo Chickenshooter,
vielen Dank, daß Du mir auch helfen möchtest.

Ich glaube, ich habe das Problem mit den beiden "Datum's" soweit gelöst, es funktioniert nur mein if-Block nicht. Weil:
Hier mein mittlerweile etwas geänderter Code:

PHP:
date_default_timezone_set("Europe/Berlin");
$datefrei = "SELECT UNIX_TIMESTAMP (AENDERDATUM) FROM stammdaten WHERE TTG_NR = '".$_POST['TTG_NR']."'";
$datefreiergebnis = mysql_query($datefrei);
$zeile = mysql_fetch_assoc($datefreiergebnis);
$stamp = $zeile['UNIX_TIMESTAMP (AENDERDATUM)'];
$jetzt = time ();
$diff = $jetzt - $stamp;

echo date("d.m.Y - H:i:s ", $stamp);
echo $diff;
if( $diff >= 60 ) {
$TTG_NR = $_POST['TTG_NR'];
$aendern = "UPDATE `stammdaten`
SET
`AENDERDATUM` = NOW( ) ,
`BESETZT`='ne'
WHERE
`TTG_NR`='$TTG_NR' ";
}
echo "aendern: $aendern<br>";

Ich bekomme: 28.03.2014 - 10:53:57 262398 ausgegeben.

Rechne ich 262398 / 60 / 60 / 24 ergibt das 3,04 was so in etwa hinkommt, denn
28.03.2014 - 10:53:57 ist etwa 3 Tage und ein bischen her.

Da diese Differenz nun größer ist als 60 sollte er das update in der DB vornehmen, tuts aber nicht. Er sagt zwar: aendern: UPDATE `stammdaten` SET `AENDERDATUM` = NOW( ) , `BESETZT`='ne' WHERE `TTG_NR`='09123456'
Stimmt aber nicht, in der DB haben sich weder BESETZT noch AENDERDATUM geändert.

Wie oben schon mal gesagt, ich bin blutiger Anfänger. Vielleicht ist es jetzt nur noch eine blöde Klammer, Reihenfolge, oder sonst was, worauf ich nicht komme
 

strichcode

Nicht mehr ganz neu hier

unverändert.
28.03.2014 - 10:53:57 264079aendern: UPDATE `stammdaten` SET `AENDERDATUM` = NOW( ) , `BESETZT`='ne' WHERE `TTG_NR`=' 09123456 '
und kein Datenbankeintrag.

Danke für Deine Mühe.
 

Enigmon

Nicht mehr ganz neu hier

Teste mal den Befehl per Hand in der DB (phpmyAdmin oder per Kommandozeile):

UPDATE `stammdaten` SET `AENDERDATUM` = NOW( ) , `BESETZT`='ne' WHERE `TTG_NR`=' 09123456 '

und schliess den Befehl mal bitte mit Semikolon ab.

Ist es richtig das bei TTG_NR vor (und nach) dem Nummerncode ein Leerzeichen gesetzt wird???
 

strichcode

Nicht mehr ganz neu hier

Nein, das mit dem Leerzeichen ist nicht richtig, das kommt wegen chickenshooters post oben. Habe ich wieder rückgängig gemacht.

In phpmyAdmin funktioniert der Befehl tadellos, egal ob mit, oder ohne Semikolon.

Nochmal zusammengefasst:
PHP:
$datefrei = "SELECT UNIX_TIMESTAMP (AENDERDATUM) FROM stammdaten WHERE TTG_NR = '".$_POST['TTG_NR']."'";
$datefreiergebnis = mysql_query($datefrei);
$zeile = mysql_fetch_assoc($datefreiergebnis);
$stamp = $zeile['UNIX_TIMESTAMP (AENDERDATUM)'];
$jetzt = time ();
$diff = $jetzt - $stamp;

echo date("d.m.Y - H:i:s ", $stamp);
echo $diff;
if( $diff >= 60 ) {
$TTG_NR = $_POST['TTG_NR'];
$aendern = "UPDATE `stammdaten`
SET
`AENDERDATUM` = NOW( ) ,
`BESETZT`='ne'
WHERE
`TTG_NR`='$TTG_NR' ";
}
echo "aendern: $aendern<br>";

Gibt aus:
31.03.2014 - 17:03:50 208aendern: UPDATE `stammdaten` SET `AENDERDATUM` = NOW( ) , `BESETZT`='ne' WHERE `TTG_NR`='09123456'
Ändert aber nichts in der DB.

Das Datum ist jetzt von heute, weil ich ja gerade den Befehl in phpmyAdmin eingegeben habe.

Danke für Deine Geduld.
 

strichcode

Nicht mehr ganz neu hier

Ich verstehe Deine Frage nicht bzw. bin ich mittlerweile auch schon wieder ganz strubbelig im Kopf.
$aendern soll im if-Block stattfinden.

Wenn Du noch Lust hast, guck Dir doch mal die erste Seite vom Thread an.

Das ganze ist ein Formular um Daten einzugeben. Damit nicht zwei Mitarbeiter gleichzeitig einen Datensatz beackern ist das Datenbankfeld BESETZT da.
Wenn einer das Formular aufruft, soll BESETZT auf "on" gestellt werden und damit ist die Sperre für andere da. Bei Abspeichern wird BESETZT wieder auf "ne" gesetzt.

Wie duddle da so schön erklärt hat, fabriziere ich auf diese Weise aber Karteileichen.
Wenn z.B. ein Mitarbeiter das Formular aufruft und dann NICHT abspeichert, bleibt der Datensatz also immer gesperret.

Obiges Script soll prüfen, ob der Datensatz länger als z.B. 2 Stunden BESETZT war und ihn wenn ja, bei Aufruf freischalten.

Verstehst Du, was ich meine?

Sorry, besser kann ich mich nicht Ausdrücken und die Fachausdrücke beherrsche ich nicht besser.

Danke für Deine Geduld.
 

Duddle

Posting-Frequenz: 14µHz

Du schickst das UPDATE nie per mysql_query() an den Server. Zumindest nicht in dem Code, den du zeigst.


Duddle
 

strichcode

Nicht mehr ganz neu hier

Oh Gott! Ich schäme mich so......

Vielen Dank an alle, für Eure Hilfe. (Ich geh jetzt in den Keller)

Duddle: Eine Frage noch: jetzt muß ich nur noch eine Prüfung direkt vor Abschicken des Formulars machen, richtig?
Beispiel: Mitarbeiter A macht das Formular auf und geht für 5 Stunden weg.
Mitarbeiter B kommt nach 2 Stunden und ändert das Formular (Der Datensatz war ja nun wieder freigegeben)
Mitarbeiter A kommt wieder und speichert sein offenes Formular ab.

Dann wären die Änderungen von B wieder überschrieben. Also nochmal eine Prüfung. Richtig?
 

Duddle

Posting-Frequenz: 14µHz

Dann wären die Änderungen von B wieder überschrieben. Also nochmal eine Prüfung. Richtig?
Korrekt. Das ist noch so ein Grenzfall.

Hier gibt es nicht direkt eine "beste" Lösung. Grundsätzlich musst du aber unterscheiden können, welcher Nutzer die letzte Aktivität ausgelöst hat. Ist dieser Nutzer der gleiche, der das Formular abschicken will, ist alles okay. Falls nicht, ist ein anderer reingerutscht und der Nutzer muss von vorn anfangen.
Diese Unterscheidung könntest du an Nutzer-Accounts oder an IP-Adressen binden, je nachdem was du für eindeutige Informationen sammeln kannst.

Eine zusätzliche Hilfe wäre ein kleiner (JavaScript-)Countdown auf der Formularseite selbst (auch versteckt), der dem Nutzer Bescheid gibt, dass er in den Timeout gerannt ist und daher seine Eingaben verworfen wurden. Aber das ist dann wieder ein Nice-To-Have, statt eine Kernfunktion.


Duddle
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.565
Beiträge
1.538.066
Mitglieder
67.488
Neuestes Mitglied
Andrew56524
Oben