Правильно закрывать соединения с базой данных в PHP - PullRequest
1 голос
/ 28 февраля 2012

У меня возникают некоторые сомнения в соединениях с базой данных PHP.Поскольку я не могу просто поместить большой блок try / catch / finally в мой метод (стиль Java), каков наилучший подход для правильного закрытия всех соединений и подготовленных операторов, когда размер / логика имеет тенденцию к увеличению?Учитывая следующий метод, все ли сделано правильно?

public function createRegister($register) {
        $this->openConnection();

        $query = "INSERT INTO register (username, password, email, confirmationToken) VALUES (?, ?, ?, ?)";
        $result = $this->mysqli->query($query);

        if ($statement = $this->mysqli->prepare($query)) {  
            $statement->bind_param("ssss", $register->username, $register->passwordHash, $register->email, $register->confirmationToken);

            if (!$statement->execute()) {
                $this->closeConnection();
                throw new DAOException("Failed to execute statement: " . $statement->error);
            }

            $statement->close();

        } else {
            $this->closeConnection();
            throw new DAOException("Failed to prepare statement: " . $this->mysqli->error);
        }

        $this->closeConnection();
    }

1 Ответ

0 голосов
/ 28 февраля 2012

Вы все еще можете использовать try / catch в PHP:

public function createRegister($register) {

    $this->openConnection();

    $query = "INSERT INTO register (username, password, email, confirmationToken) VALUES (?, ?, ?, ?)";

    try {

        // This line is not needed
        // $result = $this->mysqli->query($query);

        if ($statement = $this->mysqli->prepare($query)) {

            $statement->bind_param("ssss", $register->username, $register->passwordHash, $register->email, $register->confirmationToken);

            if (!$statement->execute()) {                   
                throw new DAOException("Failed to execute statement: " . $statement->error);
            }

            $statement->close();

        } else {
            throw new DAOException("Failed to prepare statement: " . $this->mysqli->error);
        }
    } catch (Exception $e) {

        if ((isset($statement)) && (is_callable(array($statement, 'close')))) {
            $statment->close();
        }

        $this->closeConnection();

        throw $e;
    }

    $this->closeConnection();
}

Это хорошо работает для установления соединения для одной конкретной задачи, но что если вы хотите использовать одно и то же соединение для нескольких задач, которым также нужен доступ к одной и той же схеме? Возможно, вы захотите рассмотреть более продвинутое решение, использующее шаблон singleton / factory для создания и доступа к соединениям с базой данных. Я опубликовал такой пример в качестве решения другого вопроса. Он немного более продвинутый, но как только вы обдумаете это, он станет более производительным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...