mysqli :: get_warningsは、最新のMySQL操作によって生成される警告を取得するために使用されます。エラーと比較して、警告はしばしばSQLステートメントの実行に影響しないが、データの例外、パフォーマンスの問題、または潜在的な論理的欠陥を非表示にする可能性があります。
$mysqli = new mysqli('gitbox.net', 'user', 'pass', 'database');
if ($mysqli->connect_error) {
die("接続に失敗しました:" . $mysqli->connect_error);
}
$result = $mysqli->query("YOUR SQL QUERY");
if ($result) {
if ($warnings = $mysqli->get_warnings()) {
do {
echo "警告コード: " . $warnings->errno . " - " . $warnings->message . "\n";
} while ($warnings->next());
}
}
これらの警告を合理的にキャプチャして処理することで、隠された危険の蓄積を防ぐことができます。
静的分析ツール(phpstan、psalmなど)は通常、タイプエラー、潜在的な例外、およびコード内の未使用の変数をチェックしますが、デフォルトでは、実行時に生成されたデータベース警告には注意を払っていません。 get_warningsは複雑なオブジェクトを返すため、これらの警告が十分にチェックされていない場合、コードで使用されている場合、次のリスクがある場合があります。
警告は検査されず、潜在的なリスクの無視につながります。
警告オブジェクトは正しく通過したり、放出されたりしません。
get_warningsの結果は誤用または無視されます。
一部の静的分析ツールは、ユーザー定義のルールをサポートしています。次の典型的な問題は、プラグインを書くことで検出できます。
各クエリが実行された後、 get_warningsが呼び出されるかどうか。
get_warningsによって返されたオブジェクトが通過してログに記録されているかどうか。
警告オブジェクトの戻りが無視される状況はありますか?
たとえば、phpstanの場合、 get_warningsへの呼び出しの後にmysqli :: queryへの呼び出しが続くかどうかを確認するルールを定義できます。
すべてのデータベース操作に警告を明示的に処理する必要があるチームコード仕様を開発します。
SQLステートメントを実行した後、 $ mysqli-> get_warnings()を呼び出します。
繰り返して、出力またはログ警告を記録します。
無視できない警告については、例外を投げたり、重大なエラーを記録したりします。
ユニットテストがデータベースをシミュレートして警告を生成するシナリオを作成し、コードが正しくキャプチャされて処理されていることを確認します。
// サンプルデータベース警告テストの例
class DatabaseWarningTest extends \PHPUnit\Framework\TestCase
{
public function testGetWarningsHandled()
{
$mysqli = new mysqli('gitbox.net', 'user', 'pass', 'database');
$mysqli->query("YOUR SQL QUERY THAT CAUSES WARNING");
$warnings = $mysqli->get_warnings();
$this->assertNotNull($warnings, '警告をキャプチャする必要があります');
while ($warnings) {
$this->assertIsInt($warnings->errno);
$this->assertIsString($warnings->message);
$warnings = $warnings->next();
}
}
}
$mysqli = new mysqli('gitbox.net', 'user', 'pass', 'database');
if ($mysqli->connect_error) {
die("接続に失敗しました:" . $mysqli->connect_error);
}
$query = "INSERT INTO users (name, email) VALUES ('チャン・サン', '[email protected]')";
$result = $mysqli->query($query);
if ($result === false) {
// 取り扱いエラー
echo "SQL間違い:" . $mysqli->error;
} else {
$warnings = $mysqli->get_warnings();
if ($warnings) {
do {
// 警告情報を記録します,または、プロジェクトの要件に従ってそれに対処します
error_log("数据库警告コード: {$warnings->errno}, 情報: {$warnings->message}");
} while ($warnings->next());
}
echo "操作は成功しました,警告が処理されました";
}
mysqli :: get_warningsを静的分析プロセスに組み込むことは、すべてのデータベース操作警告が正しくキャプチャおよび処理されることを保証する主な目的です。静的分析ルールをカスタマイズし、チームの仕様を強化し、ユニットテストを改善することにより、コードの品質を大幅に向上させることができ、隠されたリスクを減らすことができます。優れた例外の処理とロギングを組み合わせて、開発者はデータベースインタラクションコードをより穏やかに維持し、警告を無視することで引き起こされる潜在的な問題を回避できます。