• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[PHP]: Seite nur einem User gleichzeitig anzeigen

petz_e

New member
Hallo,

Ich hab da so ein Problem, wo ich nicht richtig weiss wie ich das anpacken soll.

Also, es geht darum immer nur einem User gleichzeitig Zugriff auf ein Formular zum Bearbeiten zu geben. Da liegt der Gedanke nahe in der mySQL Tabelle ein Flag zu setzen wenn der User den Link zum Bearbeiten anklickt. Wenn er seine Änderungen speichert wird dieses Flag wieder zurückgesetzt.

Aber was passiert wenn der User seinen Browser ohne zu speichern schliesst oder eine andere Adresse eingibt. Dann bleibt dieses Flag gesetzt und dieser Record für immer gesperrt.

Wie geht man da vor. Welche Methoden gibt es da? Das User-Management wird mit Sessions geregelt, aber diese bleiben ja auch nach dem Schliessen des Browsers noch einige Zeit erhalten, oder?

Patrick
 
Es gibt keine Methode mi der man das zuverlässig machen könnte. Eine Idee wäre, dass man in regelmässigen Abständen eine Ajax-Abfrage zum Server macht um zu sagen, dass man noch am bearbeiten ist. Aber auch hier kann Niemand garantieren, dass der User nicht den Browser offen lässt und in die Ferien fährt.

Die Andere Methode ist, dass versuchst festzustellen ob ein anderer User inzwischen Änderungen gemacht hat und dann eine entsprechende Fehlermeldung ausgibst. Wikipedia macht es z.B. so.
 
ich setz für sowas ein timelimit, also z.b. 5 minuten. wenn ein user die seite aufruf merk ich mir die zeit und wenn eine dieser beiden bedingungen eintreten wird der timelock wieder entfernt:
a) der user speichert
b) die 5minuten laufen ab
 
ich setz für sowas ein timelimit, also z.b. 5 minuten. wenn ein user die seite aufruf merk ich mir die zeit

Wenn der Benutzer aber in dieser Zeit noch nicht fertig ist geht alles verloren.
Wenn dann würd ich per AJAX übergeben, dass man noch am Bearbeiten ist, aber gleichzeitig per Javascript ein Timeout laufen lassen von der letzten Eingabe des Benutzers an.
 
ich würde das auch mit Ajax lösen. Alle X Sekunden sendet der Browser nen "bin-noch-da" Signal. Zusätzlich solltes du noch nen Timelimit setzen nach dem der User kein Zugriff mehr auf die Seite hat (für den Fall dass er die Seite zwar noch offen hat, aber nicht mehr daran arbeitet). Dieses Timelimit könntest du nach jeder Aktion des Users neusetzen.
Falls das Timelimit abgelaufen ist und dann ein "bin-noch-da"-Nachricht kommt, könntest du per Antwort dem User auch noch mitteilen, dass er leider zu lange nichts gemacht hat.
 
Ich habe jetzt mal versucht das so hinzukriegen. Das Konzept ist mir eigentlich klar, nur an der Ausführung haperst noch ein bischen :)

Dieses Timelimit muss ja vom Server kommen, ja? Der Server muss jedesmal wenn ein "ich-bin-noch-da" Signal kommt diesen Timer wieder neu setzen. Sollte er ablaufen, kann davon ausgegangen werden, dass der User verschwunden ist. Das heisst ja aber dass ein PHP-Script die ganze Zeit alle paar Sekunden eine Abfrage machen muss?! Wie geht so was? Ein Script das unendlich läuft??

Mit Ajax kannte ich mich noch nicht so aus. Ich hab mir da mal ein paar Beispiele angekuckt. Soweit ich daraus schliessen kann, kann man mit AJAX Daten an den Server schicken und von einem Script bearbeiten lassen und Daten zurückschicken (z.B. mit PHP) ohne die HTML Seite neu zu laden. Aber nachdem dieses Script durchgelaufen ist, wirds wieder geschlossen (das Bearbeitungsscript) und bei der nächsten Aktion neu geladen.

/Patrick
 
Das PHP-Skript muss nicht ewig laufen, im Gegenteil. Wenn das Skript ewig liefe, würde die Ajax-Anfrage nie beendet werden. Bei jeder Ajax-Anfrage überprüft das Skript ob die Zeit schon abgelaufen ist und schickt dann eine entsprechende Antwort (am besten XML) an den Client zurück. Dann ist das Skript fertig. Das muss auch nicht alle paar Sekunden sein, je nach Zeitlimit genügt auch alle 30 sek oder einmal pro Minute.
 
Das PHP-Skript muss nicht ewig laufen, im Gegenteil. Wenn das Skript ewig liefe, würde die Ajax-Anfrage nie beendet werden. Bei jeder Ajax-Anfrage überprüft das Skript ob die Zeit schon abgelaufen ist und schickt dann eine entsprechende Antwort (am besten XML) an den Client zurück. Dann ist das Skript fertig. Das muss auch nicht alle paar Sekunden sein, je nach Zeitlimit genügt auch alle 30 sek oder einmal pro Minute.
Ja aber das PHP-Script wird ja von AJAX aufgerufen, also vom Client. Wenn der Client verschwunden ist ohne sich abzumelden, wird dieses Script ja auch nicht mehr aufgerufen. Wie teste ich dann ob der Timer abgelaufen ist?

/Patrick
 
Du Testest es wenn der nächste Benutzer das Formular bearbeiten möchte. Beispiel:

Benutzer 1: Fängt an Formular zu bearbeiten. Entsprechender Ajax-Request wird geschickt, der Benutzer erhält die Freigabe, da er zu diesem Zeitpunkt der erste ist.

2min später

Benutzer 2: Möchte das Formular bearbeiten, erhält aber keine Freigabe, da Benutzer 1 noch angemeldet ist.

2min später

Benutzer 1: Erhält einen dringenden Telefonanruf und verlässt das Haus ohne den Computer auszuschalten oder den Browser zu schliessen.

5 min später

Die Bearbeitungszeit für Benutzer 1 ist abgelaufen. Zu diesem Zeitpunkt wird kein Skript ausgeführt.

2 min später

Benutzer 2 versucht es erneut und erhält die Freigabe, da die Bearbeitungszeit für Benutzer 1 abgelaufen ist.
 
Du Testest es wenn der nächste Benutzer das Formular bearbeiten möchte. Beispiel:

Benutzer 1: Fängt an Formular zu bearbeiten. Entsprechender Ajax-Request wird geschickt, der Benutzer erhält die Freigabe, da er zu diesem Zeitpunkt der erste ist.

2min später

Benutzer 2: Möchte das Formular bearbeiten, erhält aber keine Freigabe, da Benutzer 1 noch angemeldet ist.

2min später

Benutzer 1: Erhält einen dringenden Telefonanruf und verlässt das Haus ohne den Computer auszuschalten oder den Browser zu schliessen.

5 min später

Die Bearbeitungszeit für Benutzer 1 ist abgelaufen. Zu diesem Zeitpunkt wird kein Skript ausgeführt.

2 min später

Benutzer 2 versucht es erneut und erhält die Freigabe, da die Bearbeitungszeit für Benutzer 1 abgelaufen ist.
OK, jetzt hab ichs. In diesem Fall ist es also kein richtiger Timer, der von einem Anfangswert auf Null zurückläuft, sonder hier wird vielmehr der Timestamp gespeichert und jedesmal mit dem aktuellen verglichen.

Jetzt versehe ich es. Und jetzt müsste ich das auch umsetzen können. Danke für die Hilfe.

/Patrick
 
Genau, einen Timer könntest du höchstens auf Client-Seite anzeigen um dem Benutzer mitzuteilen, dass ihm, wenn er keine weitere Aktion dürchführt, die Bearbeitungserlaubnis entzogen wird. Aber ob es der Mehraufwand dir Wert ist, musst du selber entscheiden. Wirklich notwendig ist es nicht.
 
braucht man nicht unbedingt. Da der Client ja regelmäßig AJAX-Request sendet. Nach dem Timer - der verhindern soll, dass jemand mit nem offenen Fenster die Seite dauerhaft sperrt- abgelaufen ist, kommen ja immer noch AJAX-Requests vom Client, über den Response vom Server könnte man dem Benutzer mitteilen dass er keinen Zugriff mehr hat
 
Hi, die beschriebene Lösung funktioniert, leider wurde sie überhaupt nicht vom Klienten akzeptiert. Eine Lösung mit Timelimit will er nicht haben.

Das Problem ist ja nur wenn der User sich nicht richtig abmeldet und einfach den Browser schliesst oder eine andere Seite besucht. Dieses Event kann man meiner Meinung nach nicht zuverlässig abfragen, oder?

Ich versuchte mit window.onunload eine Funktion zu programmieren die dem Server mitteilt dass die aktuelle Seite wieder verlassen wurde, aber habe bis jetzt noch keine Resultate erhalten.

Patrick
 
Nein, http ist zustandslos
Ich habe das mal für Dich korrigiert.

Verbindungslos wäre z.B. UDP, aber TCP ist immer verbindungsorientiert. HTTP ist zwar immer nur temporär "verbunden", aber wenn eine Verbindung benötigt wird, so muss diese explizit aufgebaut und (am Ende) abgebaut werden. In der verbindungsfreien Zeit können, anders als bei UDP, auch keine Daten übermittelt werden. Bei UDP kann ich einfach ein Datenpaket mit Absender- und Empfängeradresse losschicken, ohne den Empfänger vorher zu kontaktieren. Ob das Paket dann ankommt ist Glückssache, ob die Gegenstelle antwortet auch.
 
Typisch Kunde: Will etwas haben was nicht geht und akzeptiert keine Alternativen.

Onunload wird leider nicht aufgerufen wenn der Browser oder der PC abschmiert. Du kannst aber trotzdem überprüfen ob der Browser noch da ist indem du regelmässig eine Ajax-Abfrage losschickst ("Hey Server, ich bin der mit der session 123 und ich bin noch da."). Wenn die Abfrage ausbleibt weisst du, dass der Browser oder der PC abgeschmiert ist. Onunload kannst du ja trotzdem verwenden.
 
Zurück
Oben