Mailinglisten-Archive |
Marian Steinbach wrote: > > Danke! > > Das sieht ja so aus, als ginge das nur für die ganze Tabelle.... > schade. Heißt das, das jemand, der sich einen Datensatz zur > Bearbeitung in den Browser zieht, die gesamte Tabelle auf beliebige > Zeit blockieren kann? Es könnte ja sein, daß er/sie mal einen Kaffe > trinken geht. Moin moin, ich habe mal etwas gebastelt, das nur den Datensatz lockt. Dies f"ur 10 Minuten, oder bis der Besitzer die Daten zur"ckgeschrieben hat. Leider ist es nicht sehr strukturiert, ich muss mal suchen ... Oh, ist doch etwas umfangreicher. Ich bringe es trotzdem mal in der Liste, vielleicht kann es noch jemand brauchen: Gelockt wird in eine extra Spalte der Tabelle mit Benutzername und der mktime. Der Eintrag sieht aus wie folgt: renner.931421839 Getrennt wird mit einem Punkt! Bei jedem Auslesen des Datensatzes wird getestet, ob der Datensatz gelockt ist: $Lockzeitpunkt = mktime(); $VPtmp_lock = mysql_result($result,0,"tmp_lock") $tmp_lock = veryfiy_lock($VPtmp_lock,$user); Verwendet wird eine Funktion: /****************************************************************************** Function : veryfiy_lock Arguments : $VPtmp_lock und $user Description: pr"uft, ob zu einem Datensatz ein g"ultiger Lockeintrag existiert Returns : $tmp_lock{$user $mktime lock] *******************************************************************************/ function veryfiy_lock ($VPtmp_lock,$user) { $max_lock = 600; # Erst mal sehen ob da was drin steht # IF ($VPtmp_lock != "") { # Gut, wir haben diesen Eintrag. Diesen jetzt nach "." durchsuchen $tok = strtok($VPtmp_lock,"."); $p=0; WHILE ($tok) { $tmp_lock[$p]= $tok; #PRINT $tmp_lock[$p]; $tok = strtok("|"); $p+=1; }; # In $tmp_lock[1] steckt die mktime des Eintrages # Mit der aktuellen Zeit vergleichen $tmp_lock[2] = "false"; IF ((( mktime() - $max_lock) <= $tmp_lock[1]) AND $tmp_lock[0] != $user) $tmp_lock[2] = "true"; IF (( mktime() - $max_lock) > $tmp_lock[1]) $tmp_lock[2] = "false"; # }; # PRINT "ist $tmp_lock[2]"; return array("$tmp_lock[0]","$tmp_lock[1]","$tmp_lock[2]"); } Hier endet die Funktion # Jetzt den Eintrag locken, falls er nicht schon gelockt ist: IF ($tmp_lock[2] == "false") $lock_query = "UPDATE stammdaten SET tmp_lock = \"$user.$Lockzeitpunkt\" WHERE ID = \"$VPID\""; MYSQL_QUERY($lock_query); In Worten: Ist der Datensatz von mir selbst gelockt ist eh alles egal, ist er von jemand anderem gelockt kommt es drauf an ob die 10 Minuten (600s) schon vorbei sind. Wenn ja wird der Eintrag "uberschreiben, wenn nicht werden die Daten zwar ausgelesen, aber nur zum lesen angezeigt, d.h. es wird gar kein 'submit'-Button erzeugt: IF ($tmp_lock[2] == "true") $Nintention = "1"; IF ($Nintention < 3): PRINT "<td align=left> <input type=reset value=\"Cancel\"> </td>"; IF ($tmp_lock[2] == "true" ) { PRINT "<td align=center><FONT COLOR=red>locked by $tmp_lock[0]</td>"; }; PRINT "<td align=right> <input type=reset value=\"Cancel\"> </td>"; ENDIF; Soviel zum Auslesen der Daten. Das Zur"cukschreiben ist auch tricky: # Als erstes muss getestet werden, ob dieser DB-Eintrag # noch von uns gelockt ist! Wenn nicht: Fehler und raus! $lock_controll = "SELECT tmp_lock FROM stammdaten WHERE ID = \"$ID\""; $lock_fact = MYSQL_QUERY($lock_controll); $VPtmp_lock = mysql_result($lock_fact,0,"tmp_lock"); $tmp_lock = veryfiy_lock($VPtmp_lock,$user); IF ($tmp_lock[0] != $user) { # Die Daten sind gesperrt! Also lieber abwarten PRINT "<table ALIGN=\"center\" WIDTH=\"90%\">"; PRINT "<td ALIGN=\"center\"><font color=red <FONT SIZE=\"+5\">locked by $tmp_lock[0]"; PRINT "</td></table>"; exit(); }; # Wenn wir bis hierher kommen m"ussen wir die Daten locken! $lock_string = "UPDATE stammdaten SET tmp_lock = \"$user.0\" WHERE ID = \"$ID\""; MYSQL_QUERY($lock_string); # Da pfuscht uns keiner mehr rein! Auf die '.0' bin ich besonders stolz, denn jetzt k"onnen andere wieder lesen. Das '$user.' war auch 'ne tolle Sache, deren Beduetung ich aber leider vergessen habe. Ich hoffe Du steigst durch meinen verworrenen Code durch. Wenn nicht: Mail an mich direkt! Gruss -- +---------------------------------------------------------+ |Michael Renner | | |MPI fuer biologische Kybernetik |Phone: +49-7071-601-638| |Spemannstr.38, D-72076 Tuebingen |FAX: +49-7071-601-616| |michael.renner_(at)_tuebingen.mpg.de | | +---------------------------------------------------ESC:wq+
php::bar PHP Wiki - Listenarchive