8

PHPからMySQLデータベースにアクセスする場合、いくつかの方法があるようです。

Sprinkle the code with raw SQL-statements
Use the VO-pattern from Java (e.g. DB_DataObjects from PEAR)
DIY and write a script that auto-generates one PHP class per database 

これとは別に、私も読んだことLINQ in .NETがありますが、他にPHP.

どのようなパターンがありますか?

今日、ゼロからWebサイトを構築し始めた場合、どれを選びますか?

明確化:これはDB抽象化レイヤー(PDO、MDB2)に関するものではありません。ここで説明するパターンは、PDOまたはMDB2に基づいて構築したものです。

4

14 に答える 14

6

あなたが探しているのは、オブジェクトリレーショナルモデル(ORM)です。そこにいくつかの異なるものがあります:

ORMがプロジェクトに対して多すぎる場合は、PDOなどの汎用DBインターフェイスにフォールバックし、プリペアドステートメントを手動で作成します。

于 2008-09-16T14:10:47.107 に答える
5

PEARからMDB2データベース抽象化レイヤーを選択します。これは、データベースを処理するための優れた抽象化メソッドを提供します。多くの変更を必要とせずに別のデータベースサーバーに移植できるポータブルコードを記述できるため、これをお勧めします(基本的なスクリプトの場合、接続呼び出しを変更するだけで十分です)。これは、古いDBとMetabaseの抽象化レイヤーをマージしたものです(DBは引き続きバグ修正でサポートされていますが、MDB2に取って代わられています)。

これは、適切にサポートされていないDBのエミュレーションの準備と実行などの機能を提供し、SQLインジェクションの問題を回避するための良い方法であるプレースホルダーを使用できるようにします。

mysql / mysqli、pgsql(PostgreSQL)、oci8(Oracle)、sqllite、msql、mssql(Microsoft SQL Server)、sybase、informix、fbsql、ibase、odbcで動作します。

MDB2のドキュメントを見て、どのように機能するかを確認してください。

于 2008-09-16T10:49:40.350 に答える
2

他にどのようなパターンがありますか?

ActiveRecord-この例はCakePHPで見ることができます。

ニーズに大きく依存すると思います。小さなアプリケーションを構築する場合は、DIYデータベースレイヤーを構築する方がおそらく速いでしょう。

たくさんのテーブルとリレーションシップを持つ大きなアプリケーションを構築している場合、CakePHPのActiveRecord機能のようなものを使用する方がおそらく速くて簡単でしょう。

PEARの抽象化レイヤーはまだ使用していませんが、見た目も良さそうです。Zendには、 Zendフレームワークにデータベースライブラリもあります。

于 2008-09-16T10:43:19.070 に答える
2

それは間違いなく、作成している Web アプリの規模によって異なります。Doctrineに賛成です(適切に使用されている場合)。それが非常に小さなクイックアンドダーティプロジェクトである場合、おそらくPDOを使用するだけで済むでしょう。

于 2008-09-16T20:48:42.250 に答える
1

"場合によります"

私自身のプロジェクトでは、抽象化レイヤーを含むある種のフレームワークを使用する傾向があります。フレームワークに適さない小さなプロジェクトの場合は、SQLをスクリプトに正しく配置します(小さいため)。前回、フレームワークを使用せずにかなりの規模のアプリケーションを作成したときは、プリペアドステートメントのサポートなどのためにPDOを使用しました。これは非常に習得しやすい抽象化レイヤーです。何らかの理由でフレームワークを使用しないことを選択した場合は、おそらくもう一度使用します。

于 2008-09-16T10:41:52.910 に答える
1

これとは別に、.NETのLINQについても読んだことがありますが、PHPで実装されているのを見たことがありません。

言語に必要な構造がないため、LinqのようなものはまだPHPで実装できません。一種の「偽のlinq」が作成されましたが、これは文字列を使用するだけで、「本物の」linqではありません。そして、たとえそうであったとしても、それは事実上、オブジェクトに対するLinqと同等であり、SQLに対するLinqのようなものはありません。

于 2008-09-16T10:47:21.557 に答える
1

オブジェクト指向のアプローチが必要な場合は、最近の私のアプローチを次に示します。

私は物事を2つのクラスに分けます。

まず、DatabaseTableクラス-テーブル名、つまりそのテーブルのキーである文字列を受け取ります。次に、DatabaseTableの行を表すDatabaseObjectクラスを作成します。DatabaseObjectには、setFromRowとgetAsRowの2つのルーチンがあります。SetFromRowは、col => valueペアの連想配列からオブジェクトをセットアップし、get as rowは、基本的にオブジェクトをcol=>valueペアとしてシリアル化します。

テーブルでselectメソッドが呼び出されると、DatabaseTableはsetFromRowを使用してDatabaseObjectsを製造します。逆に、データを更新するかテーブルに挿入するように指示されると、DatabsaeTableはgetAsRowを使用してDatabaseObjectをシリアル化します。

通常、発生するのは、独自の特定のオブジェクトのDatabaseObjectから継承し、setFromRowとgetAsRowを定義し、DatabaseTableにインスタンス化するDatabaseObjectの名前が通知されます。

だからあなたが書くことになったのは、コードに関してはこのようなものです

$dbTable = new DatabaseTable('tableName', 'uniqueid', 'InstanceType')
// dbTable manufactures an InstanceType for our use based on the select below
$dbRow = $dbTable->selectUsingId(15); 
print_r($dbRow);  // Dumps the InstanceTypeObject

これにより、アプリケーション内のデータの表現(DatabaseObject)がデータベーステーブルの管理(DatabaseTable)から分離されます。したがって、私のDatabaseObjectは、C ++の用語では、プレーンな古いデータにすることができます。

もちろん、私が持っているように、テーブル間の関係を作成したり、選択する方法をさらに作成したりすることで、さらに先に進むことができます。

本質的に手続き型言語(SQL)とオブジェクト指向性を統合するのは簡単ではないことを付け加えておきます。そのため、私の方法には欠点があり、それぞれに欠点があるさまざまな答えが得られる可能性があります。

于 2008-09-16T13:50:22.007 に答える
1

PHP 用の小さな MVC フレームワークであるCodeIgniterの使用を検討することもできます。これには、ActiveRecord の実装と適切なデータベース オブジェクトのセット (バインドされた変数を含む) の両方があります。その DB クラスは、デフォルトの PHP MySQL API よりもはるかに優れており、PDO よりも少し単純です (確かにインストールが簡単です)。

于 2008-09-16T17:27:45.963 に答える
0

私は2つのレベルのハンドコード化されたアプローチを行います:

最初のレベルは、単純な関数のセットです。

  • do_query(sql):(開いている)結果オブジェクトを返します。
  • get_record(sql):最初のレコードを返し、クエリは閉じられます。
  • get_datum(sql):最初のレコードの最初のフィールドを返します(クエリを閉じました)

その後、すべてのデータ操作に固有の関数を使用して、モデルレイヤーを作成します。通常、各概念オブジェクトのセクションを含む単一のファイル。パラメータは、SQL構造ではなく、抽象データに関連付けられています。すべてのSQLはこのレイヤーにあります。

于 2008-09-16T11:12:13.540 に答える
0

少なくとも、PDOを使用してください。ほとんどのデータベースプラットフォームに共通のインターフェイスを提供し、必要に応じてデータベースソリューションを簡単に切り替えることができます。

私はpropelのようなオブジェクトリレーショナルマッパー(ORM)を使用するのが好きです:http://propel.phpdb.org/trac/

これにより、オブジェクトがデータベーススキーマに直接マップされます。SQLは必要ありません。マッピングはXMLファイルで行われ、クエリはCriteriaオブジェクトを介して行われます。データベースからPHPクラスをリバースエンジニアリングしたり、スキーマxmlからデータベースを生成したりすることができます。

一般的なORMの詳細については、http://en.wikipedia.org/wiki/Object-relational_mappingを参照してください。

于 2008-09-16T10:41:59.243 に答える
0

MVC構造とデータベース抽象化レイヤーを使用します。このようにして、パブリックインターフェイスを一定に保ちながら、1つの場所に移動して、データアクセスクラスの内部を完全に作り直すことができます。

コード全体の生のSQLは、スケーリングがほぼ不可能になります。

于 2008-09-16T10:45:19.800 に答える
0

コマンドを実行するには、よく実行される SQL コマンドの関数を使用します。これらの関数を使用して、get_users() などのより具体的なものを作成できます。

a)次のような、作成したいクエリごとに関数を作成します

db_select($opts)

ここで、$opts はキーを持つハッシュ配列です。

['table_name', 'selection', 'condition', 'group_by', 'order_by', 'limit']

b) SQL を頻繁に使用する場合は、ハッシュ配列を取得してコマンドを返す SQL コマンド ビルダーを作成したくなるかもしれません。何かのようなもの:

db_builder(array('select'=>array('customers','from'=>'bar','where'=>'foo=10')))

上記の関数は実装でこれを使用し、完全にランダムなステートメントが必要な場合はそうします。うまくいけば、コマンドビルダーコードをどこでも再利用することで全体が堅実になるでしょう。

于 2008-09-16T10:54:24.473 に答える
0

データベース スキーマが変更されたときにコードを変更する必要があるポイント (入力、フィルタリング、検証、フォーム生成など) を最小限に抑える限り、どのような方法でもかまいません。

PDOパラメーター化された SQL、および返されるデータセットを抽象化するクラス::getActiveUsers()(など) を使用して、シンプルに保つのが好き::getUserPersonalData()です。

于 2008-09-16T18:53:19.097 に答える