PHP $SQL-Abfrage beim verlassen der aktuellen Seite

raven16

Lieutenant
Registriert
Nov. 2008
Beiträge
580
Hi,

zunächst erklär ich erst mal meinen Aufbau und dann das Problem

Aufbau:
Ich habe eine Tabelle, in der man bis zu 10 Zeilen mit Anfragen von zukünftigen Benutzern pro Seite auswählen kann.
Hat man Zeilen ausgewählt kann man auf "Antworten" klicken und jede ausgewählte Anfrage nacheinander beantworten.
Wenn der Benutzer auf "Antworten" klickt, werden alle ausgewählte Anfragen in der Datenbank in der Spalte active auf 1 gesetzt.
Dieses active=1 hat zur Folge, das kein Anderer diese Anfragen zur gleichen Zeit beantworten kann.
Der Grund dafür ist, dass ich nicht will, das eine Anfrage zwei Antworten bekommt.

Problem:
Wenn man sich es anders überlegt und im Browser eine Seite zurückgehen lässt zur Tabelle, dann wird das active nicht wieder auf 0 gesetzt und die Tabelle wird dadurch nach und nach leerer und dadurch verschwinden, manche Anfragen auf ewig und können nicht mehr beantworten.

Ich habe nen Button gemacht der heißt "zurück zur Anfragetabelle" und setzt alle geöffneten Antworten wieder mit active=0 zurück.
Aber ich kann mit Sicherheit sagen, das den nicht jeder diesen Button drückt und was ist, wenn der Antworter den Browser schließt, weil er auf einmal doch keine lust hat die Probleme zu beantworten? Dann gehen die Anfragen auch verloren!

Ich hoffe, ihr versteht mein Problem und habt vielleicht ein paar Lösungsansätze für mich.
Ich hatte gedacht, dass man vielleicht nur jede einzelne Anfrage, welche gerade geöffnet wird, mit active auf 1 setzt.

Nur das Problem sitzt ja beim Verlassen der Anfragen!
 
Du kannst nicht wissen, wenn jemand eine Seite verlässt.

In der Praxis wird das Problem durch eine Art "Timeout" umgangen. Das sieht so aus, dass du jemanden eine gewisse Zeit bis zum Beantworten einer Anfrage lässt. Diese Zeit kann in der Praxis sehr kurz sein, da du ja z.B. per JavaScript "keep alives" schicken kannst.

Das heißt: Wenn jemand eine Anfrage beantworten will, dann prüfst du in dem Moment, wann jemand anderes das letzte mal diese Anfrage beantworten wollte. Ist dies bereits länger her, dann gibst du es frei und er darf die Anfrage bearbeiten.

Wenn jemand nun dabei ist eine Anfrage zu bearbeiten, dann lässt du diesen periodisch (auf jeden Fall aber einmal beim Laden der Seite) ein kurzes "Lebenszeichen" schicken und der Server speichert sich einfach das Datum des letzten Lebenszeichens. Wenn nun jemand anderes die Anfrage bearbeiten möchte, kannst du einfach vergleichen wie lange das letzte Lebenszeichen des vorherigen Bearbeiters her ist und dementsprechend entscheiden, ob du es freigibst oder nicht.
 
Füge einen Zeitstempel hinzu, wann "activ=1" eingestellt wurde.

Erstell einen CronJob. Lass ihn alle, keine Ahnung, 24 Stunden überprüfen ob es Einträge mit 'active=1' gibt die bereits seit 2 Stunden 'active=1' haben. Falls ja sollen diese auf 'active=0' gesetzt werden => Der Zeitstempel gleich mitgelöscht.

Desweitern wäre es naturlich sinnvoll jede Anfrage die einzeln geöffnet wird mit 'active=1' zu markieren. Speichert er/schließt er es/ oder drückt auf Zurück wird es wieder auf 'active=0' gesetzt.

So würde ich das zumindest machen. Bin mir aber nicht ganz sicher ob ich dein Problem wirklich vollkommen verstanden habe.
Es sind halt noch andere Sachen wichtig wie, wie viele 'Bearbeiter' wird es denn geben?
Ergänzung ()

@DerEineDa
Hm ich als angefangen habe zu schreiben war dein Beitrag noch nicht da. *tilt* ;)
 
Zuletzt bearbeitet:
Hmmm ich werd das mal rumprobieren

Wie soll ich alle 24 Stunden das überprüfen lassen?
Ich mein ich programmier ja mit PHP und wüsste nicht wie ich das umsetzen kann das automatisch geprüft wird

ein kleines leichtes programmierbeispiel wär auch nicht schlecht^^

Ein Problem hab ich nun lösen können... und zwar wenn man eine andere Seite anklicken sollte, dann werden alle geöffneten Anfragen mit active=0 zurück gesetzt:

PHP:
if(!$_GET['selectedobjects'])
{
	session_start();
	$sql_enable_problems = mysql_query("UPDATE probleme 
SET probuser=NULL,probactive='0' 
WHERE probuser='".mysql_real_escape_string($_SESSION['benutzer'])."'") 
or die(mysql_error(). " ->Abfrage <b>sql_clear_problems</b> klappt nicht.");
}

Und zwar ist das Loginmenu auf jeder Seite includiert, weil wenn man sich einloggt bei mir, dann kann man egal auf welcher seite man ist, auf das persönliche menü zu greifen

$_GET['selectedobjects'] ist der parameter im link, wenn anfragen geöffnet werden

Das heißt der fragt nun einfach ab ob die antwortseite geöffnet ist und wenn nicht dann soll der wieder active=0 setzen
 
Zuletzt bearbeitet:
Denk mal kreativ ;) Du musst nicht alle 24 Stunden kontrollieren. Eigentlich reicht es doch, wenn es kontrolliert wird, wenn sich jemand die Seite anguckt :)
 
Das erste Problem hab ich ja nun selbst gelöst (siehe #4)...

Nun fehlt noch das Problem, dass die Anfragen des Users die geöffnet sind, zurückgesetzt werden, wenn die session abläuft...

Ich glaub wenn der User sich nach absturz oder abgelaufender session neu einloggt, müssten die Anfragen von ihm mit meiner lösung auch zurück gesetzt werden weil er nachdem einloggen ja nicht auf $_GET['selectedobjects'] ist...

fehlt nur noch, dass die anfragen überprüft werden...beim öffnen der Anfragetabelle...
ich könnte also dann beim öffnen der anfragen zusätzlich neben probactive=1 den unix-timestamp eintragen und beim öffnen der anfragetabelle kann ich dann den derzeitig aktuellen timestamp mit allen eingetragenen timestamps in der datenbank überprüfen und wenn der unterschied größer als eine stunde oder so ist (kann ich ja ausrechnen wieviel höher die zahl des timestamps ist) , dann wird probactive bei diesen anfragen wieder auf 0 gesetzt
Ergänzung ()

Jo hat alles geklappt ^^

hab den timestamp aus der datenbank von dem aktuellen timestamp abgezogen und wenn der unterschied größer als 3600 (=1 Stunde = 60sek * 60min) ist, dann macht der active=0 usw.
 
Zuletzt bearbeitet:
Zurück
Oben