37

PHP の入門コースを終えたばかりで、stackoverflow フォーラム全体で、PDO、プリペアード ステートメント、または MYSQLi に切り替えるように勧められていました。マニュアルを簡単に確認しましたが、ほとんどが頭を悩ませていました。

私は今まで mysql_* 関数を使用してきたので、これらの概念は私にとって新しいものです。データベース固有のアクションにアクセスして実行するために使用されていると思いますが、よくわかりません。

では、PDO、プリペアド ステートメント、および MySQLi の違いは何ですか?同じタスクを実行する機能が異なるのでしょうか? それらはスクリプトで互換性がありますか、それとも「どちらかを選択する」のですか? そして最後に、最高のパフォーマンスを提供するのはどれですか?

更新: 回答ありがとうございます。PDO のチュートリアルをさらに探します。

参考までに、次の投稿も役に立ちました。

mysqli と PDO のどちらが高速で軽量か

mysqli または PDO - 長所と短所は何ですか?

4

6 に答える 6

39

基本レベルでは、mysql、mysqli、および PDO 拡張機能はすべて、データベースとどのようにやり取りすればよいかという質問に答えます。それらはすべて、データベースに接続し、そこからデータを送信および取得するための関数と機能を提供します。それらをすべて同時に使用して、データベースへの複数の接続を一度に確立できますが、それは通常ナンセンスです。

mysql* は非常にシンプルな拡張機能で、基本的にデータベースに接続して SQL クエリを送信するだけで済みます。
mysqli は、(名前が示すように) これを改善するために、パラメーター化されたクエリとその他のいくつかをミックスに追加します。
PDO は、いくつかのデータベース ドライバーを 1 つのパッケージに抽象化する拡張機能です。つまり、同じコードを使用して、データベース固有の拡張機能を使用したりコードを書き直したりすることなく、MySQL、Oracle、MS SQL Server、および他の多くのデータベースに接続できます。データベースを切り替えます(少なくとも理論的には)。また、パラメーター化されたクエリもサポートしています。

MySQL のみを使用することがわかっている場合は、mysqli を選択することをお勧めします。特に、手続き型の方法で使用できるため、mysql 拡張機能で既に慣れているものです。OOP に慣れていない場合は、役に立ちます。そうでなければ、PDO は優れたオブジェクト指向の柔軟なデータベース コネクタです。


* mysql 拡張機能は現在非推奨であり、将来的に削除されることに注意してください。それは、古いものであり、悪い慣行に満ちており、最新の機能がいくつか欠けているためです。新しいコードを書くために使用しないでください。

于 2012-05-22T14:03:30.647 に答える
16

PDO「PHPデータオブジェクト」です。私は主に PDO を使用しているため、そのメリットについてのみ話すことができます。

  • MySQL だけでなく、より多くのデータベースで動作します (あなたには関係ないかもしれません)
  • コンパイルされたCなので、より高速です(おそらく)
  • 準備されたステートメント(ただし、他の人にはこれらがあります)
  • SOはそれを気に入っているようですので、少なくともここで多くの助けを得ることができます
  • オンザフライで設定および変更できるさまざまなフェッチ/エラー処理モード

あなたが尋ねる

では、PDO、準備済みステートメント、および MySQLi の違いは何ですか...

PDOおよびMySQLiDB ラッパーです。「準備されたステートメント」はまったく別の概念です。複数回実行できるクエリを準備でき、適切にパラメータ化されたステートメントは SQL インジェクションに対して安全です (証明ではないかもしれませんが)。後者の理由は、PDO (または MySQLi) を使用する必要がある理由のほとんどですが、準備されたステートメントもクエリにある程度の明確さをもたらします。

/* mysql_* version */
mysql_connect("host");
$query = "SELECT column FROM db1.t1 WHERE id = ";
foreach ($_GET['id'] as $id) {
   $id = mysql_real_escape_string($id);
   $result = mysql_query($query . "'$id'";
   while ($row = mysql_fetch_assoc($result)) {
      echo "$row[column]\n";
   }
}
//NOTE: it would probably be better to store the resource returned by
//mysql_connect and use that consistently (in query/escape)

/* PDO version */
$pdo = new PDO('mysql:host=HOST', 'user', 'pass');
$query = $pdo->prepare("SELECT column FROM db1.t1 WHERE id = ?";
foreach ($_GET['id'] as $id) {
   $query->execute($id);
   echo $query->fetch(PDO::FETCH_COLUMN);
}
//Notice that you skip the escape step.

で基本的に同じことができますが、私はの構文MySQLiを好みます。PDOそれも速いかもしれませんが、私はそれを補うことができました。MDB2めったに語られることのない PEAR もあります。PDOが組み込まれているので、私はそれで行きます。

于 2012-05-22T14:03:39.990 に答える
4

関数に慣れている場合は、代わりに拡張機能にmysql_xxx移動することから始めます。MySQLi

必要に応じて代わりに PDO を使用することもできますが、複数のデータベースのサポートを開始する必要がある場合、これは最初のインスタンスでのみ価値があります。あなたの目的のために、私はMySQLiに切り替えることをお勧めします.

MySQLi で利用できる関数は、使い慣れた関数とほとんど同じmysql_xxです。通常、既存のコードを使用してそれらの間で直接交換することは可能であり、コードは問題なく動作し続けるはずです。

mysqli_xxxここから始めるのがよいでしょう -- mysql_xxx` の代わりにコードを使用してください。

可能であれば、手続き型構文ではなくオブジェクト指向構文を使用することをお勧めします。MySQLi は両方をサポートしており、手続き型の構文は慣れ親しんだものに近くなりますが、OO 構文は長い目で見ればより柔軟であり、慣れてしまえばそれほど違いはありません。

コードを MySQLi ライブラリを使用するように変換し、基本に慣れたら、準備済みステートメントなどのより高度な機能を使用する準備が整います。ただし、最初に基本に慣れてください。

于 2012-05-22T14:11:36.520 に答える
1

PDO の大きな利点の 1 つは、プラットフォームに依存しないことです。これは、すべての関数呼び出しを再コーディングすることなく、ある時点で別の DBMS に移行できることを意味します。これは、Java (JDBC 経由)、.Net (ADO)、およびその他のほとんどの環境で通常行われる方法です。利点は、DBMS 自体を切り替えることができることだけではなく、習得する API が 1 つしかないことでもあります。

あなたの質問に関しては、PDO レイヤーは、準備されたステートメントを実行する機能を提供します。準備されたステートメントの背後にある考え方は、実行時までわからない SQL ステートメントの部分のプレースホルダーを作成することです。多くの学習者は、mysqli::query($someQuery) を呼び出して実行される文字列として SQL を作成することから始めます。これは多くの理由で問題となりますが、最も顕著なのは SQL インジェクションに対する脆弱性です (同様の質問と回答については、stackoverflow.com/questions/5315351 を参照してください)。PDO を使用すると、SQL インジェクションや、引用符、バックスラッシュなどの文字の処理に関するすべての問題を回避できます。その結果、コードはより安全で、読みやすく、予測可能になります。

mysqli の使用方法を既に理解している場合は、PDO の使用もそれほど変わりません。上記のリンクされた質問と回答は、役立つガイドとして機能する PDO 準備済みステートメントを使用して送信されるクエリの例を示しています。

于 2012-05-22T14:15:36.230 に答える
1

あなたと同じ視点から来ています。私の観点からは、違いが本当に目立つとは思いません(使用目的によって異なります)。PDO は、他のすべてのデータベース API を 1 つにマージする単純なデータベース API のようです。したがって、MS Sql サーバーと MySQL サーバーに接続する必要がある場合は、PDO API を呼び出して、特定のデータベースのドライバーを指定するだけです。私の推測では、MySQL の将来の機能や能力は PDO でのみ利用可能になるでしょう。したがって、基本的には PDO を使用して、すべての最新機能にアクセスできるようにします。

于 2012-05-22T14:02:58.827 に答える