2011-01-17 11 views
2

私は現在行っていることが最適ではないと確信しています、しかし私は本当にあなたがどのようにWebアプリケーション接続文字列。現時点でdbクエリを処理する最善の方法は何ですか

は、私は各クラスのファイルを持っているclassesディレクトリを持っていると私は、接続文字列を持っており、dbディレクトリ上の他のファイルがclassesディレクトリに似ていますconn.phpが含まdbと呼ばれる別のディレクトリを持っています各クラスに1つ、mysqlクエリを処理するためのものです。

だから、基本的に私は1つのファイルにクラスごとにすべてのDBクエリを持っていると私はクラスファイルから何かを照会する必要がある時はいつでも、私は、対応するDBファイル内の各DBファイルを含める

デシベルファイルに関数を呼び出しますたとえば、user.class.phpファイルには、include('db/user.db.php')があります。

また、各dbファイルにはconn.phpファイルが含まれています。

user.class.php

include('db/user.db.php'); 
class User { 
    public $fname; 
    public $userid; 

    function __construct($userid) { 
     $this->user_id = $userid; 
     $this->fname = DB_GetFirstName($userid); 
     } 
} 

user.db.php

include('conn.php'); 
function DB_GetFirstName($userid) { 
    $result = mysql_fetch_array(mysql_query("SELECT USR_FName FROM users WHERE USR_ID = '$userid'")); 
    return $result[0]; 
} 

conn.php

$conn = mysql_connect("localhost", "user", "pass"); 
mysql_select_db("dbname", $conn); 

それをどのように扱うのですか?

+0

音で(Zend Frameworkの例に)TDGSへの良好な導入はあり大丈夫です。ドメインクラスからDbアクセスを分離しています。あなたはそれをどのようにまとめますか? UserクラスとUserDbクラスからいくつかのスニペットを表示できますか? – Gordon

+0

スニペットを追加しましたが、あまりにもエレガントに見えません。私はまた、クエリごとにdbへの接続を開く必要があると言われましたが、それはなぜですか? –

答えて

1

ドメインレイヤーをデータベースアクセスレイヤーから分離することで、適切なことを実行しています。しかし、あなたが一緒にそれを置く方法は改善することができます。 Table Data Gateway(TDG)のパターンを見てください。

テーブルデータゲートウェイパターンでは、1つのクラスが特定のテーブルへのすべてのアクセスをカプセル化します。これはあなたのUser.Db.phpのようなもので、TDGが実際のクラスであるという違いがあります。一連の関数の代わりに、関連するdbアクセスをその特定のクラスにグループ化します。これは、関数呼び出しをハードコーディングするのではなく、必要なクラスにインスタンスを渡すことができるというすぐれた利点があります。

特定のテーブルで作業する必要がある場合は、TDGを使用してTDGを使用して行をフェッチ/修正します。返されたレコードセットを処理することもできます。または、DataMapperを使用して、レコードセットのデータをドメインクラスにマップします。あなたのUserクラス単純なDataMappersのために、あなた自身の工芸品は大丈夫です。より複雑になると、既存のORMを使用する方がよいでしょう。

TDGの代替品はRow Data Gateway patternです。

と行データゲートウェイの

3

Database Abstraction Layerを使用してください。あなたが入力を検証し、注入攻撃を阻止している限り、あなたがしたことは、生のSQLラインよりも優れたアプローチのように思えます。

Doctrine2 have built-in database abstraction layersのような一般的なPHPフレームワークは、公に評価され、多くのことをカバーしている可能性があります。

あなた自身で作成する前に、すでに述べたようなオープンソースレイヤーを使用することをお勧めします。車輪を再発明しないでください。欠点がある場合は、プロジェクトの改善を考えてください。私が使用する小規模なプロジェクトは非常に単純なPHPクラスに大きい使用するhttp://code.google.com/p/edb-php-class/

$result = $db->q("select * from `users`limit 3"); 

foreach($result as $a){ 
     echo $a['name'].' '.$a['surname'].' '.$a['email'].' '.$a['country'].'</br>'; 
} 

データベース抽象化レイヤの

+0

私が行うプロジェクトが多くなればなるほど、データベース抽象化レイヤーは(ほとんどの場合)意味がないという結論に至ります。確かに、すべての既存のdbベンダー拡張を学習する上で唯一のAPIを学ばなければならないのは便利です。しかし、もう一度、彼らはどちらかを理解することが難しくなく、しばしばより大きな柔軟性を提供します。そして、私は実際のdbを変更する必要がなかったので、引数はカウントされません。 – Gordon

+0

私は最近データベースを変更しなければなりませんでした(オラクルはMySQLを買収し、再配布ライセンスの条件を変更しました)、私がpostgresに移ったときにDBALが本当に私を助けました。 DBALは複雑さを増すことがあり、トレーニングホイールを使用しているような感じです。しかし、特にセキュリティ、フレキシビリティ、DRYを考慮した場合、彼らはあなたのコストよりもあなたを救う気持ちが私だけではありません。 – Incognito

+1

私はそれがあなたが必要とするdbベンダーの特定のコード機能のどれくらいかによって決まると思います。 1つのプロジェクトでは、特定のSQLをあまりにも多くのoracle特定のSQLをクエリに入れなければならなかったので、DALを選択するのは基本的に意味がありませんでした。そして彼らは免許証のために金銭的なお金を払っていたので、すぐには変わることはありませんでした。このプロジェクトでは、DBへのアクセスを少し遅くし、ほとんど利点が得られませんでした。 OCI拡張を直接使用する必要があります。 – Gordon

関連する問題