PDOクラスは、データベースへの接続を作成するために使用されるコンストラクター__constructを提供します。このコンストラクターを使用する場合、次のパラメーターを渡す必要があります。
DSN (データソース名):データベースタイプ、ホスト名、データベース名などの接続情報を含む文字列。
ユーザー名:データベースユーザー名。
パスワード:データベースパスワード。
オプション(オプション):PDOは、エラーモードの設定、文字セットなど、いくつかの構成オプションを提供します。
例えば:
<span><span><span class="hljs-variable">$dsn</span></span><span> = </span><span><span class="hljs-string">'mysql:host=localhost;dbname=testdb'</span></span><span>;
</span><span><span class="hljs-variable">$username</span></span><span> = </span><span><span class="hljs-string">'root'</span></span><span>;
</span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">''</span></span><span>;
</span><span><span class="hljs-variable">$options</span></span><span> = [
PDO::</span><span><span class="hljs-variable constant_">ATTR_ERRMODE</span></span><span> => PDO::</span><span><span class="hljs-variable constant_">ERRMODE_EXCEPTION</span></span><span>, </span><span><span class="hljs-comment">// エラー処理モードを例外に設定します</span></span><span>
PDO::</span><span><span class="hljs-variable constant_">ATTR_DEFAULT_FETCH_MODE</span></span><span> => PDO::</span><span><span class="hljs-variable constant_">FETCH_ASSOC</span></span><span>, </span><span><span class="hljs-comment">// データを取得するデフォルトの方法を設定します</span></span><span>
];
</span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-variable">$dsn</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$options</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (PDOException </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'Connection failed: '</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span></span>
この例では、DSN文字列を渡してMySQLデータベースに接続し、エラー処理モードを設定します。
デフォルトでは、PDOのエラー処理モードはPDO :: errmode_silentです。これは、例外がスローされないことを意味しますが、エラーコードが返されます。したがって、エラーが発生した場合、プログラムは自動的に例外をスローしません。エラーコードを明示的に確認して処理を行う必要があります。これにより、潜在的なエラーが無視される可能性があり、トラブルシューティングが困難になります。
コードをより堅牢にするには、エラー処理モードをPDO :: errmode_exceptionに設定することをお勧めします。これにより、トライキャッチ構造を介して例外をキャッチおよび処理できます。
<span><span><span class="hljs-variable">$options</span></span><span> = [
PDO::</span><span><span class="hljs-variable constant_">ATTR_ERRMODE</span></span><span> => PDO::</span><span><span class="hljs-variable constant_">ERRMODE_EXCEPTION</span></span><span>, </span><span><span class="hljs-comment">// 例外をスローするように設定します</span></span><span>
PDO::</span><span><span class="hljs-variable constant_">ATTR_DEFAULT_FETCH_MODE</span></span><span> => PDO::</span><span><span class="hljs-variable constant_">FETCH_ASSOC</span></span><span>,
];
</span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-variable">$dsn</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$options</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (PDOException </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'Connection failed: '</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span></span>
上記のコードでは、 pdo :: attr_errmode => pdo :: errmode_exceptionは、エラーが発生したときにPDOスローの例外をスローするように設定されています。例外をキャッチし、キャッチブロックでそれらを処理し、プログラムのクラッシュを防ぎ、有用なエラーメッセージを出力します。
PDO :: ERRMODE_EXCEPTIONは、データベース操作で例外が発生したときにPDOException例外が自動的にスローされます。これらの例外をTry-Catchステートメントでキャッチできます。
<span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-variable">$dsn</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$options</span></span><span>);
</span><span><span class="hljs-comment">// データベース操作を実行します</span></span><span>
} </span><span><span class="hljs-keyword">catch</span></span><span> (PDOException </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'データベース接続エラー: '</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span></span>
Catchステートメントでは、 $ e-> getMessage()を使用して例外の詳細を取得します。これは、デバッグとロギングに非常に重要です。
インターフェイスにエラーメッセージの表示に加えて、後続の分析とトラブルシューティングのために、ログに例外情報を記録することをお勧めします。 PHPのERROR_LOG()関数を使用したり、Monologなどのログライブラリを統合してこの情報を記録できます。
<span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-variable">$dsn</span></span><span>, </span><span><span class="hljs-variable">$username</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$options</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (PDOException </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-string">'データベース接続エラー: '</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>());
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'データベース接続に失敗しました,後でもう一度やり直してください!'</span></span><span>;
}
</span></span>
ユーザー名またはパスワードが正しくない場合、PDOはPDOException例外をスローし、エラーメッセージには通常、拒否されたアクセスが含まれます。
<span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=localhost;dbname=testdb'</span></span><span>, </span><span><span class="hljs-string">'invalid_user'</span></span><span>, </span><span><span class="hljs-string">'wrong_password'</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (PDOException </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'データベース接続エラー: '</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>(); </span><span><span class="hljs-comment">// 出力“Access denied”間違い</span></span><span>
}
</span></span>
指定したデータベースが存在しない場合、PDOは不明なデータベース「testDB」のようなエラーをスローします。
<span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=localhost;dbname=nonexistent_db'</span></span><span>, </span><span><span class="hljs-string">'root'</span></span><span>, </span><span><span class="hljs-string">''</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (PDOException </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'データベース接続エラー: '</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>(); </span><span><span class="hljs-comment">// 出力“Unknown database”間違い</span></span><span>
}
</span></span>
データベースサーバーが利用できない場合、または接続がタイムアウトした場合、PDOは接続関連の例外をスローします。
<span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=nonexistent_host;dbname=testdb'</span></span><span>, </span><span><span class="hljs-string">'root'</span></span><span>, </span><span><span class="hljs-string">''</span></span><span>);
} </span><span><span class="hljs-keyword">catch</span></span><span> (PDOException </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'データベース接続エラー: '</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>(); </span><span><span class="hljs-comment">// 出力“Could not find driver”または“Connection timed out”</span></span><span>
}
</span></span>
関連タグ:
PDO