現在の位置: ホーム> 最新記事一覧> PDO :: __は、例外とエラーをどのように処理しますか?コードをより堅牢にします

PDO :: __は、例外とエラーをどのように処理しますか?コードをより堅牢にします

gitbox 2025-09-04

1。PDOの紹介:: __構築方法

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> =&gt; 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> =&gt; 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>-&gt;</span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span></span>

この例では、DSN文字列を渡してMySQLデータベースに接続し、エラー処理モードを設定します。


2。エラー処理モード:例外に設定( pdo :: errmode_exception

デフォルトでは、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> =&gt; 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> =&gt; 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>-&gt;</span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span></span>

上記のコードでは、 pdo :: attr_errmode => pdo :: errmode_exceptionは、エラーが発生したときにPDOスローの例外をスローするように設定されています。例外をキャッチし、キャッチブロックでそれらを処理し、プログラムのクラッシュを防ぎ、有用なエラーメッセージを出力します。


3. 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>-&gt;</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>-&gt;</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>

4.一般的なデータベース接続エラーと取り扱い

エラー1:ユーザー名またはパスワードエラー

ユーザー名またはパスワードが正しくない場合、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>-&gt;</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>

エラー2:データベースは存在しません

指定したデータベースが存在しない場合、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>-&gt;</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>

エラー3:データベースサーバーは使用できません

データベースサーバーが利用できない場合、または接続がタイムアウトした場合、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>-&gt;</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