PHPでは、 MySQLI拡張機能はMySQLデータベースを操作するための豊富なインターフェイスを提供します。MySQLI :: get_Warnings関数を使用して、最新のデータベース操作によって生成された警告情報を取得します。この関数はMySQL 5.6以降でうまく機能しますが、MySQLの異なるバージョンで互換性とパフォーマンスにいくつかの違いがあり、開発者はそれを使用するときに問題に遭遇する可能性があります。この記事では、mysqli :: get_warningsの互換性の問題を詳細に紹介し、対応するソリューションを提供します。
mysqli :: get_warningsは、現在の接続の操作の最新の実行のための警告情報を含むmysqli_warningオブジェクトチェーンを返すmysqliクラスの方法です。警告情報には、警告コード、メッセージ、警告レベルが含まれます。
$mysqli = new mysqli("gitbox.net", "user", "password", "database");
if ($mysqli->connect_error) {
die("接続に失敗しました: " . $mysqli->connect_error);
}
$mysqli->query("YOUR SQL STATEMENT");
if ($warning = $mysqli->get_warnings()) {
do {
echo "Warning: (" . $warning->errno . ") " . $warning->message . "\n";
} while ($warning = $warning->next());
}
上記のコードは、警告チェーンの取得と通過方法を示しています。
MySQLバージョンの影響
MySQL 5.6以降
MySQL 5.6は、警告のサポートを改善し始めました。 mysqli :: get_warningsは適切に機能し、警告メッセージを返すことができます。
mysql 5.5以下<br> MySQL 5.5以前では、警告メカニズムのサポートが制限されています。場合によっては、 mysqli :: get_warningsがfalseを返す場合がありますが、これは実際に存在していても取得できません。
MySQL構成の影響
特定の構成パラメーター( SQL_NOTESなど)は、警告の生成と記録に影響します。警告メッセージの記録をオフにすると、 get_warnings()が警告を取得できません。
PHPバージョンとMySQLIドライバー
PHPバージョンとMySQLIドライバーバージョンは、この方法のパフォーマンスにも影響します。警告チェーンのMySQLI拡張サポートの初期PHPバージョンは不完全です。
$mysqli = new mysqli("gitbox.net", "user", "password", "database");
$mysqli->query("INSERT INTO test_table VALUES (1, 'duplicate')"); // 主キーが繰り返されると仮定します,警告を生成します
$warnings = $mysqli->get_warnings();
if ($warnings === false) {
echo "警告が表示されません,多分MySQLバージョンまたは構成はサポートされていません。";
} else {
do {
echo "警告コード: " . $warnings->errno . ", 情報: " . $warnings->message . "\n";
} while ($warnings = $warnings->next());
}
MySQL 5.5以前では、 $警告が直接FALSEを返す場合があり、警告を取得できません。
MySQLバージョンを検出します
関連するロジックを実行する前に、現在のMySQLバージョンを検出し、 get_warnings()を呼び出すかどうかを決定します。
$version = $mysqli->server_info;
if (version_compare($version, '5.6.0', '>=')) {
// サポートget_warnings
$warnings = $mysqli->get_warnings();
} else {
$warnings = false;
}
SQL警告代替
MySQLバージョンが低く、 get_warnings()を使用できない場合、 Show Warnings SQLコマンドを実行して、手動で警告を取得できます。
$result = $mysqli->query("SHOW WARNINGS");
if ($result) {
while ($row = $result->fetch_assoc()) {
echo "Level: " . $row['Level'] . ", Code: " . $row['Code'] . ", Message: " . $row['Message'] . "\n";
}
}
統一されたパッケージ
関数をカプセル化し、バージョンに従ってメソッドを取得するために警告を自動的に切り替えることをお勧めします。
function getMysqlWarnings(mysqli $mysqli) {
if (version_compare($mysqli->server_info, '5.6.0', '>=')) {
$warnings = $mysqli->get_warnings();
$allWarnings = [];
if ($warnings !== false) {
do {
$allWarnings[] = [
'errno' => $warnings->errno,
'message' => $warnings->message,
];
} while ($warnings = $warnings->next());
}
return $allWarnings;
} else {
$result = $mysqli->query("SHOW WARNINGS");
$allWarnings = [];
if ($result) {
while ($row = $result->fetch_assoc()) {
$allWarnings[] = [
'level' => $row['Level'],
'code' => $row['Code'],
'message' => $row['Message'],
];
}
}
return $allWarnings;
}
}
mysqli :: get_warnings関数は、MySQLバージョン、構成、PHPバージョンの違いにより、MySQL警告情報を取得するための理想的なインターフェイスですが、実際の使用で互換性の問題が発生する場合があります。これらの問題に対処するために、開発者は次のとおりです。
事前にMySQLバージョンを検出します
show警告は時間内に使用されます
コードの堅牢性と互換性を改善するための警告取得ロジックの統一カプセル化
このようにして、データベース警告情報をさまざまな環境で効果的に取得し、アプリケーションの安定性とユーザーエクスペリエンスを改善できるようにすることができます。