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

ナビゲーションに移動 検索に移動
222行目: 222行目:
<br>
<br>
==== ドライバオプション ====
==== ドライバオプション ====
よく使用されるドライバオプションとその値を、以下に示す。<br>
ドライバオプションとその値を以下に示す。<br>
<br>
<syntaxhighlight lang="php">
// ドライバオプションの使用例
$options = [
    // エラー発生時に例外をスロー
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    // フェッチモードをデフォルトで連想配列に設定
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    // プリペアドステートメントを有効化
    PDO::ATTR_EMULATE_PREPARES => false,
    // 持続的な接続を無効化
    PDO::ATTR_PERSISTENT => false,
    // カラム名を小文字に変換
    PDO::ATTR_CASE => PDO::CASE_LOWER
];
$db = new PDO(
    'mysql:host=localhost;dbname=sampledb;charset=utf8mb4',
    'root',
    'root',
    $options
);
</syntaxhighlight>
<br>
<br>
* PDO::ATTR_ERRMODE
* PDO::ATTR_ERRMODE
*: クエリの実行でエラーが起こった場合、どのように処理をするかを指定する。
*: エラーレポートの方法を設定するための属性である。
*: クエリの実行でエラーが起きた場合、どのように処理をするかを指定する。
*: 初期値は、<code>PDO::ERRMODE_SILENT</code>である。
*: 初期値は、<code>PDO::ERRMODE_SILENT</code>である。
** PDO::ERRMODE_EXCEPTION
** PDO::ERRMODE_EXCEPTION
**: 例外をスローする。
**: エラーが発生した時に例外 (PDOException例外クラス) をスローする。
**: エラーを例外としてキャッチできるようになり、デバッグが容易になる。
** PDO::ERRMODE_WARNING
** PDO::ERRMODE_WARNING
**: クエリの実行Lで発生したエラーをPHPのWarningとして報告する。
**: クエリの実行Lで発生したエラーをPHPのWarningとして報告する。
237行目: 267行目:
*: <br>
*: <br>
* PDO::ATTR_DEFAULT_FETCH_MODE
* PDO::ATTR_DEFAULT_FETCH_MODE
*: <code>PDOStatement::fetch</code>メソッドや<code>PDOStatement::fetchAll</code>メソッドで引数が省略された場合、または、
*: SELECT結果を連想配列で取得できる。
*: ステートメントが<code>foreach</code>文に直接かけられた場合のフェッチスタイルを設定する。
*: キーがカラム名になるため、データアクセスが直観的になる。
*: <br>
*: <code>PDOStatement::fetch</code>メソッドや<code>PDOStatement::fetchAll</code>メソッドで引数が省略された場合、
*: または、ステートメントが<code>foreach</code>文に直接かけられた場合のフェッチスタイルを設定する。
*: 初期値は、<code>PDO::FETCH_BOTH</code>である。
*: 初期値は、<code>PDO::FETCH_BOTH</code>である。
** PDO::FETCH_BOTH
** PDO::FETCH_BOTH
252行目: 285行目:
*: データベース側が持つプリペアドステートメント機能のエミュレーションをPDO側で行うかどうかを設定する。
*: データベース側が持つプリペアドステートメント機能のエミュレーションをPDO側で行うかどうかを設定する。
*: PHP 5.2以降の初期値は<code>true</code>である。
*: PHP 5.2以降の初期値は<code>true</code>である。
*: <br>
*: <code>false</code>の場合、ネイティブのプリペアドステートメントを使用する。
*: これは、SQLインジェクション対策として有効であり、また、クエリのパフォーマンスが向上する。
*: <br>
*: この設定は、いくつかPDOの挙動に違いが現れる。
*: この設定は、いくつかPDOの挙動に違いが現れる。
** プリペアドステートメントのためにデータベースと通信する必要が無くなるため、エミュレーションを行う方がパフォーマンスは向上する。
*: エミュレーションを行う場合、プリペアドステートメントのためにデータベースと通信する必要が無くなるため、パフォーマンスは向上する。
** 存在しないテーブル名やカラム名をクエリに持つプリペアドステートメントを発行する場合、<br>エミュレーションを行わない場合はすぐにエラーが発生するが、エミュレーションを行う場合はクエリを実行するまでエラーが発生するかどうかわからない。
*: 存在しないテーブル名 / カラム名をクエリに持つプリペアドステートメントを発行する場合、
*: エミュレーションを行わない場合は即エラーが発生するが、エミュレーションを行う場合はクエリを実行するまでエラーが発生するかどうかわからない。
** エミュレーションを行う場合のみ、<code>;</code>(セミコロン)区切りで複数のクエリを1つのクエリで実行することができる。
** エミュレーションを行う場合のみ、<code>;</code>(セミコロン)区切りで複数のクエリを1つのクエリで実行することができる。
*: <br>
*: <br>
* PDO::ATTR_PERSISTENT(コンストラクタでの指定のみ)
* PDO::ATTR_PERSISTENT (コンストラクタでの指定のみ)
*: <code>true</code>の場合、PHPスクリプトが終了してもデータベースへの接続を維持して、次回に再利用する。
*: <code>true</code>の場合、PHPスクリプトが終了してもデータベースへの接続を維持して、次回に再利用する。
*: 特に、大規模システムでは恩恵が大きい。
*: 特に、大規模システムでは恩恵が大きい。
*: <br>
*: <code>false</code>の場合は、持続的な接続を無効化する。
*: メモリ管理の観点から、通常は無効にすることを推奨する。
*: <br>
*: <br>
* PDO::MYSQL_ATTR_USE_BUFFERED_QUERY(MySQL専用)
* PDO::MYSQL_ATTR_USE_BUFFERED_QUERY(MySQL専用)
274行目: 315行目:
* PDO::MYSQL_ATTR_INIT_COMMAND(MySQL専用、コンストラクタでの指定のみ)
* PDO::MYSQL_ATTR_INIT_COMMAND(MySQL専用、コンストラクタでの指定のみ)
*: データベースに接続した直後に実行されるクエリをここに記述する。
*: データベースに接続した直後に実行されるクエリをここに記述する。
*: <br>
* PDO::ATTR_CASE
*: <code>PDO::CASE_LOWER</code>を指定する場合、カラム名を小文字に統一する。
*: そのため、一貫性のあるコーディングが可能になる。
<br>
<br>
  <syntaxhighlight lang="php">
  <syntaxhighlight lang="php">
334行目: 379行目:
<u>もし、データベースを動的に指定する場合、<code>set_error_handler</code>関数を使用して<code>ErrorException</code>に変換した後、例外処理を行う。</u><br>
<u>もし、データベースを動的に指定する場合、<code>set_error_handler</code>関数を使用して<code>ErrorException</code>に変換した後、例外処理を行う。</u><br>
<br>
<br>
==== 文字コードの設定 ====
==== 文字コードの設定 ====
<u>PDOでMySQLに接続する場合は、文字コードの設定 (例: charset=utf8mb4) を指定することを強く推奨する。</u><br>
<u>PDOでMySQLに接続する場合は、文字コードの設定 (例: charset=utf8mb4) を指定することを強く推奨する。</u><br>

案内メニュー