PHP static $ link из функции db на объект db для транзакционных запросов - PullRequest
1 голос
/ 05 марта 2010

У меня есть несколько функций, каждая из которых выполняет свой собственный запрос 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 Ответ

1 голос
/ 05 марта 2010

Если вы объявляете ваш объект в начале вашего скрипта (т.е. как глобальный), он должен быть живым до тех пор, пока ваш скрипт работает. Вот как выглядит мой базовый класс 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...