Lernzirkel - Forum Forum

Homepage
 
Übersicht
 
Suchen
 
Hilfe
 
Top-User
 
Login über Homepage
 
Lernzirkel - Forum / Programmieren / Php / Datensätze sperren
In diesem Thread befinden sich 2 Posts.
Hener
icon01.gif Datensätze sperren - 08.05.2008, 00:40:20

140 Posts - Hardcoreposter
GurU of tHe CoDe
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.


Hener
icon01.gif Datensätze sperren - 08.05.2008, 00:42:37

140 Posts - Hardcoreposter
GurU of tHe CoDe
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.


Forum wechseln
Forum wechseln zu:
-- pForum 1.31 OS / © Thomas Ehrhardt, 2000-2007 --