web-dev-qa-db-ja.com

PHP PDO vs通常のmysql_connect

PHPでデータベースクエリを実行するには、php PDOまたは通常のmysql_connectを使用する必要がありますか?

どちらが速いですか?

PDOの大きな利点の1つは、インターフェイスが複数のデータベース間で一貫していることです。プリペアドステートメントには、すべてのクエリ文字列をエスケープする手間を省くクールな関数もいくつかあります。 PDOの移植性はmysql_connectよりも優れています。

したがって、これらの理由でPDOを使用するか、従来のmysql_connectに固執する必要がありますか?

46
Imrul

PDOはmysql_ *よりも少し遅いですが、移植性に優れています。 PDOは、複数のデータベースにわたって単一のインターフェースを提供します。つまり、mysqlにmysql_query、MS SQLにmssql_queryなどを使用せずに複数のDBを使用できます。常に$ db-> query( "INSERT INTO ...")などを使用します。使用しているDBドライバーに関係なく。

そのため、大規模またはポータブルなプロジェクトにはPDOが望ましいです。 zendフレームワークでさえPDOを使用します。

40
Sadi

いくつかの速いタイミングは、PDOが接続時にわずかに速いことを示しています。

$start = microtime(true);
for($i=0; $i<10000; ++$i) {

    try {
        $db = new PDO($dsn, $user, $password);
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage()."\n";
    }
    $db = null;
}

$pdotime = microtime(true) - $start;
echo "PDO time: ".$pdotime."\n";

$start = microtime(true);
for($i=0; $i<10000; ++$i) {
    $db = mysql_connect($Host, $user, $password);
    if(!$db) {
        echo "Connection failed\n";
    }
    if(!mysql_select_db($schema, $db)) {
        echo "Error: ".mysql_error()."\n";
    }
    mysql_close($db);
}

$rawtime = microtime(true) - $start;
echo "Raw time: ".$rawtime."\n";

次のような結果が得られます

PDO time: 0.77983117103577
Raw time: 0.8918719291687

PDO time: 0.7866849899292
Raw time: 0.8954758644104

PDO time: 0.77420806884766
Raw time: 0.90708494186401

PDO time: 0.77484893798828
Raw time: 0.90069103240967

とにかく速度の違いは無視できます。ネットワーク接続の確立には、特にmysqlサーバーが別のホスト上にある場合、PDOによって発生するオーバーヘッドよりもかなり長い時間がかかります。

PDOを使用するすべての理由を述べました。本当に、mysql_ *関数を直接使用しないでください。PDOを使用するか、 someotherlibrary を使用してください。

17
gnud
  • PDOを使用すると、バインドされたパラメーターを使用でき、ほとんどのSQLインジェクション攻撃を防ぐことができます。
  • PDO準備済みステートメントを使用すると、さらに高速化できます。
  • すべてのdbバックエンドへの標準インターフェース
  • 便利なメソッドがたくさんあります(fetch *ファミリーなど)
11
Arklys

PDOを使用しているときに、人々が求めているのは速度だとは思いません-違いがあるかどうかはわかりませんし、正直に気にしません:いくつかのクエリを実行している限りページ生成時のデータベース、PHP側で数ミリ秒は何も変更しません。

mysql_* と比較して、PDOには2つまたは3つの素晴らしい点があります。

  • データベース間でほぼ一定のインターフェイス。 mysql_*pg_*oci_*、...を使用するよりも優れています.
  • オブジェクト指向APImysqli_* にはOO-APIがありますが、mysql_*はありません)
  • MySQLの新しい機能のサポート> = 4.1mysqli_*と同じですが、mysql_*とは同じではありません)

ところで、私は一般的にPDOを使用しています。「手動」で、または Zend Framework および/または Doctrine に統合/使用されています。


補足:PDOを使用しない場合でも、mysqlの代わりにmysqliを使用することをお勧めします。

PHP manual のこのページ)を参照してください。

11
Pascal MARTIN

準備済みステートメントと通常の直接クエリ(MysqlndおよびMyISAMテーブルでselectステートメントを使用してテスト)の両方を使用して、Mysqli関数をPDO関数と比較するパフォーマンステストを行いました。

PDOクエリはMysqliよりもわずかに遅いが、ほんの少しだけ遅いことがわかりました。これは、PDOがこの目的に使用されるのはほとんどMysqli関数を呼び出すラッパーだけであるため、理にかなっています。 PDOを使用する利点は、関数名がMySQLに固有ではないため、別のデータベースへの移行が少し簡単になることです。

実際のパフォーマンスの違いは、準備済みクエリを使用するかどうかです。大規模で重要なパフォーマンスがありますペナルティ準備済みクエリの使用。それらをテストした他の人々は同じ結果を見つけました。

クエリの準備が高速になるのは、クエリを1回準備してから、異なるデータ値で何千回も送信する場合のみです。それ以外の場合、mysqli :: query()またはPDO :: query()を使用する方が常に高速です。ただし、これらの関数はデータ値をエスケープしないことに注意することが重要です。そのため、データ変数でmysqli :: real_ escape_ string()またはPDO :: quote()を使用することを忘れないでください。

6
orrd

特別な理由がない限り、PDOを使用することをお勧めします。 2つの間にわずかな違いがなく、PDOを使用しない理由がない場合、単にmysql_ *を使用するよりも、アプリケーションでDB抽象化を使用する練習に入る方が良いと思います。私はベストプラクティスを勝ち取ろうと言うでしょう。

4
Robert DeBoer
  • PDOはSQlよりも優れています
  • PDOとそのPrepareステートメントは、SQLインジェクションに対して最高の安全なコードを提供します
  • PDOはオブジェクト指向です;)
  • 前に説明したように、PDOは一部のデータベースエンジンと互換性があります
  • MySQLl_ *は非推奨であり、すぐに削除されます
  • PDOは、より少ないコード行でより多くの機能を提供します例:

    Pdo

    1. つなぐ
    2. 「<」および「>」および「#」を確認します(この使用法はグローバルな使用を確認します)
    3. 準備する
    4. Execute
    5. 閉じる

MySQL_ *

  1. つなぐ
  2. バックスラッシュを追加
  3. Xsafe
  4. 「<」および「>」および「#」を確認します(この使用法はグローバルな使用を確認します)
  5. 問い合わせ
  6. 閉じる

どちらも同じ機能ですが、コードを比較すると、PDOはより人間に読みやすくなります:)

3
Jamil Hneini

どちらの場合も、同じPhpサーバーから同じmySQLサーバーを呼び出すため、多くの違いに気付くことはありません。

良好なパフォーマンスが必要な場合は、キャッシュ(memcacheまたは単純なPhpファイル...)について考え、適切なデータベース構造を作成します(INDEX ...)

3
Thomas Decaux

パフォーマンスがあなたにとって「本当の問題」でない場合は、PDOを使用する必要があります。パフォーマンスにはわずかな差があり、PDOには非常に優れた移植性のあるクロスデータベースインターフェイスがあり、複数のデータベースドライバーを使用する必要がある場合に頭痛の種を軽減できます。

2
yoda

mysql_connect関数はPHP 5.5.0の時点で非推奨であり、ほとんどの非推奨機能と同様に削除されます。したがって、 PDO_MySQL (または別の代替- MySQLi )over mysql_connect

ソース: http://php.net/manual/en/function.mysql-connect.php

2
Czar Pino

PDOのいくつかの利点:

  1. 複数のデータベースにアクセスできます。
  2. 異なるデータベースに接続するための多くのデータベースドライバーを提供しました。
  3. あるデータベースから別のデータベースに切り替える場合、新しいデータベースに接続するためのすべてのコードを記述する必要はなく、新しいデータベースに必要な接続文字列とクエリを変更するだけです。
  4. 一度だけコンパイルされ、プレースホルダーと呼ばれる属性を変更するだけで、何度でも実行できるクエリのテンプレートの一種である準備ステートメントを提供します。
  5. 簡単で効率的な一般的な操作-挿入、更新など.
0
alex