Lernzirkel - Forum / Php / Datensätze sperrenLernzirkel - Forum - Datensätze sperren
In diesem Thread befinden sich 2 Posts.
Datensätze sperren 08.05.2008, 00:40Hener
Hi,

gleich vorweg, das DB-layout ist nicht dabei, sollte Interesse bestehen, wie es genau funzt.. FRAGEN.

Erklärung:
- Wenn man es leid ist, das 2 oder mehr Benutzer ein und den selben Datensatz bearbeiten, dann kann man mit dieser CLASS
Abhilfe schaffen.
- Die Laufzeit des Scripts ist minimal.
- Timeline-sperre
- Absolute Konsistenz der DB geährleistet

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
<?php

/**
 *
 * @desc block inserts in DB, there is take a record on other user
 * @version $Id$
 * @copyright 2008 by raiser
 */

/**
 *
 *
 */
class Lock{
    
/**
    * Tabellenname welcher den zu lockenden Datensatz enthält
    * @var string
    * @access public
    * */
    
var $tabelle;

    
/**
    * Schlüssel, die für die zu lockende Tabelle gelten
    * @var array
    * @access public
    * */
    
var $datensatz;

    var 
$lock=NULL;

    var 
$dbo;

    var 
$error=NULL;

    var 
$idmitarbeiter;

    var 
$locktime=NULL;

    
/**
     * Constructor
     * @access protected
     * @param object $dbres Datenbankobjekt
     * @param string $tabelle   Optional Tabellenname zum locken
     * @param array  $datensatz Array der Schlüssel
     */
    
function Lock($dbres,$tabelle=NULL,$datensatz=NULL){
        
$this->dbo $dbres;
        if(
$datensatz !== NULL && $tabelle == ''){
            
$this->error 'Lock::Lock(), Parameter $tabelle darf nicht leer sein. ';
        }

        elseif(
$datensatz !== NULL && !is_array($datensatz)){
            
$this->error 'Lock::Lock(), Parameter $datensatz muss ein Array sein.';
        }
        else{
            
$this->tabelle $tabelle;
            
$this->datensatz serialize($datensatz);
        }
        if(
$tabelle !== NULL && $tabelle != ''){
            
$this->tabelle $tabelle;
        }

        if(
$this->error !== NULL){
            echo 
$this->error;
        }
    }

    function 
checkLock($datensatz=NULL,$tabelle=NULL){
        if(
$datensatz !== NULL && !is_array($datensatz)){
            
$this->error 'Lock::checkLock(), Parameter $datensatz muss ein Array sein.';
        }
        else{
            
$this->datensatz serialize($datensatz);
        }

        if(
$tabelle !== NULL && $tabelle != ''){
            
$this->tabelle $tabelle;
        }
        else{
            
$this->error 'Lock:checkLock(), Parameter $tabelle darf nicht leer sein.';
        }
        if(
$datensatz === NULL && $tabelle === NULL && $this->lock !== NULL){
            return 
$this->lock;
        }
        
$res =& $this->dbo->getRow('SELECT * FROM locks WHERE tabelle = ? AND
                         datensatz = ?'
,array($this->tabelle,$this->datensatz),
                         
DB_FETCHMODE_ASSOC);
        if(
$res['uin']!= session_id() && $res['zeit']+ LOCKTIME time()){
            
$this->idmitarbeiter $res['idmitarbeiter'];
            
$this->locktime $res['zeit'] + LOCKTIME;
            return  
$this->lock true;
        }
        else{
            if(
count($res) > && $res['zeit']+ LOCKTIME time()){
                 
$this->unsetLock();
            }
            else{
                if(!empty(
$res['zeit']))
                    
$this->locktime $res['zeit'] + LOCKTIME;
            }
            return 
$this->lock false;
        }
    }

    function 
unsetLock($datensatz=NULL,$tabelle=NULL){

        
$res =& $this->dbo->query('DELETE FROM locks WHERE tabelle = ? AND datensatz = ?',
                    array(
$this->tabelle,$this->datensatz));
        
$this->locktime=NULL;
    }

    function 
setLock($id){
        if(
$this->lock === NULL){
            exit(
'<p>Lock::setLock(), unerlaubter Zugriff</p>');
        }
        if(
$this->lock === false && $this->lock !== NULL){
            
$this->dbo->query('INSERT INTO locks SET tabelle = ? , datensatz = ? ,
                            uin = ? , zeit = ? , idmitarbeiter = ?'
,
                            array(
$this->tabelle,$this->datensatz,
                            
session_id(),time(),$id));
            if(
$this->locktime === NULL){
                   
$this->locktime time() + LOCKTIME;
            }
        }
    }

    function 
checkLockWrite($datensatz,$tabelle=NULL){

        if(!
is_array($datensatz)){
            
$this->error 'Lock::checkLockWrite(), Parameter $datensatz muss ein Array sein.';
            return 
true;
        }

        if(
$tabelle !== NULL && $tabelle == ''){
            
$this->error 'Lock::checkLochWrite(), Parameter $tabelle darf nicht leer sein.';
            return 
true;
        }
        else{
            if(
$tabelle !== NULL){
                
$this->tabelle $tabelle;
            }
        }
        
$this->datensatz serialize($datensatz);
        
$res =& $this->dbo->getRow('SELECT * FROM locks WHERE tabelle = ? AND
                    datensatz = ?'
,array($this->tabelle,$this->datensatz),
                    
DB_FETCHMODE_ASSOC);
        if(
$res['uin'] != session_id()){
            
$this->idmitarbeiter $res['idmitarbeiter'];
            
$this->locktime $res['zeit'] + LOCKTIME;
            return 
true;
        }
        elseif(
$res['zeit']+ LOCKTIME time()){
            return 
false;
            
//echo $res['zeit']+ LOCKTIME,'nicht schreiben, stamp ';
        
}
        else{
            
//unsetLock($tabelle,$datensatz);
            
return false;
        }
    }
}
?>


Bei Fragen.. einfach mal melden..


Greez Hener
Lieber einen Stehen und nicht sitzen können,
als einen Sitzen und nicht stehen können.


Datensätze sperren 08.05.2008, 00:42Hener
Ich mal selber
ein JOIN-block ist dieser Version nicht möglich.
- Ansatz.. Tabellen als Array ablegen und die Datensaätze per array(array('ds'),array('ds')) übergeben
So könnte es funktionieren.
Lieber einen Stehen und nicht sitzen können,
als einen Sitzen und nicht stehen können.


-- pForum 1.31 OS / © Thomas Ehrhardt, 2000-2007 --
http://gamingdivision.de/pforum