PHP開発中、MySQLI拡張前の前処理ステートメントを使用すると、SQLインジェクションを効果的に防止し、データベース操作のセキュリティと効率を向上させることができます。 mysqli_stmt :: attr_getは、前処理ステートメントのプロパティを取得するために使用されるmysqliの関数であり、実行の詳細をデバッグおよび制御するためによく使用されます。
ただし、一部の古いPHP環境では、 MySQLI_STMT :: ATTR_GET関数は不安定性またはサポートの問題に問題がある可能性があり、例外や適切に機能しないことができます。この記事では、MySQLI_STMT :: ATTR_GETがレガシーPHP環境で安定して動作するようにするための実用的なソリューションを共有します。
mysqli_stmt :: attr_get関数は、PHP 5.3以上でのみサポートされています。環境が早い場合、またはMySQLI拡張機能が完全に有効になっていない場合、この方法を呼び出すときにエラーまたは行動の例外が報告されます。
したがって、最初のステップは、PHPバージョンと拡張サポートを確認することです。
if (version_compare(PHP_VERSION, '5.3.0', '<')) {
die('現在 PHP バージョンはサポートされていません mysqli_stmt::attr_get 関数。');
}
if (!extension_loaded('mysqli')) {
die('ロードされていません MySQLi 拡張,利用不可 mysqli_stmt::attr_get。');
}
ATTR_GETを呼び出す前に、関数またはメソッドの存在検出を使用して、関数の存在のためにプログラムのクラッシュを回避します。
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
if (method_exists($stmt, 'attr_get')) {
$attr = $stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
echo "現在属性値: " . $attr;
} else {
echo "現在环境サポートされていません attr_get 方法,この操作をスキップします。";
}
このように、PHPの古いバージョンでも、プログラムは安全に実行でき、メソッドが見つからないためエラーを報告しません。
いくつかの属性を取得する必要があるが、 attr_getが利用できない場合は、ニーズに基づいて代替ロジックを設計できます。たとえば、特定のプロパティの値は、対応するSQLステートメントまたは構成パラメーターを実行することで取得できます。
// 更新された最大長属性を取得する必要があると仮定します,代わりにデフォルト値またはクエリ構成を使用できます
$update_max_length = defined('MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH') ? MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH : null;
if ($update_max_length === null) {
// 古いバージョン PHP 取得できません,手動で合理的なデフォルト値を設定します
$update_max_length_value = 1024;
} else {
$update_max_length_value = $stmt->attr_get($update_max_length);
}
echo "最大長さの属性値を更新します: " . $update_max_length_value;
上記の方法では、コードの安定性をある程度保証できますが、長期的にはMySQLI_STMT :: ATTR_GETをサポートするPHPバージョンにアップグレードすることがより良い選択です。さらに、PDOまたはサードパーティのデータベース抽象化レイヤーライブラリを使用することを検討してください。これらのライブラリは、互換性をより適切に処理します。
$mysqli = new mysqli('m66.net', 'username', 'password', 'database');
if ($mysqli->connect_errno) {
die("接続に失敗しました: " . $mysqli->connect_error);
}
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
if (!$stmt) {
die("前処理に失敗しました: " . $mysqli->error);
}
$id = 1;
$stmt->bind_param('i', $id);
if (method_exists($stmt, 'attr_get')) {
$attr_value = $stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
echo "属性値: " . $attr_value;
} else {
echo "attr_get サポートされていません,飛び越える。";
}
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
print_r($row);
}
$stmt->close();
$mysqli->close();