<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/book.mysqli.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ja',
  ),
  'this' => 
  array (
    0 => 'mysqli.overview.php',
    1 => 'mysqli の概要',
    2 => 'mysqli の概要',
  ),
  'up' => 
  array (
    0 => 'book.mysqli.php',
    1 => 'MySQLi',
  ),
  'prev' => 
  array (
    0 => 'book.mysqli.php',
    1 => 'MySQLi',
  ),
  'next' => 
  array (
    0 => 'mysqli.quickstart.php',
    1 => 'クイックスタートガイド',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'reference/mysqli/overview.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="mysqli.overview" class="chapter">

  <h1 class="title">mysqli の概要</h1>


  <p class="para">
    このセクションでは、 PHP アプリケーションの開発で MySQL データベースを扱うときの選択肢について説明します。 
  </p>

  <p class="para">
    <strong>API って何?</strong>
  </p>

  <p class="para">
    API は Application Programming Interface の略で、 何らかのタスクを実行するためにアプリケーションから呼び出す必要のある クラスやメソッド、関数、変数などを定義したものです。 データベースとの通信を必要とする PHP アプリケーションが使うための API は、 通常は PHP の拡張モジュールとして公開されています。 
  </p>

  <p class="para">
    API は手続き型にすることもできるし、 オブジェクト指向型にすることもできます。 手続き型の API の場合は何かの処理を実行するための関数を呼ぶことになり、 オブジェクト指向型の API の場合はクラスのインスタンスを作ってそのメソッドを呼ぶことになります。 通常は、後者の方法をおすすめします。 後者のほうがよりモダンであり、 きっちりとしたコードを書けるからです。 
  </p>

  <p class="para">
    MySQL サーバーとの接続が必要な PHP アプリケーションを書く場合に 使える API はいくつかあって、その中から選べます。 このドキュメントでは、 どんな API が使えてどれを選ぶのが最適なのかを解説します。 
  </p>

  <p class="para">
    <strong>コネクタとは?</strong>
  </p>

  <p class="para">
    MySQL のドキュメントで使われている <em>コネクタ</em> という用語は、 何かのアプリケーションから MySQL データベースサーバーに接続するためのソフトウェアのことを指します。 MySQL はさまざまな言語用のコネクタを提供しており、 PHP もその中に含まれます。 
  </p>

  <p class="para">
    PHP のアプリケーションで、 データベースサーバーとの通信が必要になったときには、 データベースサーバーへの接続やデータベースへの問い合わせなどの関数を呼ぶ PHP コードを書くことになるでしょう。 つまり、PHP アプリケーションから使える API を提供するソフトウェアが必要になるということです。 そのソフトウェアは、 アプリケーションとデータベースサーバーの間の通信も処理しないといけません。 おそらくは中間ライブラリも利用することになるでしょう。 このソフトウェアのことを一般的にコネクタと呼びます。 というのも、 このソフトウェアのおかげで アプリケーションがデータベースサーバーに 接続 (<em>connect</em>) できるようになるからです。 
  </p>

  <p class="para">
    <strong>ドライバとは?</strong>
  </p>

  <p class="para">
    ドライバとは、 特定のデータベースサーバーとの通信をするために作られたソフトウェアのことです。 ドライバはライブラリと呼ばれることもあり、 MySQL Client Library や MySQL Native ドライバ というように使われます。 これらのライブラリが実装するのは低レベルのプロトコルで、 これを使って MySQL データベースサーバーと通信します。 
  </p>

  <p class="para">
    例を挙げると、データベース抽象化レイヤーの <a href="mysqli.overview.php#mysqli.overview.pdo" class="link">PHP Data Objects (PDO)</a> は各データベース専用のドライバの中からひとつを選んで使います。 数あるドライバの中のひとつに PDO MYSQL ドライバがあり、 これが MySQL サーバーとのインターフェイスとなります。 
  </p>

  <p class="para">
    人によっては、コネクタとドライバを混同して使うこともあって、 混乱の元となります。 MySQL 関連のドキュメントでは、<q class="quote">ドライバ</q> という用語は、 コネクタパッケージのうち、 データベース固有の機能を提供するソフトウェアという意味で 予約されています。 
  </p>

  <p class="para">
    <strong>拡張モジュールとは?</strong>
  </p>

  <p class="para">
    PHP のドキュメントを読んでいると、<em>拡張モジュール</em> という用語がよく出てきます。 PHP のコードには、コア機能とは別に オプションの拡張モジュールが用意されています。 PHP で使える MySQL 関連の拡張モジュールには mysqli や PDO MySQL があり、 PHP の拡張モジュール用フレームワークを使って実装されています。 
  </p>

  <p class="para">
    拡張モジュールは一般的に PHP プログラマー向けの API を公開しており、 その機能をプログラムから使えるようになっています。 しかし、PHP 拡張モジュールフレームワークを使って書かれた拡張モジュールの中には、 PHP プログラマー向けの API を公開していないものもあります。 
  </p>

  <p class="para">
     たとえば PDO MySQL ドライバは PHP の拡張モジュールですが、 それ自体は PHP プログラマー向けの API を公開していません。 さらに上位にある PDO レイヤーへのインターフェイスを提供しているだけです。 
  </p>

  <p class="para">
    API と拡張モジュールとは同じ意味ではありません。 拡張モジュールが必ずしもプログラマー向けの API を公開しているとは限らないからです。 
  </p>

  <p class="para">
    <strong>
    MySQL を使うために、提供されている主要な PHP API は何ですか?
    </strong>
  </p>

  <p class="para">
    MySQL データベースサーバーに接続することを検討する際、
    ふたつの主要な選択肢があります:
  </p>

  <ul class="itemizedlist">

    <li class="listitem">
      <p class="para">
        PHP の mysqli 拡張モジュール
      </p>
    </li>

    <li class="listitem">
      <p class="para">
        PHP Data Objects (PDO)
      </p>
    </li>

  </ul>

  <p class="para">
    それぞれ、長所と短所があります。
    以下の説明で、それぞれの API の重要な側面を簡単に説明していきます。
  </p>

  <p class="para">
    <strong>
      PHP の mysqli 拡張モジュールとは何ですか?
    </strong>
  </p>

  <p class="para">
    <code class="literal">mysqli</code> 拡張モジュール、
    もしくは <em>改良版</em>
    MySQL 拡張モジュールとしても知られているものは、
    MySQL のバージョン 4.1.3 以降の新機能を利用するために開発されました。
    <code class="literal">mysqli</code> 拡張モジュールは、
    PHP 5 以降にバンドルされています。
  </p>

  <p class="para">
    <code class="literal">mysqli</code> 拡張モジュールにはたくさんの利点がありますが、
    <code class="literal">mysql</code> 拡張モジュールに対する、
    主な改良点は下記のとおりです:

    <ul class="itemizedlist">

      <li class="listitem">
        <p class="para">
          オブジェクト指向インターフェイス
        </p>
      </li>

      <li class="listitem">
        <p class="para">
          プリペアドステートメントのサポート
        </p>
      </li>

      <li class="listitem">
        <p class="para">
          複数のステートメント実行をサポート
        </p>
      </li>

      <li class="listitem">
        <p class="para">
          トランザクションのサポート
        </p>
      </li>

      <li class="listitem">
        <p class="para">
          強化されたデバッグ機能
        </p>
      </li>

    </ul>
  </p>

  <p class="para">
    オブジェクト指向インターフェイスと同時に、
    手続き型のインターフェイスも提供されています。
  </p>

  <p class="para">
    <code class="literal">mysqli</code> 拡張モジュールは、
    PHP の拡張モジュール用フレームワークを使って実装されています。
    ソースコードは <var class="filename">ext/mysqli</var> 以下にあります。
  </p>

  <p class="para">
    <code class="literal">mysqli</code> 拡張モジュールについての詳細は、
    <a href="book.mysqli.php" class="xref">MySQLi</a> を参照ください。
  </p>

  <p class="para" id="mysqli.overview.pdo">
    <strong>PDO とは何ですか?</strong>
  </p>

  <p class="para">
    PHP Data Objects, または PDO
    は、PHP アプリケーションのための、特別なデータベース抽象化レイヤです。
    PDO は、あなたのアプリケーションが接続するデータベースサーバーに関係なく、
    一貫した API を提供します。
    理屈の上では、PDO の API を使えば、
    たとえば Firebird から MySQL
    にデータベースサーバーを切り替えることができます。
    PHP コードに必要な変更は少なく済むでしょう。
  </p>

  <p class="para">
    データベース抽象化レイヤのその他の例としては、
    Java の JDBC や、Perl の DBI が挙げられます。
  </p>

  <p class="para">
    PDO には、綺麗で、簡潔で、
    移植可能な API であるという利点がある一方で、
    最新の MySQL サーバーで利用可能な高度な機能を全て利用できるとは限らない、
    という重要な欠点があります。
    たとえば、PDO は MySQL がサポートしている
    複数ステートメントの実行を許可していません。
  </p>

  <p class="para">
    PDO は、PHP の拡張モジュール用フレームワークを使って実装されています。
    ソースコードは <var class="filename">ext/pdo</var> 以下にあります。
  </p>

  <p class="para">
    PDO についての詳細は、
    <a href="book.pdo.php" class="xref">PDO</a> を参照ください。
  </p>

  <p class="para">
    <strong>PDO MYSQL ドライバ とは何ですか?</strong>
  </p>

  <p class="para">
    PDO MySQL ドライバ 自体は、
    少なくとも PHP プログラマから見ると API ではありません。
    実際には、
    PDO MySQL ドライバ は PDO の直下のレイヤにあって、
    MySQL 特有の機能を提供しているものです。
    プログラマは、PDO の API を呼ぶことは変わりませんが、
    PDO は MySQL サーバーと通信するために、
    PDO MySQL ドライバを使うのです。
  </p>

  <p class="para">
    PDO MySQL ドライバは、
    数ある PDO ドライバのうち、利用できるもののひとつです。
    他の PDO ドライバとして、Firebird と PostgreSQL
    データベースサーバーのものが含まれています。
  </p>

  <p class="para">
    PDO MySQL ドライバは、
    PHP の拡張モジュール用フレームワークを使って実装されています。
    ソースコードは <var class="filename">ext/pdo_mysql</var> 以下にありますが、
    その API は PHP プログラマには公開されていません。
  </p>

  <p class="para">
    PDO MySQL ドライバについての詳細は、
    <a href="ref.pdo-mysql.php" class="xref">MySQL PDO ドライバ</a> を参照ください。
  </p>

  <p class="para" id="mysqli.overview.mysqlnd">
    <strong>PHP の MySQL Native ドライバとは何ですか?</strong>
  </p>

  <p class="para">
    MySQL データベースサーバーと通信するために、
    <code class="literal">mysqli</code>
    と PDO MySQL ドライバは、
    それぞれ必須のプロトコルを実装している低レベルのライブラリを使っています。
    かつては、その低レベルのライブラリとして利用可能だったのは、
    <code class="literal">libmysqlclient</code>
    とも呼ばれている MySQL Client Library だけでした。
  </p>

  <p class="para">
    しかし、
    <code class="literal">libmysqlclient</code>
    が提供していたインターフェイスは、
    PHP アプリケーションとの通信に最適化されていませんでした。
    なぜなら、<code class="literal">libmysqlclient</code>
    は、C言語 で書かれたアプリケーションを念頭に置いていたからです。
    このため、PHP アプリケーションのための代替として、
    <code class="literal">libmysqlclient</code> の代わりに、
    MySQL Native ドライバ、<code class="literal">mysqlnd</code> が開発されたのです。
  </p>

  <p class="para">
    <code class="literal">mysqli</code> 拡張モジュール
    と PDO MySQL ドライバはそれぞれ、
    <code class="literal">libmysqlclient</code> や
    <code class="literal">mysqlnd</code> のいずれかを使って個別に設定できます。
    <code class="literal">mysqlnd</code> は、
    PHP システムと統合するために特別に設計されているため、
    <code class="literal">libmysqlclient</code> と比較して、
    大幅な省メモリ化や高速化が実現されています。
    これらの改善を利用することを強くお勧めします。
  </p>

  <p class="para">
    MySQL Native ドライバ は、
    PHP 拡張モジュール用フレームワークを使って実装されています。
    ソースコードは <var class="filename">ext/mysqlnd</var> 以下にありますが、
    その API は PHP プログラマには公開されていません。
  </p>



  <p class="para">
    <strong>機能の比較</strong>
  </p>

  <p class="para">
    以下の表は、PHP から MySQL に接続する主要な方法に関する、
    機能の比較を示しています:
  </p>

  <table id="mysqli.overview.option.comparison" class="doctable table">
   <caption><strong>PHP 向けの MySQL API の選択肢の比較</strong></caption>
    
      <col width="34*" />
      <col width="33*" />
      <col width="33*" />
      <thead>
        <tr>
          <th class="empty">&nbsp;</th>
          <th>PHP の mysqli 拡張モジュール</th>
          <th>PDO (PDO MySQL ドライバ と MySQL Native ドライバ を利用)</th>
        </tr>

      </thead>

      <tbody class="tbody">
        <tr>
          <td>PHP で実装されたバージョン</td>
          <td>5.0</td>
          <td>5.0</td>
        </tr>

        <tr>
          <td>MySQL での開発状況</td>
          <td>アクティブ</td>
          <td>アクティブ</td>
        </tr>

        <tr>
          <td>文字セットに関するAPI のサポート</td>
          <td>Yes</td>
          <td>Yes</td>
        </tr>

        <tr>
          <td>サーバー側でのプリペアドステートメントの API サポート</td>
          <td>Yes</td>
          <td>Yes</td>
        </tr>

        <tr>
          <td>クライアントサイドでのプリペアドステートメントの API サポート</td>
          <td>No</td>
          <td>Yes</td>
        </tr>

        <tr>
          <td>ストアドプロシージャの API のサポート</td>
          <td>Yes</td>
          <td>Yes</td>
        </tr>

        <tr>
          <td>複数ステートメントの API のサポート</td>
          <td>Yes</td>
          <td>Most</td>
        </tr>

        <tr>
          <td>MySQL 4.1以降の機能を全てサポートしているか</td>
          <td>Yes</td>
          <td>Most</td>
        </tr>

      </tbody>
    
  </table>


</div>
<?php manual_footer($setup); ?>