【问题标题】:PHP static $link from db function to db object for transactional queries从 db 函数到 db 对象的 PHP 静态 $link 用于事务查询
【发布时间】:2011-01-23 22:28:21
【问题描述】:

我有多个函数,每个函数都运行自己的 SQL 查询,这些查询需要在事务中...我正在使用静态 $link 来避免在函数之间传递链接...例如:

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

目前这非常有效......我可以在不同的文件中调用多个函数,而不必传递 $link。

现在的问题是我想在一个对象中做所有事情以进行异常处理,但我不知道如何在多个对象实例上复制相同的静态变量...

我以为会是这样的:

class db{
    static $link;

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

}

问题是......函数中的静态变量在整个页面加载时保持活动状态,但对象内的静态链接只存在于对象内,对吗?

pconnect 也不是一个选项:P 乱七八糟的东西

那么我该如何解决呢?使用对象。在谷歌上搜索了这么久之后我真的找不到任何东西,所以我觉得我做的事情与其他人有点不同。在我的事务中,我有大量的函数调用来处理各种事情。

我也有很多代码......大约一年每周工作 60 小时,所以我没有考虑重新编码整个应用程序! :P

谢谢,我希望有人可以帮助我,如果有人回答,我希望将来有人偶然发现这个问题!

【问题讨论】:

    标签: php mysql oop static hyperlink


    【解决方案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;
    

    【讨论】:

    • 感谢您的回复,我已经尝试了...这种工作但不在另一个对象中我已经在单独的文件中创建了一个 DB 函数并在那里启动了 DB 对象.调用 db.class.php 文件并使用 $db->query('whatever');很好……但是在另一个对象内部,它似乎无法识别它,就好像它从未启动过一样?尝试了一些东西,但似乎无法在另一个对象中获得相同的效果
    • 在另一个对象内?这可能是因为您已经在全局范围内定义了它。尝试放入“global $db;”行在对象定义的顶部。这将告诉 php 在全局范围内使用 $db。您可以这样做的另一种方法是将两个对象组合在一起,但我不确定这会做多少工作。
    猜你喜欢
    • 2020-08-03
    • 2010-12-16
    • 2016-01-31
    • 2018-08-04
    • 1970-01-01
    • 2015-05-02
    • 2017-06-30
    • 2019-01-20
    • 2019-01-25
    相关资源
    最近更新 更多