web-dev-qa-db-ja.com

PHP PDOおよびMySQLi

PHPの導入コースを終えたばかりで、stackoverflowフォーラム全体を通して、PDO、Prepared Statement、またはMYSQLiに切り替えることを推奨されています。

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

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

更新:答えてくれてありがとう、私はPDOチュートリアルをもっと探しています。

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

どちらが速くて軽いか-mysqliまたはPDO

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

37
grasshopper

基本レベルでは、mysql、mysqli、およびPDO拡張機能はすべて質問に答えますデータベースとの対話方法これらはすべて、データベースに接続し、データベースからデータを送受信するための機能を提供します。これらをすべて同時に使用して、データベースへの複数の接続を一度に確立できますが、通常は無意味です。

mysql *は、基本的にデータベースに接続し、SQLクエリを送信できる、非常に単純な拡張機能です。
mysqliは、パラメーター化されたクエリと他のいくつかをミックスに追加することにより、(名前が示すように)これを改善します。
。または、データベースを切り替えるときにコードを書き換えます(少なくとも理論上)。また、パラメーター化されたクエリもサポートしています。

MySQLを排他的に使用することがわかっている場合は、mysqliが適しています。特に、プロシージャルな方法で使用できるため、mysql拡張機能で既に使用しているものです。 OOPに慣れていない場合、それは役に立ちます。それ以外の場合、PDOはNiceオブジェクト指向の柔軟なデータベースコネクタです。


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

39
deceze

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

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

あなたが尋ねる

PDO、準備されたステートメントとMySQLiの違いは何ですか...

PDOMySQLiはDBラッパーです。 「準備された文」はまったく異なる概念です。複数回実行できるクエリを準備することができ、適切にパラメーター化されたステートメントは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の構文を好みます。それも速いかもしれませんが、私はそれを補うことができました。 PEAR MDB2これはめったに話されず、さらに多くのことを確信しています。 PDOが組み込まれているので、それを使用します。

16
Explosion Pills

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

必要に応じて代わりにPDOを使用することもできますが、複数のデータベースのサポートを開始する必要がある場合、これは最初のインスタンスで本当に価値があります。あなたの目的のために、MySQLiに切り替えることをお勧めします。これはあなたにとって簡単であり、とにかくPDOの利点をすぐに得られないからです。

MySQLiで利用可能な関数は、あなたが慣れているmysql_xx関数にかなり似ています。通常、既存のコードを取得し、それらの間で直接スワップを行うことが可能であり、コードは引き続き正常に機能するはずです。

始めるのに良い場所です-mysql_xxx`の代わりにmysqli_xxxを使用してコードを取得します。

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

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

4
SDC

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準備済みステートメントを使用して送信されるクエリの例を示しています。

1
PhilDin

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

1
cDecker32