2012-02-13 34 views
0

PHPとMySQLでデータベース接続に関する質問があります。データベース接続を開いたままにして、クラスを使用して開き、コンストラクタで接続を定義してから、デストラクタで接続をもう一度閉じることができるのだろうかと思います。コンストラクタ経由でデータベースに接続し、デストラクタ経由で閉じる?

私は現在、 "html"クラスのクラスを持っていますが、私はレイアウトなどのためにこれを使って自分のウェブサイトを持っています。以前に提案したようにすれば、(後で)問題やセキュリティ上のリスクなどが発生する可能性はありますか?

よろしく、そのことについて

+1

デストラクタを閉じる必要はありません。 PHPの実行が終了すると、MySQL接続はデフォルトで閉じられます。 (複数のデータベースに接続するなどのように)接続を早めに閉じる必要がある場合を除いて、私は心配しません。正直です。 –

+0

ああ、私はこれを知らなかった。 Bradに感謝します。 –

答えて

1

コンストラクタ内で接続を開き、しばしばクラスのプロパティに接続リソースを格納することは珍しくありません。

コンストラクタでデータベース接続を明示的に閉じることはできますが、PHPがスクリプトによって不要になったときにPHPが暗黙的に接続を閉じるため、通常はそうする必要はありません。

class db { 
    public $connection; 

    public function __construct($params...) { 
    $this->connection = mysql_connect(...); 
    if (!$this->connection) { 
     // throw an exception or set an error status... 
    } 
    } 
} 
-1

わからないが、私はあなたが、関数のparam内部のSQL接続を送ることができます知っています。

0

これは可能ですが、それでも永続的な接続を使用することをおすすめします。このようなオブジェクトにシングルトンパターンを適用して、誤って使用される可能性が低いようにすることを検討することもできます。また、接続リソースを保持するメンバー変数を静的にすることも検討してください。

Michaelが述べたように、スクリプトが終了すると、オブジェクトは消えますが、デストラクタを使用する利点は、特別な理由でスクリプトが終了する前に呼び出すことです。

実際の使用状況によっては、レイアウト関連のクラスをデータベース関連のクラスから分離することをおすすめします。

+0

それらを分ける特定の理由はありますか?これを行う私の考えは、私のウェブサイトのレイアウトが私の "htmlclass" __constructorによってあらかじめ定義されているということでした。したがって、私のウェブサイト上でデザインを使ってページを開くと、データベース接続がそこにあり、私がしなければならないことは、私の接続について考える必要がなく、私のクエリを実行することだけでした。 –

+0

これは、懸念の分離、またはより一般的にはカプセル化と呼ばれています。レイアウトオブジェクトは、ページ要素のレンダリングに関係します。データベースオブジェクトはデータベーストランザクションに関係します。解決策は、 "htmlclass" __constructorにデータベースクラスのインスタンスを内部的に作成または使用させることです。だから彼らは別々のままですが、一方はもう一方を使います。 – Matt

+0

MySqlデータベースへの永続的な接続?そのアドバイスを考え直したいと思うかもしれません。特にトランザクションやテーブルロックを使用する場合 – Cerad

関連する問題