「PHPとデータベース - PDO」の版間の差分

ナビゲーションに移動 検索に移動
132行目: 132行目:
<br><br>
<br><br>


== データベースの接続と管理 ==
== データベースの接続 ==
PDOクラスのインスタンスを作成することにより、接続が確立される。<br>
PDOクラスのインスタンスを作成することにより、接続が確立される。<br>
コンストラクタには、データソース(DSN)、ユーザ名、パスワードを指定する。<br>
コンストラクタには、データソース(DSN)、ユーザ名、パスワードを指定する。<br>
<br>
<br>
==== データベースへの接続 ====
データベース接続時になんらかのエラーが発生した場合、<code>PDOException</code>クラスがスローされる。<br>
データベース接続時になんらかのエラーが発生した場合、<code>PDOException</code>クラスがスローされる。<br>
エラー処理を行う場合はこの例外をキャッチする。<br>
エラー処理を行う場合はこの例外をキャッチする。<br>
159行目: 158行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
* データソース名
* データソース名(Data Source Name)
*: データベースに接続するために必要な情報です. (Data Source Name)
*: データベースに接続するために必要な情報。
*: PHP Manualに各データベースに応じたDSNの記述方法が掲載されている。
*: PHP Manualに各データベースに応じたDSNの記述方法が掲載されている。
*: 以下の例は、MySQLにおけるデータソース名の記述方法である。
*: <code>mysql:dbname=<データベース名>;host=<ホスト名またはIPアドレス>;charset=<例: utf8mb4等></code>
*: 先頭にデータベースの種類を指定して、<code>:</code>(コロン)で区切る。
*: 先頭にデータベースの種類を指定して、<code>:</code>(コロン)で区切る。
*: 各項目は、<code>項目名=値</code>として、<code>;</code>(セミコロン)で区切る。
*: 各項目は、<code>項目名=値</code>として、<code>;</code>(セミコロン)で区切る。
*: <br>
*: 以下の例は、MySQLにおけるデータソース名の記述方法である。(ポート番号は省略可能)
*: <code>mysql:dbname=<データベース名>;host=<ホスト名またはIPアドレス>:port=<ポート番号>;charset=<文字コード></code>
*: 例. <code>mysql:dbname=SampleDB;host=localhost:port=3306;charset=utf8mb4</code>
*: <br>
*: <br>
** dbname
** dbname
251行目: 252行目:
     try
     try
     {
     {
       $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass,  
       $dbh = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', $user, $pass,  
                       [
                       [
                         PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                         PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
273行目: 274行目:
  ?>
  ?>
   
   
  // Webブラウザにこれから表示するものがUTF-8で書かれたHTMLであることを伝える
  // Webブラウザにheader関数以降に表示するHTMLがUTF-8で記述されていることを認識させる
  // (これか <meta charset="utf-8"> の最低限どちらか1つがあればいい. 両方あっても良い.)
  // または、header関数の代わりに<meta charset="utf-8">を記述する
// 両方記述してもよい
  header('Content-Type: text/html; charset=utf-8');
  header('Content-Type: text/html; charset=utf-8');
   
   
292行目: 294行目:
<u>データベースに接続できない場合等は、Warningが発生する。</u><br>
<u>データベースに接続できない場合等は、Warningが発生する。</u><br>
<u>もし、データベースを動的に指定する場合、<code>set_error_handler</code>関数を使用して<code>ErrorException</code>に変換した後、例外処理を行う。</u><br>
<u>もし、データベースを動的に指定する場合、<code>set_error_handler</code>関数を使用して<code>ErrorException</code>に変換した後、例外処理を行う。</u><br>
<br>
<br><br>


==== データベースの接続を閉じる ====
== データベースの持続的な接続 ==
データベースの接続は、PHPスクリプトが終了しても閉じられずにキャッシュされ、他のPHPスクリプトが同じ内容の接続を要求する時に再利用される。<br>
このキャッシュにより、新しい接続を確立するオーバーヘッドを避けることができるため、Webアプリケーションを高速化できるようになる。<br>
<syntaxhighlight lang="php">
<?php
    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
   
    $sth = $dbh->query('SELECT * FROM foo');
    // 使用を終了したので、閉じます
    $sth = null;
    $dbh = null;
?>
</syntaxhighlight>
<br>
==== 持続的な接続 ====
<code>PDO::ATTR_PERSISTENT</code>オプションの値は、string型の値が設定されない限り、bool型(持続的な接続の有無を示す)に変換される。<br>
<code>PDO::ATTR_PERSISTENT</code>オプションの値は、string型の値が設定されない限り、bool型(持続的な接続の有無を示す)に変換される。<br>
string型の値を設定する場合、複数の接続プールを使用することができる。<br>
string型の値を設定する場合、複数の接続プールを使用することができる。<br>
329行目: 316行目:
  <?php
  <?php
     $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(PDO::ATTR_PERSISTENT => true));
     $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(PDO::ATTR_PERSISTENT => true));
?>
</syntaxhighlight>
<br><br>
== データベースの切断 ==
データベースの接続は、PHPスクリプトが終了しても閉じられずにキャッシュされ、他のPHPスクリプトが同じ内容の接続を要求する時に再利用される。<br>
このキャッシュにより、新しい接続を確立するオーバーヘッドを避けることができるため、Webアプリケーションを高速化できるようになる。<br>
<syntaxhighlight lang="php">
<?php
    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
   
    $sth = $dbh->query('SELECT * FROM foo');
    // 使用を終了したので、閉じます
    $sth = null;
    $dbh = null;
  ?>
  ?>
  </syntaxhighlight>
  </syntaxhighlight>

案内メニュー