2009-05-15 3 views
2

私はmysqlデータベースへのアクセスを容易にするための簡単なPHPクラスを書いています。クラスは正常に動作し、接続を開き、クエリを実行して接続を閉じるquery()メソッドを持っています(スクリプト終了後に接続がPHP自体で終了するはずですが、気に入らないそれに非常に頼っている)。このPHPクラスはmysqlデータベースアクセス用に最適化されていますか?

パフォーマンスの観点からは、クエリを実行するたびに常にデータベースへの接続を開くことは非常に良い方法ではないことがあります。また、入力をフィルタするためにmysql_real_escape_string()を使用しようとすると、アクティブなデータベース接続がないため、作業しません)。しかし、私はこれについてもっと明確にしたいと思います。それは非常に間違っていますか?どうして?そして、私はまた、これに対する良い選択肢について知りたいと思います。ここで

クラスです:

class DB { 

private $conn; 

//database data 
private $dbhost; 
private $dbname; 
private $dbuser; 
private $dbpass; 

/** 
* Constructor 
* @dbhost string the database host 
* @dbname string the database name 
* @dbuser string the database username 
* @dbpass string the database password 
*/ 
public function __construct ($dbhost, $dbname, $dbuser, $dbpass) 
{ 
    $this->dbhost = $dbhost; 
    $this->dbname = $dbname; 
    $this->dbuser = $dbuser; 
    $this->dbpass = $dbpass; 
} 

/** 
* Connects to mysql database 
*/ 
private function open() 
{ 
    $this->conn = mysql_connect ($this->dbhost, $this->dbuser, $this->dbpass) 
    or die ("Error connecting to database"); 

    mysql_select_db ($this->dbname) or die ("Error selecting database"); 
} 

/** 
* Closes the connection to a database 
*/ 
private function close() 
{ 
    mysql_close($this->conn); 
} 

/** 
* Executes a given query string 
* @param string $query the query to execute 
* @return mixed the result object on success, False otherwise 
*/ 
public function query ($query) 
{ 
    $this->open(); 
    $result = mysql_query($query, $this->conn) 
    or die ("Error executing query ".$query." ".mysql_error()); 

    $this->close(); 
    return $result; 

} 

}

+2

なぜこのクラスが最初に必要なのでしょうか?標準機能に何も追加していないようです。そしてもしあれば、あなたはmysql_ *関数ではなく、PDOかmysqliを使うべきです。 –

+2

また、「それは非常に間違っていますか?」それがmysql_real_escape_string()を使用していないことを参照している場合は、非常に間違っています。しかし、やはりmysqliやPDOでパラメータ化されたクエリがはるかに良い解決策になるでしょう。 –

+0

いいえ、それはmysql_real_escape_string()の使用ではありませんでした。私はDBに問い合わせるたびに接続を開くことでした。クラス自体は、関数呼び出しとエラー処理を繰り返すことでコードを汚染するのではなく、機能的なものを追加するのではなく、データベースの抽象レイヤーを追加します。 – rogeriopvl

答えて

13

(私は接続はスクリプトが終了した後、PHP自体が閉じるようになっていることを知っているが、私は非常に頼るのは好きではありませんその上に)。

なぜですか?これは言語の特徴です。それを信頼しない理由はありません。多くのウェブサイトでは、PHPを大量に使い果たしています。もちろん、プログラマとして、私たちは自分でそれを閉じたいと思っています。それはいいです。しかし、すべてのクエリのデータベース接続を開いたり閉じたりするのは、恐ろしいアイデアです。より良い方法は、コンストラクタからopen()を呼び出して、close()の名前を__destruct()に変更することです。ドキュメントによると、__destructは、特定のオブジェクトへのすべての参照が削除されるか、オブジェクトが明示的に破棄されるか、またはシャットダウンシーケンスの任意の順序で呼び出されるとすぐに呼び出されます。データベース接続の終了コードを隠すのに理想的です。

+5

さらに詳しく説明すると、データベース接続をオープンするのはかなりコストがかかる作業です。いくつかのDBMSでは、簡単なクエリのために、接続を開くとクエリを行うよりも多くのリソースを取ることができます。 また、トランザクション、一時テーブル、接続ごとの変数など、接続中に存続するものはすべて完全に破棄します。 すべてのクエリを再接続するのは本当に醜いので、それを実行する正当な理由はありません。 –

+0

__destruct()メソッドはPHP5 +でのみ動作することに注意してください。 PHP4ではコードは実行されますが、__destructは自動的に呼び出されません。データベースはもちろん、スクリプトの最後に閉じられます。 – DisgruntledGoat

関連する問題