342

私たちの場所では、プリペアド ステートメントやトランザクション サポートなどのために、mysqli と PDO の使用に分かれています。一部のプロジェクトでは一方を使用し、一部のプロジェクトでは他方を使用します。別の RDBMS に移行する現実的な可能性はほとんどありません。

私が PDO を好むのは、準備済みステートメントに名前付きパラメーターを使用できるという 1 つの理由からです。私の知る限り、mysqli は使用できません。

プロジェクトを統合して 1 つのアプローチのみを使用する際に、標準として 1 つを選択することに他に長所と短所はありますか?

4

13 に答える 13

243

オブジェクト指向の側面、準備されたステートメント、それが標準になるという事実などについて議論することはできます。それで、それは次のとおりです。

PDO の非常に優れた点は、データをフェッチして、オブジェクトに自動的に挿入できることです。ORMを使用したくない場合(簡単なスクリプトであるため)、オブジェクト マッピングが好きな場合は、非常に便利です。

class Student {

    public $id;
    public $first_name;
    public $last_name

    public function getFullName() {
        return $this->first_name.' '.$this->last_name
    }
}

try 
{
    $dbh = new PDO("mysql:host=$hostname;dbname=school", $username, $password)

    $stmt = $dbh->query("SELECT * FROM students");

    /* MAGIC HAPPENS HERE */

    $stmt->setFetchMode(PDO::FETCH_INTO, new Student);


    foreach($stmt as $student)
    {
        echo $student->getFullName().'<br />';
    } 

    $dbh = null;
}
catch(PDOException $e)
{
    echo $e->getMessage();
}
于 2008-12-15T16:49:17.780 に答える
57

あるデータベースから別のデータベースにアプリケーションを移動することはあまり一般的ではありませんが、遅かれ早かれ、別の RDBMS を使用して別のプロジェクトに取り組んでいることに気付くかもしれません。自宅で PDO を使用している場合、その時点で学ぶべきことが少なくとも 1 つ少なくなります。

それとは別に、PDO API はもう少し直感的で、より真にオブジェクト指向に感じられます。mysqli は、私が言いたいことを知っていれば、オブジェクト化された単なる手続き型 API のように感じます。要するに、私は PDO の方が使いやすいと思いますが、それはもちろん主観的なものです。

于 2008-08-17T09:55:03.420 に答える
25

私の意見では、ステートメントのサポートが優れているため、PDOを使い始めました。ActiveRecord風のデータアクセスレイヤーを使用していますが、動的に生成されたステートメントを実装する方がはるかに簡単です。MySQLiのパラメーターのバインドは、単一の関数/メソッド呼び出しで実行する必要があるため、実行時にバインドするパラメーターの数がわからない場合は、call_user_func_array()選択に使用する必要があります(これが正しい関数名だと思います)。 。そして、単純な動的結果バインディングを忘れてください。

何よりも、私はPDOが好きです。なぜなら、それは非常に合理的なレベルの抽象化だからです。SQLを記述したくない完全に抽象化されたシステムで使用するのは簡単ですが、より最適化された純粋なクエリタイプのシステムを使用したり、2つを組み合わせたりすることも簡単にできます。

于 2008-09-08T14:17:40.213 に答える
17

PDO は標準であり、ほとんどの開発者が使用することを期待するものです。mysqli は本質的に特定の問題に対する特注のソリューションでしたが、他の DBMS 固有のライブラリの問題をすべて抱えています。PDO は、すべてのハードワークと巧妙な思考が行われる場所です。

于 2008-09-10T21:56:31.030 に答える
15

心に留めておくべきもう 1 つのことがあります。現在 (PHP 5.2) の PDO ライブラリにはバグがあります。変なバグだらけです。例: 変数に a を格納する前に、大量のバグを回避するためにPDOStatement、変数をに格納する必要があります。unset()これらのほとんどは PHP 5.3 で修正されており、2009 年初頭に PHP 5.3 でリリースされる予定です。これにはおそらく他にも多くのバグが含まれているでしょう。安定したリリースが必要な場合は PHP 6.1 用の PDO を使用し、コミュニティを支援したい場合は PHP 5.3 用の PDO を使用することに集中する必要があります。

于 2008-12-15T15:45:02.933 に答える
10

PDO に関するもう 1 つの注目すべき (良い) 違いは、そのPDO::quote()メソッドが自動的に囲み引用符を追加するのに対し、mysqli::real_escape_string()(および類似のものは) 追加しないことです。

PDO::quote() は、入力文字列を引用符で囲み (必要な場合)、基になるドライバーに適した引用スタイルを使用して、入力文字列内の特殊文字をエスケープします。

于 2011-07-26T04:20:45.663 に答える
8

データベース全体に負荷を分散するためにマスター接続とスレーブ接続を毎日設定できるため、サイト/ウェブアプリが実際に機能するようになると、PDO を使用するとスケーリングがはるかに簡単になります。また、PHP は標準として PDO に移行する方向に向かっています。

PDO情報

Web アプリケーションのスケーリング

于 2012-04-20T22:58:40.663 に答える
6

実行速度という意味ではMySQLiが勝ちますが、MySQLiを使用する優れたラッパーがない限り、プリペアドステートメントを処理する関数はひどいものです。

私にはまだバグがありますが、誰かがそれを望んでいるなら、ここにあります。

つまり、速度の向上を求めているのであれば、MySQLiです。使いやすさが必要な場合は、PDO。

于 2009-04-10T06:04:27.493 に答える
5

個人的には PDO を使っていますが、それは主に好みの問題だと思います。

PDO には、SQL インジェクション (準備済みステートメント) に対して役立ついくつかの機能がありますが、SQL に注意すれば、mysqli でもそれを実現できます。

別のデータベースに移動することは、PDO を使用する理由にはなりません。「特別な SQL 機能」を使用しない限り、ある DB から別の DB に切り替えることができます。ただし、たとえば「SELECT ... LIMIT 1」を使用するとすぐに、「SELECT TOP 1 ...」である MS-SQL に移動できません。したがって、これはとにかく問題があります。

于 2008-08-19T18:55:06.277 に答える
5

編集された回答。

これらの両方の API である程度の経験を積んだ後、ネイティブのプリペアド ステートメントで mysqli を使用できなくする 2 つのブロッキング レベルの機能があると言えます。
それらはすでに2つの優れた(まだ過小評価されている)回答で言及されています:

  1. 値を任意の数のプレースホルダーにバインドする
  2. データを単なる配列として返す

(両方ともこの回答にも記載されています)

何らかの理由で mysqli は両方で失敗しました。
最近では、2 番目のもの ( get_result ) がいくらか改善されましたが、これは mysqlnd インストールでのみ機能します。つまり、スクリプトでこの関数に依存することはできません。

しかし、今日でも値によるバインドはありません。

したがって、選択肢は 1 つだけです: PDO

などの他のすべての理由

  • 名前付きプレースホルダー (このシンタックス シュガーは過大評価されています)
  • さまざまなデータベースのサポート (実際に使用した人はいません)
  • オブジェクトへのフェッチ (役に立たない構文シュガー)
  • 速度差(ありません)

さほど重要ではありません。

同時に、これらの API には、次のような重要な機能がいくつか欠けています。

  • 識別子のプレースホルダー
  • 複雑なデータ型のプレースホルダーで、動的バインディングの負担を軽減します
  • より短いアプリケーション コード。

したがって、実際のニーズに対応するには、これらの API の 1 つに基づいて独自の抽象化ライブラリを作成し、手動で解析されたプレースホルダーを実装する必要があります。この場合、抽象化のレベルが低いため、mysqli を好みます。

于 2013-01-13T13:06:20.920 に答える
4

私のベンチマーク スクリプトでは、各メソッドが 10000 回テストされ、各メソッドの合計時間の差が出力されます。独自の構成でこれを行う必要があります。結果は異なると確信しています!

これらは私の結果です:

  • " SELECT NULL" -> PGO()~ 0.35 秒速くなります
  • " SHOW TABLE STATUS" -> mysqli()~ 2.3 秒速くなります
  • " SELECT * FROM users" -> mysqli()~ 33 秒速くなります

注: mysqli に ->fetch_row() を使用すると、列名が配列に追加されません。PGO でそれを行う方法が見つかりませんでした。しかし、 ->fetch_array() を使用しても、mysqli は少し遅くなりますが、それでも PGO よりは高速です (SELECT NULL を除く)。

于 2010-10-14T20:43:32.693 に答える
3

PDO にはあり、MySQLi にはなく、私が本当に気に入っていることの 1 つは、指定されたクラス型 (例: $pdo->fetchObject('MyClass')) のオブジェクトとして結果を返す PDO の機能です。MySQLifetch_object()はオブジェクトのみを返しstdClassます。

于 2008-09-24T14:01:54.383 に答える
-4

心に留めておくべきことが1つあります。

Mysqli は、列名を表すキーを持つ列を返す fetch_assoc() 関数をサポートしていません。もちろん、それを行う独自の関数を作成することは可能です。それほど長くはありませんが、私はそれを書くのに本当に苦労しました (信じない人のために: 簡単に思える場合は、しばらく自分で試してみてください。 tチート:))

于 2008-09-24T13:45:36.497 に答える