12,964
回編集
222行目: | 222行目: | ||
<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結果を連想配列で取得できる。 | ||
*: | *: キーがカラム名になるため、データアクセスが直観的になる。 | ||
*: <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の挙動に違いが現れる。 | ||
** | *: エミュレーションを行う場合、プリペアドステートメントのためにデータベースと通信する必要が無くなるため、パフォーマンスは向上する。 | ||
* | *: 存在しないテーブル名 / カラム名をクエリに持つプリペアドステートメントを発行する場合、 | ||
*: エミュレーションを行わない場合は即エラーが発生するが、エミュレーションを行う場合はクエリを実行するまでエラーが発生するかどうかわからない。 | |||
** エミュレーションを行う場合のみ、<code>;</code>(セミコロン)区切りで複数のクエリを1つのクエリで実行することができる。 | ** エミュレーションを行う場合のみ、<code>;</code>(セミコロン)区切りで複数のクエリを1つのクエリで実行することができる。 | ||
*: <br> | *: <br> | ||
* PDO:: | * 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> |