データベース操作にPHPのMySQLI拡張機能を使用する場合、通常、クエリが成功したかどうか、エラーがスローされているかどうかに注意してください。これらの警告が具体的に対処されていない場合、フィールドトランケーション、デフォルト値が置き換えられるなどの潜在的な問題を隠す可能性があります。この記事では、 MySqli :: Query()とMySqli :: get_Warnings()を組み合わせて使用する方法を共有して、これらの警告をキャプチャし、ベストプラクティスを提供します。
このようなSQLを検討してください。
$sql = "INSERT INTO users (username, email) VALUES ('this_is_a_very_long_username_that_will_be_truncated', '[email protected]')";
ユーザー名フィールドの最大長が30文字であると仮定すると、上記のSQLの実際の実行が切り捨てられます。エラーはスローされませんが、警告が生成されます。私たちがそれを無視すると、データはあなたがそれを知らずに静かに「処理」されます。
mysqli :: get_warnings()は、以前の操作からSQL警告情報を取得するために使用される方法です。デバッグまたはログに使用できる警告レベル、コード、およびメッセージを含むオブジェクトを返します。
まず、基本的な使用法を理解するための最小限の例を見てみましょう。
<?php
$mysqli = new mysqli("localhost", "user", "password", "test");
if ($mysqli->connect_error) {
die("接続に失敗しました: " . $mysqli->connect_error);
}
$sql = "INSERT INTO demo (name) VALUES ('長い文字列トリガー警告エクストラロングストリングトリガー警告エクストラロングストリングトリガー警告')";
if ($mysqli->query($sql)) {
echo "正常に挿入します\n";
// 警告を確認してください
$warning = $mysqli->get_warnings();
while ($warning) {
echo "警告: [{$warning->errno}] {$warning->message}\n";
$warning = $warning->next();
}
} else {
echo "クエリに失敗しました: " . $mysqli->error;
}
$mysqli->close();
実際のプロジェクトでは、ユーザーに直接警告を出力することは推奨されませんが、ログに記録することをお勧めします。例えば:
function log_warnings($mysqli) {
$warning = $mysqli->get_warnings();
while ($warning) {
error_log("SQL Warning [{$warning->errno}]: {$warning->message}");
$warning = $warning->next();
}
}
$sql = "UPDATE users SET username='過度に長い名前が遮断されます' WHERE id=1";
if ($mysqli->query($sql)) {
log_warnings($mysqli);
} else {
error_log("SQL Error: " . $mysqli->error);
}
ログにログインすると、後で問題をトラブルシューティングするだけでなく、テスト環境のSQL品質に関するフィードバックも提供します。
get_warnings()は、最後のクエリに対してのみ機能します。
next()によって横断されるリンクリストに似たオブジェクトを返します。
すべてのドライバーが警告を完全にサポートするわけではなく、データベース構成を使用する前にテストする必要があります。
mysqli_report()はget_warnings()を置き換えることができません。前者はエラーにより多くの注意を払っています。
ステートメントを準備(準備)して、バインディングパラメーターの場合のようにトリガーして警告を取得します。
生産の警告をまとめて定期的に報告することをお勧めします。これは、データベースアシスタントクラスをカプセル化することで実行できます。
class DB {
protected $mysqli;
public function __construct() {
$this->mysqli = new mysqli("localhost", "user", "password", "appdb");
}
public function query($sql) {
$result = $this->mysqli->query($sql);
if ($result) {
$this->logWarnings();
} else {
error_log("SQL Error: " . $this->mysqli->error);
}
return $result;
}
protected function logWarnings() {
$warning = $this->mysqli->get_warnings();
while ($warning) {
error_log("[DB警告] {$warning->errno} - {$warning->message}");
$warning = $warning->next();
}
}
}
$db = new DB();
$db->query("UPDATE posts SET title='タイトルが長すぎると警告がトリガーされます,長さの制御に注意してください' WHERE id=42");
mysqli :: query()はSQLを実行するための強力なツールであり、 MySqli :: get_warnings()はデータの整合性を確保するための重要なサプリメントです。これらの警告メッセージを無視しないでください、彼らはしばしばあなたの将来のバグを隠します。開発またはテスト環境で警告をキャプチャして処理する習慣を開発することで、プロジェクトの堅牢性と保守性が大幅に向上します。
覚えておいてください:エラーがプログラムを失敗させると、警告がトラップを失うことになります。