2010-03-05 3 views
1

J'ai plusieurs fonctions, chacune exécutant sa propre requête SQL qui doit être dans une transaction ... J'utilise un lien $ statique pour ne pas avoir à passer liens entre les fonctions autour de ... par exemple:

function db() { 
$user = "username"; 
$pass = "password"; 
$db = "database"; 
$server = "localhost"; 
static $link; 

if(is_null($link)){ 
    $link = @mysql_connect($server, $user, $pass); 
} 

mysql_select_db($db, $link); 
return $link; 
} 

function transactionWrapper($id){ 
    $link = db(); 
    # Start transaction 
    mysql_query("SET autocommit=0",$link); 
    # Get name from other function, but keep this function within the ACID transaction by using the same link 
    $name = getName($id); 
    mysql_query("UPDATE tbl2 SET name = '{$name}' WHERE id = '2'",$link); 
    # Commit transaction 
    mysql_query("COMMIT",$link); 
} 


function getName($id){ 
    $link = db(); 
    $result = mysql_query("SELECT name FROM user WHERE id = '{$id}'",$link); 
    return mysql_result($result,0,0); 
} 

Cela fonctionne avec brio au moment ... Je peux avoir une fonction plusieurs appels dans des fichiers différents et ne pas avoir à passer autour du lien $.

Le problème est maintenant que je veux faire tout un objet pour la gestion des exceptions et je ne sais pas comment reproduire la même variable statique sur les instances d'objets multiples ...

je pensais que ce serait quelque chose comme :

class db{ 
    static $link; 

    function db(){ 
     # if link is null, create it with mysql_connect, otherwise return the link 
    } 

} 

le problème est ... une variable statique dans une fonction reste en vie pour une charge de page entière, mais le lien statique dans un objet existe uniquement dans le droit d'objet?

pconnect n'est pas une option non plus: P désordre des choses

Alors, comment puis-je contourner cela? en utilisant des objets. Je ne pouvais pas vraiment trouver quoi que ce soit après avoir cherché pendant si longtemps, alors j'ai l'impression que je fais les choses un peu différemment des autres. Dans ma transaction, j'ai des tas d'appels de fonctions pour diverses choses. J'ai aussi beaucoup de code ... environ une année de 60 heures par semaine, donc je n'avais pas une application entière en tête! : P

Merci, j'espère que quelqu'un peut m'aider et j'espère que quelqu'un d'autre trébuche sur cette question à l'avenir si on y répond!

Répondre

1

Si vous déclarez votre objet au début de votre script (c'est-à-dire global), il doit être actif tant que votre script s'exécute. C'est ce que ma classe SQL de base ressemble à:

class SQL_Connection { 

    var $connection; 


    function __construct() { 

     $this->connection = mysql_pconnect(DB_SERVER, DB_USER, DB_PASS) or die(mysql_error()); 

     mysql_select_db(DB_TABLE, $this->connection) or die(mysql_error()); 

    } 

    function query($query){ 

     return mysql_query($query, $this->connection); 

    } 



} 

Ensuite, quelque part vous script que vous feriez:

$db = new SQL_Connection; 
+0

Merci pour la réponse, je l'ai eu un peu aller ... ce genre de travaillé mais pas dans un autre objet J'ai créé une fonction DB dans un fichier séparé et initialisé l'objet DB à l'intérieur. Lors de l'appel du fichier db.class.php et de l'utilisation de $ db-> query ('whatever'); son amende ... mais à l'intérieur d'un autre objet, il ne semble pas le reconnaître comme s'il n'avait jamais été initié? J'ai essayé quelques choses mais je n'arrive pas à obtenir le même effet et dans l'autre objet –

+0

A l'intérieur d'un autre objet? C'est peut-être parce que vous l'avez défini dans une portée globale. Essayez de mettre dans la ligne "global $ db;" en haut de la définition de l'objet. Cela indiquera à php d'utiliser le $ db de la portée globale. L'autre façon que vous pourriez faire est de combiner les deux objets, je ne suis pas sûr combien de travail ce serait cependant. – Cetra