質問

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

どちらが速いですか?

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

では、これらの理由でPDOを使用するか、従来のmysql_connectを使用する必要がありますか?

役に立ちましたか?

解決

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

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

他のヒント

一部のクイックタイミングは、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を使用したり、 some その他 ライブラリ

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

mysql_*

ところで:私は一般にPDOを使用しています-<!> quot; by hand <!> quot ;、または Zend Framework および/または Doctrine


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

PHPマニュアルのこのページを参照してください。

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

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

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

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

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

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

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

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

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

    Pdo

    1. 接続
    2. <!> quot; <!> lt; <!> quot;を確認します。 <!> quot; <!> gt; <!> quot;そして<!> quot;#<!> quot; (このグローバルな使用のチェック)
    3. 準備
    4. 実行
    5. 閉じる

MySQL _ *

  1. 接続
  2. バックスラッシュを追加
  3. Xsafe
  4. <!> quot; <!> lt; <!> quot;を確認します。 <!> quot; <!> gt; <!> quot;そして<!> quot;#<!> quot; (このグローバルな使用のチェック)
  5. クエリ
  6. 閉じる

両方の機能は同じですが、コードを比較します PDOはより人間に読みやすいです:) どう思いますか?

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

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

出典: http://php.net/manual/en/function。 mysql-connect.php

PDOのいくつかの利点:

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

PDOデータベース接続コード:

<?php
$dbhost = 'localhost';
$dbname = 'clsrepair';
$dbuser = 'root';
$dbpass = '';

try {
    $db = new PDO("mysql:host={$dbhost};dbname={$dbname}",$dbuser,$dbpass);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}

catch(PDOException $e) {
    echo "Connection error: ".$e->getMessage();
}
?>

通常のMySQLデータベース接続コード:

<?php 
mysql_connect("localhost","root", "");
mysql_select_db ("clsrepair");
?>

または

 <?php
$dbHost = 'localhost'; // usually localhost
$dbUsername = 'root';
$dbPassword = '';
$dbDatabase = 'clsrepair';
$db = mysql_connect($dbHost, $dbUsername, $dbPassword) or die ("Unable to connect to Database Server.");
mysql_select_db ($dbDatabase, $db) or die ("Could not select database.");
?>

MySQLデータベース接続コードは簡単ですが、PDOには多くの利点があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top