mysqli :: get_warningsは、 SQLステートメントを実行するときにすべての警告を含むmysqli_warningオブジェクトのチェーンを返します。この関数を使用して、データの切り捨て、データ型の不一致、インデックス障害などの非致命的な問題をキャプチャして、後続の処理を容易にします。
ただし、この方法を直接呼び出すことは面倒であり、返されたリンクされたリスト構造を通過する必要があります。クラスメソッドにカプセル化した後、呼び出しプロセスを簡素化し、警告情報を均一に処理できます。
公開方法を追加して、データベースドライバークラスで警告情報を取得します。
このメソッドはMySqli :: get_Warningsを呼び出し、警告リストを反復し、すべての警告を配列または文字列に並べ替えます。
簡単にロギングまたは表示するためのフォーマット出力を提供します。
この方法は、潜在的な問題をキャプチャするためにSQL操作を実行した後、積極的に呼ばれます。
<?php
class DatabaseDriver
{
/** @var mysqli */
protected $mysqli;
public function __construct($host, $user, $password, $dbname, $port = 3306)
{
$this->mysqli = new mysqli($host, $user, $password, $dbname, $port);
if ($this->mysqli->connect_errno) {
throw new Exception("Connect failed: " . $this->mysqli->connect_error);
}
}
/**
* 埋め込む SQL クエリ
*
* @param string $sql
* @return mysqli_result|bool
*/
public function query(string $sql)
{
$result = $this->mysqli->query($sql);
// クエリ后可以检查警告
$warnings = $this->getWarnings();
if (!empty($warnings)) {
// ここでロギングまたは例外処理を行うことができます
foreach ($warnings as $warning) {
error_log("MySQL Warning [{$warning['errno']}]: {$warning['message']} (SQLSTATE: {$warning['sqlstate']})");
}
}
return $result;
}
/**
* 現在の接続のすべての警告メッセージを取得します
*
* @return array 警告メッセージ配列,各要素には含まれます errno, sqlstate, message
*/
public function getWarnings(): array
{
$warnings = [];
$warning = $this->mysqli->get_warnings();
while ($warning) {
$warnings[] = [
'errno' => $warning->errno,
'sqlstate' => $warning->sqlstate,
'message' => $warning->message,
];
$warning = $warning->next;
}
return $warnings;
}
public function close()
{
$this->mysqli->close();
}
}
// 使用の例
$db = new DatabaseDriver('localhost', 'root', 'password', 'testdb');
$db->query("INSERT INTO users (id, name) VALUES (1, 'Alice')");
$db->close();
get_warningsは、現在の接続の警告を返し、クリーニングまたは使用されていない場合は古い警告を繰り返し読むことがあります。通常、各ステートメントが実行された後、または必要に応じて警告を読んでクリーニングできます。MySqli :: Clear_Warnings() (PHP 8.1+でサポート)を呼び出して、後続の操作との干渉を防ぐために警告チェーンをクリアすることができます。
カプセル化の配列に警告情報を返すことをお勧めします。呼び出しレイヤーは、ニーズに応じてログを記録するか、例外をスローするかを決定できます。これにより、柔軟性が向上します。
一部の初期のPHPバージョンには、 get_warningsを不完全なサポートがあります。バージョンの互換性をカプセル化するときは、バージョンのチェックを使用して、他のエラー処理方法に戻るために使用する必要があります。
データベースドライバークラスのMySQLI :: get_warningsのカプセル化は、コードの再利用性を向上させるだけでなく、潜在的なSQL実行問題のキャプチャと処理を促進します。合理的なカプセル化と呼び出しにより、システムの堅牢性とデバッグ機能を大幅に強化できます。
データベースドライバーのクラスを設計または維持している場合は、警告キャプチャメカニズムを含めてログまたは例外メカニズムを組み合わせて、データベース操作をより透明で安全にすることを強くお勧めします。