準備されたステートメントは、PHPでMySQLI拡張機能を使用する際にデータセキュリティを確保し、効率を向上させる重要な手段です。この記事では、mysqli :: stmt_init関数とprepare()メソッドの正しい使用法を詳細に紹介し、実際の例と組み合わせて分析します。
mysqli :: stmt_initは、空のmysqli_stmt (ステートメント)オブジェクトを初期化するためにmysqliが提供するメソッドです。このオブジェクトは、SQLステートメントを事前に処理するために使用できます。
構文は次のとおりです。
mysqli_stmt mysqli::stmt_init ( void )
通常、SQLステートメントを準備するためにprepare()メソッドで使用されます。
PREPERE()メソッドは、後で実行され、パラメーターを使用してバインドできるSQLステートメントを準備するために使用されます。これにより、SQL注入攻撃を効果的に防ぐことができます。
構文は次のとおりです。
bool mysqli_stmt::prepare ( string $query )
mysqli :: stmt_initおよびprepare()を使用した標準プロセスは次のとおりです。
データベースに接続します
プリプロセシングステートメントオブジェクトを初期化します
prepare()を使用してステートメントを作成する
バインドパラメーター(ある場合)
実行ステートメント
結果を取得します(クエリステートメントの場合)
緊密なステートメントと接続
ID 、ユーザー名、電子メールのフィールドを持つユーザーテーブルユーザーがいるとします。ユーザー名に基づいて、ユーザーのメールアドレスを照会したいと思います。
<?php
// 最初のステップ:データベース接続を確立します
$mysqli = new mysqli("localhost", "db_user", "db_password", "db_name");
// 接続が成功しているかどうかを確認してください
if ($mysqli->connect_error) {
die("接続に失敗しました: " . $mysqli->connect_error);
}
// ステップ2:プリプロセシングステートメントオブジェクトを初期化します
$stmt = $mysqli->stmt_init();
// ステップ3:準備する SQL 声明
$sql = "SELECT email FROM users WHERE username = ?";
if (!$stmt->prepare($sql)) {
die("SQL 前処理に失敗しました: " . $stmt->error);
}
// ステップ4:バインドパラメーター
$username = "testuser";
$stmt->bind_param("s", $username); // "s" 文字列タイプを表します
// ステップ5:执行声明
$stmt->execute();
// ステップ6:結果をバインドしてデータを取得します
$stmt->bind_result($email);
if ($stmt->fetch()) {
echo "ユーザーメールはです: " . $email;
} else {
echo "このユーザーは見つかりませんでした。";
}
// ステップ7:关闭声明与连接
$stmt->close();
$mysqli->close();
?>
sqlはquery()メソッドを使用して直接実行できますが、これはSQLインジェクション攻撃に対して脆弱です。 Binding prepere()とパラメーターは、この問題を効果的に防ぐことができます。
stmt_init()空のステートメントオブジェクトを作成し、sqlテンプレートをroad ()repare()に掲載します。また、 stmt_init()をスキップして、 $ mysqli-> prepare()を直接呼び出して、初期化と準備を1つのステップで完了することもできます。
はい、SQLテンプレート構造が一貫している限り、ステートメントオブジェクトを再利用でき、バインドされたパラメーターを変更できます。
次の例は、フォームを介してデータを送信し、データベースに安全に挿入する方法を示しています。
<?php
$mysqli = new mysqli("localhost", "db_user", "db_password", "db_name");
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$username = $_POST["username"] ?? "";
$email = $_POST["email"] ?? "";
$stmt = $mysqli->stmt_init();
if ($stmt->prepare("INSERT INTO users (username, email) VALUES (?, ?)")) {
$stmt->bind_param("ss", $username, $email);
if ($stmt->execute()) {
echo "ユーザー登録に正常に!";
} else {
echo "実行に失敗しました:" . $stmt->error;
}
$stmt->close();
}
}
$mysqli->close();
?>
<form method="POST" action="https://m66.net/register.php">
ユーザー名:<input type="text" name="username" required><br>
郵便:<input type="email" name="email" required><br>
<input type="submit" value="登録する">
</form>
mysqli :: stmt_initとprepare()の組み合わせは、PHPの強力なデータベースセキュリティメカニズムを提供します。パラメーターバインディングは、SQL注入を防ぐだけでなく、実行効率も向上させます。実際の開発では、常に前処理ステートメントを使用してデータベースを操作することをお勧めします。
mysqliのbind_param()とbind_result()の高度な使用についてさらに詳しく知りたいですか?