2011-07-08 5 views
19

PDO(PHPデータオブジェクト)についてこれまでに読んだことはすべて、あまりにも真実であることがあります。PDO(PHPデータオブジェクト)の短所

私は意味:

  • その速いMySQLやmysqliのその後。
  • 複数のデータベースドライバで同じ構文です。
  • プリペアドステートメントでは、SQLインジェクションのために安全です。
  • オブジェクトに直接データをフェッチできます。

しかし、PDOの短所は何ですか?

+0

PHPと同じこと:開発者が訓練されていない場合、unsafeとは、解決できない混乱を意味します。バグハンティング地獄。いつもの。 – bdares

+2

@bdaresこれは実際にはかなり型安全です。あなたの議論はPHPとその本質ではなく、PDOに対してではありません。 –

+0

すべてのデータベースで同じ構文が何を意味するのか分かりません。あなたがSQLを意味する場合、あなたは間違っています。 Pdoはデータアクセス抽象化層であり、データベース抽象化ではなく、SQLは異なるままです。クエリを作成することを意味する場合、正しいかもしれませんが、単純なラッパーを書くことで、データベースの種類を変更したい場合は同じことができます。 – frostymarvelous

答えて

15

PDO(PHP Data Objects)についてこれまでに読んだことはすべて、あまりにも真実であることがあります。

私は毎日PDOを使用していますが、それは理由があります。デフォルトのPDOインスタンスが好きでないもの(例:静かに失敗)を行い、APIがずっと良くなっている可能性があるため、私はラッパーを作成しました。定数による設定は私のデフォルトの方法ではありません。また、私はいくつかの便利なメソッドを作成しました。

これより速いmysqlまたはmysqli。

ですか?私はあなたがこれを選んだ場所は分かりませんが、それは正しいかもしれませんが、私はネイティブのMySQLライブラリよりも速いPDOについて聞いていません。

複数のデータベースドライバで同じ構文です。

私はPostgreSQLをたくさん使います。コードはMySQLを使って作業しているときとは異なります。 PostgreSQLは名前付きシーケンスで動作するのに対し、MySQLはテーブル当たりのシーケンスである「自動インクリメント」で動作します。 PDOが抽象化できないデータベースは、データベースの場合でも、にアクセスすると、という違いがあります。

準備文では、SQLインジェクションでは安全です。

prepare statements with mysqliでも可能ですが、これは明確な逆転ではありません。私は一般的に準備されたステートメントを使用しますが、PDOが提供するフィールド構文が好きです。

しかし、PDOの欠点はどこにあるのでしょうか。非常に多くのプロを持つものには反対があります。

APIは私にとって直感的ではありません。私はmysqliのAPIが理にかなっていると思います。それにもかかわらず、あなた自身のラッパーを書くなら、それは非常にまともなライブラリです。 PDOをもう少し元気にするためにはthe wrapper I wroteがありますが、インターネット上で多くの例が漂っています。

EDIT:ああ、ジェームスアンダーソンは正しいです。 Oracleのサポートは貧弱です。私はオラクルを使用していないので、それは巨大な欠点としては見えません。

+1

プリペアドステートメントを複数回使用するとPDOがmysql_ *より速くなる可能性があります。プリペアドステートメントのためにmysqlサーバに送信する必要があるデータが少なくて済みますが、準備されたステートメントを数回実行して数回実行しても、 mysqliよりも高速です。 – Mike

+1

私のビジョンではPDOは、まともなDBのバックグラウンドを持たないプログラマーのために難しいですが、単なるOOではありません。 *右*クエリを使用します。 – ZJR

+0

^この回数は100万回です。 – mopsyd

0

PDOの欠点の1つは、クエリに時間がかかります。 (申し訳ありませんが、私はその記事への言及を持っていません)、うまくいけば、いくつかの専門家がそれについて話すことができます。私の知っている

3

つの欠点:

ないか貧しいOracleサポート!

大きな結果セットでパフォーマンスが低下することがあります。

最初の「欠点」は、Oracleを避けるもう一つの理由です。 2番めはめったに問題ありません。

5

バインドメカニズムは、列またはテーブル名では機能しません。

簡単な例:明るい側では

CREATE TABLE :bar (rowId int) 

SELECT :foo FROM :bar 

、これはあなたが頻繁に必要とするか、やってみたいものではありません。

しかし、あなたが行ったときには... PDOがぶら下がっています。

$foo = some_escape_logic($dirtyFoo); 
$bar = some_escape_logic($dirtyBar); 

$db->query("SELECT {$foo} FROM {$bar}"); 

SQLの結果は常に文字列として返されるも、SQLテーブル場合は、文字列値の配列を返します)

は(フェッチ:行って、手エスケープをしながら、解決策は手動で一緒にあなたのクエリ文字列をconcatingされます型は数値です。たとえば、BIGINT /文字列/ bigintの列を持つテーブルを返します:代わりに

array('rowId' => '1', 'name' => 'Fred', 'age' => '12'); 

array('rowId' => 1, 'name' => 'Fred', 'age' => 12); 

を正として、あなたはPHPとSQLの型の間のミスマッチから精度を失うことは決してないだろう。 PHPでのジャグリングは、もともとデータが文字列としてエンコードされていることに気付かないことがあります。負として

あなたが引用された数値になってしまいますから、これは、)(json_encodeのようなものにDB結果を渡すときに痛みをすることができます:

{ "rowId": "1", "name": "Fred", "age": "12" } 

代わりの

{ "rowId": 1, "name": "Fred", "age": 12 } 

理想的な世界では、fetch()のオートキャスティング出力タイプはオプションの引数で制御可能です。

+0

私は最初にここで引用した最初の問題を発見しました。私がデータベース関係スキームを間違ってやっていることを十分に学んだときには、私はそれを修正し、この問題を再び発見しませんでした。とにかく+1 –

+0

SQLの結果は常に文字列として返されます - mysqlドライバの場合と思われますが、postgresドライバはそうではありません。 PDOでpostgresを使用している場合は、最も近い同等のPHP型に値をマップしようとします – GordonM

5

より速いmysqlまたはmysqli。

が間違っています。実際の生活では一般的には遅いです。

複数のデータベースドライバで同じ構文です。

API機能 - もちろん、そうです。異なるSQL方言であなたを助けてくれることはありません。

準備文では、SQLインジェクションでは安全です。 SQLインジェクションに対して確保するための

、事項適切にエスケープする必要があります

  • 文字列
  • 番号
  • 識別子
  • 事業者

PDOしばらくモミのみをカバーする2つ。