2010-03-05 26 views
1

我有多个函数,每个函数都需要在事务内部运行自己的SQL查询......我使用静态$链接来保存必须通过围绕链接功能之间...例如:

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); 
} 

这出色的作品,此刻......我可以有不同的文件中的多个函数调用,而不必绕过$链接。

的问题是现在我想在异常处理的对象做的一切,我不知道如何复制在多个对象实例相同的静态变量...

我认为这会是这样的:

class db{ 
    static $link; 

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

} 

问题是...一个函数内的静态变量保持活着的整个页面加载,而是一个对象中的静态链接只有客体的权利中存在?

pconnect是不是一种选择,要么:P凌乱的东西

所以,我怎么能解决这个得到什么?使用对象。我搜索了很长时间后没有找到任何东西,所以我有一种印象,我对其他人的做法有点不同。在我的交易中,我有各种各样的函数调用。

我有很多代码以及...大约一周60小时,所以我没有整个应用程序重新编码! :P

谢谢,我希望有人能帮助我,我希望未来有人会在这个问题上磕磕绊绊,如果回答的话!

回答

1

如果您在脚本开始时声明对象(即作为全局对象),只要脚本运行它就应该保持活动状态。这是我的基本SQL类的样子:

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); 

    } 



} 

然后在某处你的脚本,你会怎么做:

$db = new SQL_Connection; 
+0

感谢您的答复,我有一点点去......这种但没有在另一个对象内 我在一个单独的文件中创建了一个DB函数,并在那里启动了DB对象。在调用db.class.php文件并使用$ db-> query('whatever');它的罚款......但在另一个对象内部,它似乎并不认为它好像从未启动过? 尝试了几件事,但似乎无法得到相同的效果,并在另一个对象 – 2010-03-05 22:44:42

+0

内另一个对象?这可能是因为你已经在全球范围内定义了它。 试着把行放在“全球$ db;”放在对象定义的顶部。这将告诉PHP使用全球范围内的$ db。另一种方法是将两个对象结合起来,但我不确定这会有多少工作。 – Cetra 2010-03-10 02:56:43