21

何か新しいことを学ぼうとしています - 具体的には、将来のプロジェクトで MySQL を使用するときにMySQLiPDOのどちらを使用するかを選択しようとしています - 私が利用できるオプションの概要を示すこのページに出くわしました。

このページの下部には、mysql と通信する 3 つの主要な方法の機能を比較した表があります。「 API はクライアント側のプリペアド ステートメントをサポートしています」という行では、PDO はこれをサポートし、MySQLi はサポートしていないと述べています。

準備済みステートメントとは何かを知っています。この質問に対する答えは、サーバー側の準備済みステートメントであると私が信じている単純な例です。また、PHP はサーバー側の言語であるため、クライアント側のプリペアド ステートメントを使用できるかどうかは問題ではありません。しかし、なぜそれがPHPマニュアルに記載されているのか疑問に思います。

では、クライアント側の準備済みステートメントとは何ですか?

4

3 に答える 3

28

明らかに、クライアント側の準備済みステートメントは、サーバーではなくクライアントによって準備されたステートメントです。

PDO は、複数の DBMS インターフェイス (ドライバー) をサポートするデータアクセス抽象化レイヤーであり、サーバー側の準備済みステートメントをサポートするもの (例: MySQL 4.1+) とサポートしないもの (例: MySQL 3) があります。

PDO ドライバーがサーバー側のプリペアド ステートメントをサポートしていない場合、PDO はそれらをクライアント側でエミュレートし、汎用クエリ インターフェイスを使用してそれらを実行します。

MySQLi がそれらをサポートしない理由は単純です。MySQLi は MySQL 固有の拡張機能であり、実際にサーバー側の準備済みステートメントをサポートする RDBMS であるため、それらをエミュレートする理由はありません。

于 2012-04-13T19:12:12.577 に答える
14

コメントで述べたように、この場合、「クライアント」は PHP を指し、「サーバー」は MySQL を指します。PDO は MySQL 以外のデータベースをサポートしています。これらのすべてのデータベース/db ドライバーがプリペアド ステートメントをネイティブにサポートしているわけではありません。その場合、PDO はこれらのステートメント自体をエミュレートします。MySQLi はそうしません (いつそうしなければならないかはわかりませんが、古い MySQL ドライバーを扱っているときでしょうか?)。

考慮すべきもう 1 つの要因 - 特定の PHP フレームワークは PDO を必要とし、mysqli をサポートしていません。

于 2012-04-13T19:08:25.113 に答える
2

PDO を使用すると、PDO で接続しているデータベースがそれらをサポートしているかどうかに関係なく、準備済みステートメントを (コードで) 使用できます。

サーバーが準備済みステートメントを処理する場合、PDO はサーバーにそれらを処理させます (サーバー側)。そうでない場合、PDO は単に PDO (クライアント側) 内で準備済みステートメントをエミュレートしますが、各クエリをサーバーに送信する必要があります。

于 2012-04-13T19:53:06.680 に答える