<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/book.pdo.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ja',
  ),
  'this' => 
  array (
    0 => 'pdo.connections.php',
    1 => '接続、および接続の管理',
    2 => '接続、および接続の管理',
  ),
  'up' => 
  array (
    0 => 'book.pdo.php',
    1 => 'PDO',
  ),
  'prev' => 
  array (
    0 => 'pdo.constants.fetch-modes.php',
    1 => 'フェッチモード',
  ),
  'next' => 
  array (
    0 => 'pdo.transactions.php',
    1 => 'トランザクションおよび自動コミット',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'reference/pdo/connections.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="pdo.connections" class="chapter">
  <h1 class="title">接続、および接続の管理</h1>

 <p class="para">
  PDO 基底クラスのインスタンスを作成することにより、接続が確立されます。
  どのドライバを使用するのかにかかわらず、常に PDO クラスを指定します。
  コンストラクタに渡す引数により、データソース (いわゆる DSN) の指定や
  (もしあれば、オプションで) ユーザー名およびパスワードの指定を行います。
 </p>
 <p class="para">
  <div class="example" id="example-1">
   <p><strong>例1 MySQL への接続</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$dbh </span><span style="color: #007700">= new </span><span style="color: #0000BB">PDO</span><span style="color: #007700">(</span><span style="color: #DD0000">'mysql:host=localhost;dbname=test'</span><span style="color: #007700">, </span><span style="color: #0000BB">$user</span><span style="color: #007700">, </span><span style="color: #0000BB">$pass</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div> 
   </div>

  </div>
 </p>
 <p class="para">
  接続時になんらかのエラーが発生した場合、<code class="literal">PDOException</code>
  オブジェクトがスローされます。エラー処理を行いたい場合はこの例外を
  キャッチします。あるいはこれを無視して、
  <span class="function"><a href="function.set-exception-handler.php" class="function">set_exception_handler()</a></span> で設定した
  グローバル例外ハンドラに処理を任せることもできます。
 </p>
 <p class="para">
  <div class="example" id="example-2"><p><strong>例2 接続エラーの処理</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">try {<br />    </span><span style="color: #0000BB">$dbh </span><span style="color: #007700">= new </span><span style="color: #0000BB">PDO</span><span style="color: #007700">(</span><span style="color: #DD0000">'mysql:host=localhost;dbname=test'</span><span style="color: #007700">, </span><span style="color: #0000BB">$user</span><span style="color: #007700">, </span><span style="color: #0000BB">$pass</span><span style="color: #007700">);<br />} catch (</span><span style="color: #0000BB">PDOException $e</span><span style="color: #007700">) {<br />    </span><span style="color: #FF8000">// たとえば、タイムアウトしたあとに再接続を試みます<br /></span><span style="color: #007700">}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <div class="warning"><strong class="warning">警告</strong>
  <p class="para">
   他の <a href="language.exceptions.php" class="link">例外</a> と同様に、
   <span class="classname"><a href="class.pdoexception.php" class="classname">PDOException</a></span> は <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a> を使って
   明示的にキャッチすることもできますし、
   <span class="function"><a href="function.set-exception-handler.php" class="function">set_exception_handler()</a></span> を使って暗黙的にキャッチすることもできます。
   そうしない場合、例外をキャッチしない場合のデフォルトの動作として
   <strong><code>E_FATAL_ERROR</code></strong> が発生します。
   この致命的なエラーはデータベース接続の詳細を含むバックトレースを含みます。
   このバックトレースを見れば、データベースへの接続の詳細がわかってしまいます。
   そのため、本番環境のサーバーでは、
   <var class="filename">php.ini</var> の <a href="errorfunc.configuration.php#ini.display-errors" class="link"><code class="literal">display_errors</code></a> を <code class="literal">0</code> に設定しておきましょう。
  </p>
 </div>
 <p class="para">
  データベースへの接続に成功すると、PDO クラスのインスタンスが
  スクリプトに返されます。この PDO オブジェクトが存在する間、
  接続がアクティブであり続けます。接続を閉じるには、他から
  参照されていないことを保障することでオブジェクトを破棄する
  必要があります。それには、オブジェクトを保持している変数に対して
  <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> を代入します。
  明示的にこれを行わなかった場合は、スクリプトの終了時に自動的に
  接続が閉じられます。
 </p>
 <blockquote class="note"><p><strong class="note">注意</strong>: 
  <span class="simpara">
   この PDO インスタンスへの参照
   (PDOStatement インスタンスからの参照や、同じ PDO インスタンスを参照する別の変数からの参照など)
   が他にも残っているなら、それらもあわせて削除する必要があります
   (PDOStatement を参照する変数に <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> を代入するなど)。
  </span>
 </p></blockquote>
 <p class="para">
  <div class="example" id="example-3">
   <p><strong>例3 接続を閉じる</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$dbh </span><span style="color: #007700">= new </span><span style="color: #0000BB">PDO</span><span style="color: #007700">(</span><span style="color: #DD0000">'mysql:host=localhost;dbname=test'</span><span style="color: #007700">, </span><span style="color: #0000BB">$user</span><span style="color: #007700">, </span><span style="color: #0000BB">$pass</span><span style="color: #007700">);<br /></span><span style="color: #FF8000">// ここで接続を使用します<br /></span><span style="color: #0000BB">$sth </span><span style="color: #007700">= </span><span style="color: #0000BB">$dbh</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">query</span><span style="color: #007700">(</span><span style="color: #DD0000">'SELECT * FROM foo'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// 使用を終了したので、閉じます<br /></span><span style="color: #0000BB">$sth </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$dbh </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  データベースサーバーへの持続的な接続による恩恵をこうむる web
  アプリケーションは多いでしょう。持続的な接続は、スクリプトが
  終了しても閉じられずにキャッシュされ、他のスクリプトが同じ内容の
  接続を要求してきた際にそれが再利用されます。持続的接続の
  キャッシュにより、スクリプトがデータベースを使用するたびに
  新しい接続を確立するオーバーヘッドを避けることができます。
  それにより、結果として web アプリケーションを高速化できるように
  なります。
 </p>
 <p class="para">
  <div class="example" id="example-4">
   <p><strong>例4 持続的な接続</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$dbh </span><span style="color: #007700">= new </span><span style="color: #0000BB">PDO</span><span style="color: #007700">(</span><span style="color: #DD0000">'mysql:host=localhost;dbname=test'</span><span style="color: #007700">, </span><span style="color: #0000BB">$user</span><span style="color: #007700">, </span><span style="color: #0000BB">$pass</span><span style="color: #007700">, array(<br />    </span><span style="color: #0000BB">PDO</span><span style="color: #007700">::</span><span style="color: #0000BB">ATTR_PERSISTENT </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">true<br /></span><span style="color: #007700">));<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  <strong><code><a href="pdo.constants.php#pdo.constants.attr-persistent">PDO::ATTR_PERSISTENT</a></code></strong> オプションの値は、
  数値でない <span class="type"><a href="language.types.string.php" class="type string">string</a></span> の値が設定されない限り、(持続的な接続が有効/無効かを示す)
  <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span> に変換されます。
  数値でない <span class="type"><a href="language.types.string.php" class="type string">string</a></span> を設定する場合、複数の接続プールを使うことができます。
  これは互換性がない異なる接続設定を使う場合に便利です。たとえば、
  異なる <strong><code><a href="ref.pdo-mysql.php#pdo.constants.mysql-attr-use-buffered-query">PDO::MYSQL_ATTR_USE_BUFFERED_QUERY</a></code></strong> の値を設定する場合が挙げられます。
 </p>
 <blockquote class="note"><p><strong class="note">注意</strong>: 
  <p class="para">
   持続的な接続を使用したい場合は、ドライバのオプションを表す配列に
   <strong><code><a href="pdo.constants.php#pdo.constants.attr-persistent">PDO::ATTR_PERSISTENT</a></code></strong> を設定して
   PDO のコンストラクタに渡す必要があります。この属性を
   <span class="methodname"><a href="pdo.setattribute.php" class="methodname">PDO::setAttribute()</a></span>
   を用いてインスタンス作成後に設定した場合は、
   そのドライバは持続的な接続を使用しません。
  </p>
 </p></blockquote>
 <div class="warning"><strong class="warning">警告</strong>
  <p class="para">
   PDO は、持続的接続のクリーンアップを一切行いません。
   一時テーブル、ロック、トランザクション、その他の状態依存の変更が、
   接続の以前の使用から残存し、予期せぬ問題を引き起こす可能性があります。
   詳細については、
   <a href="features.persistent-connections.php" class="link">持続的データベース接続</a>
   を参照ください。
  </p>
 </div>
 <blockquote class="note"><p><strong class="note">注意</strong>: 
  <p class="para">
   PDO ODBC ドライバを使用しており、ODBC ライブラリが ODBC
   接続プーリングをサポートしている場合 (unixODBC および Windows
   はこれをサポートしています。他にもあるかもしれません) は、
   PDO の持続的接続を使用せずに ODBC の接続プーリングに
   接続キャッシュ処理を任せることを推奨します。
   ODBC の接続プールは、プロセス内で他のモジュールと共有されています。
   PDO が接続をキャッシュしてしまうと、その接続は ODBC の
   接続プールに返されなくなり、他のモジュールによって新たな接続が
   作成されてしまうようになります。
  </p>
 </p></blockquote>
</div>
<?php manual_footer($setup); ?>