2012-02-28 12 views
1

PHPデータベース接続に疑問があります。私は大きなtry/catch/finallyブロックを自分のメソッド(Javaスタイル)に置くことができないので、サイズ/ロジックが増加する傾向にあるときに、すべての接続を完全に閉じてプリペアドステートメントを実行する最良の方法は何ですか?次の方法を考えると、すべてが正しく行われていますか?PHPでのデータベース接続を正しく終了する

あなたはまだPHPでキャッチ/試す使用することができます
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

@yi_H:優れた点。私の回答では、シングルトン/工場パターンを使って接続をリサイクルする機能について述べました。 –

答えて

0

:これは、特定の1つのタスクのための接続を確立するためにうまく機能していますが、その複数のタスクに同じ接続を共有するために何をしたい場合は

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

同じスキーマへのアクセスも必要ですか?データベース接続の作成とアクセスにシングルトン/ファクトリパターンを使用して、より高度なソリューションを検討することができます。私はそのようなexampleを別の質問の解決策として掲示しました。それはもう少し進んでいますが、あなたの周りに頭を浮かべると、よりパフォーマンスが向上します。

+0

私の$声明はどこで正しく終了しますか? – Rui

+0

@Rui:更新された投稿。 –

+0

@ Rui:何をやったの? –

関連する問題