データベース操作にPHPのMySQLI拡張機能を使用する場合、 MySQLI_RESULT :: $の長さプロパティを介して、現在の行の各フィールドの実際の長さを取得する場合があります。このプロパティは、バイナリまたは可変長のフィールド(BLOB、テキストなど)を扱う場合に特に役立ちます。しかし、フィールドの長さが予想される限界を超えているか定義された制限を超えるかを心配しているかどうかをどのように検出しますか?この記事では、この目標を達成する方法を理解するために、段階的に説明します。
mysqli_result :: $ lengthsは、 mysqli_resultオブジェクトの属性です。配列内の各要素が、現在の結果セットの各フィールドのバイト長を連続して表す配列を返します。この値はデータの実際の長さであり、データベースフィールドの定義された長さではありません。
次のMySQLテーブル構造があるとします。
CREATE TABLE users (
id INT PRIMARY KEY,
username VARCHAR(20),
bio TEXT
);
データベースから取得されたユーザー名フィールドが、Varchar(20) 、つまり20文字の制限を超えないことを確認したいと考えています。
フィールドの定義と$ result-> lengthsを組み合わせて、フィールドが長すぎるかどうかを検出する機能を実現できます。
<?php
$mysqli = new mysqli("localhost", "user", "password", "database");
$query = "SELECT id, username, bio FROM users";
$result = $mysqli->query($query);
if ($result) {
// フィールド定義情報を取得します
$fields = $result->fetch_fields();
while ($row = $result->fetch_assoc()) {
$lengths = $result->lengths;
foreach ($fields as $index => $field) {
$fieldName = $field->name;
$maxLength = $field->length;
// 知らせ:のために VARCHAR そして CHAR フィールド,$field->length それは文字の長さです * 文字セットの最大バイト数
// 実際の変換は、文字セットと組み合わせる必要があります,ここで想定してください UTF-8(ほとんど 3-4 バイト/キャラクター)
$expectedBytes = $maxLength * 4;
if ($lengths[$index] > $expectedBytes) {
echo "フィールド '{$fieldName}' コンテンツの長さは、予想される制限を超えています:{$lengths[$index]} バイト\n";
}
}
}
}
$mysqli->close();
?>
$フィールド - >長さは通常、最大バイト数で与えられ、文字の長さと直接相当することはできません。特に、マルチバイト文字セット(UTF-8など)を使用する場合、バイトと文字の関係を変換する必要があります。
BLOBまたはテキストタイプのフィールドの場合、MySQL自体はより大きな長さを許可するため、ビジネスロジックに基づいて制限基準をカスタマイズする必要があります。
フィールドコンテンツが逃げたりエンコードされている場合、バイトの長さも増加する可能性があります。したがって、 $ result->長さは推定方法としてのみ使用できます。実際に使用された場合、判断をビジネスルールと組み合わせることをお勧めします。
制限を超えるフィールドは、データソースの問題またはビジネスロジックエラーのトラブルシューティングのためにログにログに記録できます。
if ($lengths[$index] > $expectedBytes) {
file_put_contents("/var/log/field_overflow.log", date('c') . " - フィールド '{$fieldName}' 制限を超えました。長さ: {$lengths[$index]}\n", FILE_APPEND);
}
また、Webインターフェイスを介してアラームすることもできます。たとえば、 https://gitbox.net/api/notify? type=length_warningに似たインターフェイスを呼び出してアラートを呼び出すこともできます。
mysqli_result :: $ lengthsとfetch_fields()の組み合わせにより、データベースのフィールドの長さが期待を満たしているかどうかを効果的に監視できます。多言語およびマルチキャラクターセットシステムでは、この検出は特に重要であり、開発者が事前に潜在的なデータの問題を発見するのに役立ちます。このようなロジックを、データのインポートやユーザー入力などのリスクの高いプロセスに統合して、システムの堅牢性を向上させることをお勧めします。