phpbar.de logo

Mailinglisten-Archive

[php] PHP/MySQL: Bearbeitung eines Datensatzes durch Dritte verhindern

[php] PHP/MySQL: Bearbeitung eines Datensatzes durch Dritte verhindern

Michael Renner michael.renner_(at)_tuebingen.mpg.de
Fri, 16 Jul 1999 11:34:34 +0200


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