PDO(PHPデータオブジェクト)についてこれまでに読んだことはすべて、あまりにも真実であることがあります。PDO(PHPデータオブジェクト)の短所
私は意味:
- その速いMySQLやmysqliのその後。
- 複数のデータベースドライバで同じ構文です。
- プリペアドステートメントでは、SQLインジェクションのために安全です。
- オブジェクトに直接データをフェッチできます。
しかし、PDOの短所は何ですか?
PDO(PHPデータオブジェクト)についてこれまでに読んだことはすべて、あまりにも真実であることがあります。PDO(PHPデータオブジェクト)の短所
私は意味:
しかし、PDOの短所は何ですか?
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のサポートは貧弱です。私はオラクルを使用していないので、それは巨大な欠点としては見えません。
PDOの欠点の1つは、クエリに時間がかかります。 (申し訳ありませんが、私はその記事への言及を持っていません)、うまくいけば、いくつかの専門家がそれについて話すことができます。私の知っている
つの欠点:
ないか貧しいOracleサポート!
大きな結果セットでパフォーマンスが低下することがあります。
最初の「欠点」は、Oracleを避けるもう一つの理由です。 2番めはめったに問題ありません。
バインドメカニズムは、列またはテーブル名では機能しません。
簡単な例:明るい側では
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()のオートキャスティング出力タイプはオプションの引数で制御可能です。
私は最初にここで引用した最初の問題を発見しました。私がデータベース関係スキームを間違ってやっていることを十分に学んだときには、私はそれを修正し、この問題を再び発見しませんでした。とにかく+1 –
SQLの結果は常に文字列として返されます - mysqlドライバの場合と思われますが、postgresドライバはそうではありません。 PDOでpostgresを使用している場合は、最も近い同等のPHP型に値をマップしようとします – GordonM
より速いmysqlまたはmysqli。
が間違っています。実際の生活では一般的には遅いです。
複数のデータベースドライバで同じ構文です。
API機能 - もちろん、そうです。異なるSQL方言であなたを助けてくれることはありません。
準備文では、SQLインジェクションでは安全です。 SQLインジェクションに対して確保するための
、事項適切にエスケープする必要があります
PDOしばらくモミのみをカバーする2つ。
PHPと同じこと:開発者が訓練されていない場合、unsafeとは、解決できない混乱を意味します。バグハンティング地獄。いつもの。 – bdares
@bdaresこれは実際にはかなり型安全です。あなたの議論はPHPとその本質ではなく、PDOに対してではありません。 –
すべてのデータベースで同じ構文が何を意味するのか分かりません。あなたがSQLを意味する場合、あなたは間違っています。 Pdoはデータアクセス抽象化層であり、データベース抽象化ではなく、SQLは異なるままです。クエリを作成することを意味する場合、正しいかもしれませんが、単純なラッパーを書くことで、データベースの種類を変更したい場合は同じことができます。 – frostymarvelous