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

ナビゲーションに移動 検索に移動
129行目: 129行目:
コンストラクタには、データソース(DSN)、ユーザ名、パスワードを指定する。<br>
コンストラクタには、データソース(DSN)、ユーザ名、パスワードを指定する。<br>
<br>
<br>
==== MySQLへの接続 ====
==== データベースへの接続 ====
データベース接続時になんらかのエラーが発生した場合、<code>PDOException</code>クラスがスローされる。<br>
データベース接続時になんらかのエラーが発生した場合、<code>PDOException</code>クラスがスローされる。<br>
エラー処理を行う場合はこの例外をキャッチする。<br>
エラー処理を行う場合はこの例外をキャッチする。<br>
146行目: 146行目:
<u>PDOのインスタンスへの参照(<code>PDOStatement</code>クラスのインスタンスからの参照や別のPDOのインスタンスからの参照等)が残っている場合、</u><br>
<u>PDOのインスタンスへの参照(<code>PDOStatement</code>クラスのインスタンスからの参照や別のPDOのインスタンスからの参照等)が残っている場合、</u><br>
<u>それらも併せて削除する必要がある。(<code>PDOStatement</code>クラスのインスタンスに<code>null</code>を代入する等)</u><br>
<u>それらも併せて削除する必要がある。(<code>PDOStatement</code>クラスのインスタンスに<code>null</code>を代入する等)</u><br>
<br>
以下に、データベースへの接続を行う時のPDOのインスタンスの生成手順を記載する。<br>
<syntaxhighlight lang="php">
$<PDOクラスのインスタンス名> = new PDO(<データソース名>, <データベースユーザ名>, <パスワード>, <ドライバオプション>);
</syntaxhighlight>
<br>
* データソース名
*: データベースに接続するために必要な情報です. (Data Source Name)
*: PHP Manualに各データベースに応じたDSNの記述方法が掲載されている。
*: 以下の例は、MySQLにおけるデータソース名の記述方法である。
*: <code>mysql:dbname=<データベース名>;host=<ホスト名またはIPアドレス>;charset=<例: utf8mb4等></code>
*: 先頭にデータベースの種類を指定して、<code>:</code>(コロン)で区切る。
*: 各項目は、<code>項目名=値</code>として、<code>;</code>(セミコロン)で区切る。
*: <br>
** dbname
**: データベース名を指定する。(基本的には必須であるが、後で<code>USE <データベース名>;</code>とクエリを実行する場合は省略できる)
**: <br>
** host
**: ホスト名またはIPアドレスを指定する。
**: (ローカル環境のみで実行する場合、省略しても問題ない場合がある)
**: Linuxでは、ホスト名を指定することが推奨される。
**: http://qiita.com/mpyw/items/b00b72c5c95aac573b71#comment-e9db50fff9bffa1dd6f8
**: Windowsでは、IPアドレスを指定することが推奨される。
**: http://www.ah-2.com/2012/01/28/win_localhost_slow.html
**: <br>
** charset
**: 文字コードを指定する。
**: 文字コードは、ここで指定する。(<code>SET NAMES</code>は使用しないこと)
**: <u>UTF-8を指定する場合、<code>utf8</code>であることに注意すること。</u>
**: <u>MySQL5.5.3以降を使用する場合、4バイトからなる絵文字等も取り扱える<code>utf8mb4</code>を使用することを強く推奨する。</u>
**: <br>
* データベースユーザ名
*: データベースのユーザ名を指定する。
*: <br>
* パスワード
*: データベースユーザのパスワードを指定する。
*: <br>
* ドライバオプション
*: 接続時のオプションを連想配列で渡す。
*: キーは予め用意されている定数を使用する。
*: 値は予め用意されている定数以外に、論理値や文字列等の一般的な値でもよい。
<br>
以下に、よく使用されるドライバオプションとその値を示す。<br>
* PDO::ATTR_ERRMODE
*: SQL実行でエラーが起こった際にどう処理するかを指定します.デフォルトは PDO::ERRMODE_SILENT です.
** PDO::ERRMODE_EXCEPTION
**: 例外をスローする。
* PDO::ERRMODE_WARNING
*: SQLで発生したエラーをPHPのWarningとして報告する。
*: PDOStatement::executeメソッドの戻り値がfalseかどうかを毎回確認する必要がある。
** PDO::ERRMODE_SILENT
**: 何も報告しない。
**: PDOStatement::executeメソッドの戻り値がfalseかどうかを毎回確認する必要がある。
*: <br>
* PDO::ATTR_DEFAULT_FETCH_MODE
*: PDOStatement::fetchメソッドやPDOStatement::fetchAllメソッドで引数が省略された場合、または、
*: ステートメントがforeach文に直接かけられた場合のフェッチスタイルを設定する。
*: 初期値は、PDO::FETCH_BOTHである。
** PDO::FETCH_BOTH
**: カラム番号とカラム名の両方をキーとする連想配列で取得する。
** PDO::FETCH_NUM
**: カラム番号をキーとする配列で取得する。
** PDO::FETCH_ASSOC
**: カラム名をキーとする連想配列で取得する。この設定が最も使用される。
** PDO::FETCH_OBJ
**: カラム名をプロパティとする基本オブジェクトで取得する。
*: <br>
* PDO::ATTR_EMULATE_PREPARES
*: データベース側が持つプリペアドステートメント機能のエミュレーションをPDO側で行うかどうかを設定する。
*: PHP 5.2以降の初期値は<code>true</code>である。
*: この設定は、いくつかPDOの挙動に違いが現れる。
** プリペアドステートメントのためにデータベースと通信する必要が無くなるため、エミュレーションを行う方がパフォーマンスは向上する。
** 存在しないテーブル名やカラム名をクエリに持つプリペアドステートメントを発行する場合、<br>エミュレーションを行わない場合はすぐにエラーが発生するが、エミュレーションを行う場合はクエリを実行するまでエラーが発生するかどうかわからない。
** エミュレーションを行う場合のみ、<code>;</code>(セミコロン)区切りで複数のクエリを1つのクエリで実行することができる。
*: <br>
* PDO::ATTR_PERSISTENT(コンストラクタでの指定のみ)
*: <code>true</code>の場合、PHPスクリプトが終了してもデータベースへの接続を維持して、次回に再利用する。
*: 特に、大規模システムでは恩恵が大きい。
*: <br>
* PDO::MYSQL_ATTR_USE_BUFFERED_QUERY(MySQL専用)
*: <code>true</code>の場合、バッファクエリを使用する。初期値はMySQLの各バージョンによって異なる。
** バッファクエリ
**: 全ての情報をデータベースサーバから取得してきておいて,PHPに1件ずつ取り出させる
** 非バッファクエリ:
**: 1件ごとにデータベースサーバと通信を行って,PHPに取り出させる
*: 取得してくる情報がメモリに収まりきらない莫大なデータ量といった特殊なケースを除けば、バッファクエリを選択した方がよい。
*: バッファクエリを設定すると、サーバ負荷も軽減されて、途中までフェッチしたところで突然例外が発生するような事態も避けられる。
*: 非バッファクエリは、データベースから取得したデータを、コマンドラインからバッチ処理を実行する用途で使用されるが、
*: 複数同時にクエリを実行できない等の大きな欠点もある。
*: <br>
* PDO::MYSQL_ATTR_INIT_COMMAND(MySQL専用、コンストラクタでの指定のみ)
*: データベースに接続した直後に実行されるクエリをここに記述する。
<br>
  <syntaxhighlight lang="php">
  <syntaxhighlight lang="php">
  <?php
  <?php
165行目: 258行目:
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
==== データベースの接続を閉じる ====
==== データベースの接続を閉じる ====
データベースの接続は、PHPスクリプトが終了しても閉じられずにキャッシュされ、他のPHPスクリプトが同じ内容の接続を要求する時に再利用される。<br>
データベースの接続は、PHPスクリプトが終了しても閉じられずにキャッシュされ、他のPHPスクリプトが同じ内容の接続を要求する時に再利用される。<br>

案内メニュー