PHPを使用してMySQLデータベースを操作する場合、 MySQLI拡張機能は、SQLインジェクション攻撃を効果的に防止し、データベース操作のセキュリティと効率を改善できるリッチな前処理ステートメント(準備されたステートメント)サポートを提供します。この記事では、MySQLI :: STMT_INITメソッドを使用してステートメントオブジェクトを初期化し、オブジェクトを介してSQLステートメントを実行する方法に焦点を当てます。
mysqli :: stmt_init()は、空のステートメントオブジェクト( mysqli_stmt )の初期化に使用されるmysqliクラスの方法です。このオブジェクトは、 prepare()メソッドを呼び出し、さらにbind_param() 、 execute() 、およびその他の操作方法と呼ばれることにより、SQLクエリステートメントにバインドできます。
基本的な構文は次のとおりです。
$stmt = $mysqli->stmt_init();
ここで、 $ mysqliはデータベースに接続されているmysqliオブジェクトです。
STMT_INIT初期化ステートメントとSQLクエリの実行を使用した完全なPHP例を次に示します。
<?php
// データベース接続
$mysqli = new mysqli("localhost", "username", "password", "database");
// 接続を確認してください
if ($mysqli->connect_error) {
die("接続に失敗しました: " . $mysqli->connect_error);
}
// ステートメントオブジェクトを初期化します
$stmt = $mysqli->stmt_init();
// 前処理 SQL 声明
if ($stmt->prepare("SELECT name, email FROM users WHERE id = ?")) {
// バインドパラメーター
$id = 1;
$stmt->bind_param("i", $id);
// 执行声明
$stmt->execute();
// 結合結果変数
$stmt->bind_result($name, $email);
// クエリの結果を取得します
while ($stmt->fetch()) {
echo "ユーザー名: $name, 郵便: $email<br>";
}
// 关闭声明
$stmt->close();
} else {
echo "SQL 前処理失败: " . $stmt->error;
}
// 接続を閉じます
$mysqli->close();
?>
stmt_init()を呼び出した後、 prepare()メソッドを使用して、実際にSQLステートメントを結合する必要があります。
たとえば、 bind_param()のタイプパラメーターは、 「i」は整数を表し、 「s」は文字列を表し、正しく設定する必要があります。
ステートメントオブジェクトを使用してリソースを解放した後、必ず$ stmt-> close()を呼び出してください。
ステートメントの準備に$ mysqli-> prepare()を直接使用できますが、 stmt_init()は、ステートメントが再利用可能かどうかを確認するか、低レベルのインターフェイスを使用するかを確認する必要がある場合など、より詳細なコントロールを提供します。