[OOP + transazioni] Dubbio implementativo

Shinji89

Nuovo Utente
24 Gen 2010
2
0
0
Salve a tutti avrei un dubbio implementativo, stò aggiornando un mio script in OOP e mi sorge un problema con le transazioni. Io vorrei fare in modo che quando creo un'istanza della classe (passando l'id dell'utente) questa nel costruttore mi blocchi l'id dell'utente da eventuali richieste al DB e che nel distruttore me la sblocchi. Ecco un esempio di codice così rendo meglio l'idea:

codice PHP:
PHP:
<?php
class user
{
    private $_id;
    private $_soldi;
    public  $DB;
    
    function __construct($id, $DB)
    {
        $this->_id    = (int) $id;
        //Uso una classe esterna per manipolare il DB
        $this->DB     = $DB;
        //Blocco l'utente qui'
        $data         = $DB->row("SELECT soldi FROM user WHERE id = '".$id."' LIMIT 1");
        //Se l'utente non esiste blocco tutto ovviamente
        $this->_soldi = $data['soldi'];
    }
    
    function getSoldi()
    {
        return $this->_soldi;
    }
    
    function setSoldi($amount)
    {
        if($this->getSoldi >= $amount)
        {
            //Faccio l'update
            $update = $this->DB->update("user",array('soldi' => 'soldi -'.$amount),"id = '".$this->_id."'");
            //Se va tutto bene aggiorno
            $this->_soldi -= $amount;
        }
    }
    
    function __destructor()
    {
        //Sblocco l'utente qui
    }
}

$objUser = new User(1,$db);

echo "L'utente ha ora ".$objUser->getSoldi();

$tolgo_soldi = $objUser->setSoldi(100);

echo " ed ora dopo avergli tolto 100 sacchi ".$objUser->getSoldi();
?>

Qualche idea ?
 
Non ho capito bene quello che vuoi fare. Vuoi fare in modo che, se è esiste un'istanza dell'utente pincopallino, nessuno possa eseguire query al database che siano relative a lui, tranne la sua classe? In questo caso penso che dovresti direttamente modificare la classe che usi per manipolare i dati del database. Controlli con una regex se la query è relativa a quell'utente e, in caso, ti rifiuti di eseguirla. Però è una cosa abbastanza macchinosa... a che cosa ti serve?
 
regex ? Cosa sarebbe ?

Mi serve perchè aime mi è capitato che vi siano doppie scritture e valori negativi, nel senso che mi sono ritrovato con due decrementi di "soldi" anche se il secondo non poteva avvenire, in sostanza il motivo per cui servono le transizioni in mysql:
1 - "vedi" la risorsa (la select del mio esempio)
2 - La blocchi così nel frattempo nessuno la può usare (e quindi ad esempio decrementare)
3 - La manipoli (e quindi la decrementi se il suo valore te lo permette, come nell'esempio da me scritto)
4 - La sblocchi e permetti ad eventuali altre istanze della classe di nascere e manipolare nuovamente l'utente
Se questo non avviene cosa può succedere (e cosa mi è successo, facendomi letteralmente impazzire negli ultimi 6 mesi) che viene eseguita una query che fa andare il valore a meno zero e siccome il campo è unsigned mi ritrovavo il valore massimo rappresentabile nel campo. Se ti interessa approfondire:
http://bugs.mysql.com/bug.php?id=14543
 

Discussioni simili