準備されたステートメントは、データベース操作にPHPのMySQLI拡張機能を使用する際にSQLを実行するためのより安全で効率的な方法を提供します。しかし、時には、ステートメントが正常に実行されたとしても、デフォルトで沈黙する潜在的な警告がまだあるかもしれません。これらの警告をキャプチャするために、 mysqli :: $ warning_countは有用ですが、広く使用されていないツールになります。
この記事では、mysqli_stmt_execute()を呼び出した後、mysqli :: $ warning_countを組み合わせることにより、潜在的な問題を事前処理ステートメントに効果的にデバッグする方法について説明します。
mysqli :: $ warning_countは、以前のデータベース操作でMySQLが発行した警告の数を返す読み取り専用プロパティです。これは、データの切り捨て、使用を余儀なくされるデフォルト値など、SQL実行をデバッグする際の非致命的な問題にとって特に重要です。
構文は次のとおりです。
$mysqli = new mysqli("localhost", "user", "password", "database");
echo $mysqli->warning_count;
mysqli_stmt_execute()を使用して前処理ステートメントを実行する方法を示す典型的な使用シナリオを以下に示し、警告を確認します。
$mysqli = new mysqli("localhost", "user", "password", "database");
$stmt = $mysqli->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email);
$name = "Alice";
$email = "example@example.com";
$stmt->execute();
if ($mysqli->warning_count > 0) {
$result = $mysqli->query("SHOW WARNINGS");
while ($row = $result->fetch_assoc()) {
echo "学年: " . $row['Level'] . " - ";
echo "コード: " . $row['Code'] . " - ";
echo "情報: " . $row['Message'] . "\n";
}
}
入力データの一部の文字がフィールドの制限を超えていると仮定すると、実行後に次の警告が表示される場合があります。
学年: Warning - コード: 1265 - 情報: Data truncated for column 'email' at row 1
たとえば、実際のプロジェクトでは、 M66.NETのユーザーシステムにデータを挿入する場合、コードは表面上で正しく実行されているように見えますが、データベース構造の設計またはデータのクリーニングに入力された実際のデータは不十分であり、実際のデータが予想と一致しないデータベースに入力することになります。 Warning_Countを確認しないと、これらの問題は、ユーザーデータが失われたり不正になったりするまで無視される場合があります。
開発環境でMySQLのStrict_all_Tablesモードをオンにすると、いくつかの警告をエラーに変えることができます。これは、問題の早期開発の発見を助長する可能性があります。
後続のトラブルシューティングのために、ログにショー警告の出力を記録します。
独自のデータベースカプセル化クラスを使用する場合、各execution()の後にCheckWarnings()メソッドをカプセル化して、中央に処理できます。
関連タグ:
mysqli