現在の位置: ホーム> 最新記事一覧> mysqliの標準使用の例:: stmt_initとprepare()

mysqliの標準使用の例:: stmt_initとprepare()

M66 2025-05-29

準備されたステートメントは、PHPでMySQLI拡張機能を使用する際にデータセキュリティを確保し、効率を向上させる重要な手段です。この記事では、mysqli :: stmt_init関数とprepare()メソッドの正しい使用法を詳細に紹介し、実際の例と組み合わせて分析します。

1。mysqli :: stmt_initとは何ですか?

mysqli :: stmt_initは、空のmysqli_stmt (ステートメント)オブジェクトを初期化するためにmysqliが提供するメソッドです。このオブジェクトは、SQLステートメントを事前に処理するために使用できます。

構文は次のとおりです。

 mysqli_stmt mysqli::stmt_init ( void )

通常、SQLステートメントを準備するためにprepare()メソッドで使用されます。

2。prepere ()メソッドとは何ですか?

PREPERE()メソッドは、後で実行され、パラメーターを使用してバインドできるSQLステートメントを準備するために使用されます。これにより、SQL注入攻撃を効果的に防ぐことができます。

構文は次のとおりです。

 bool mysqli_stmt::prepare ( string $query )

3。使用手順の詳細な説明

mysqli :: stmt_initおよびprepare()を使用した標準プロセスは次のとおりです。

  1. データベースに接続します

  2. プリプロセシングステートメントオブジェクトを初期化します

  3. prepare()を使用してステートメントを作成する

  4. バインドパラメーター(ある場合)

  5. 実行ステートメント

  6. 結果を取得します(クエリステートメントの場合)

  7. 緊密なステートメントと接続

4.詳細なコードの例

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();
?>

5.よくある質問と予防策

1. prepare()でSQLを直接書き込んでみませんか?

sqlはquery()メソッドを使用して直接実行できますが、これはSQLインジェクション攻撃に対して脆弱です。 Binding prepere()とパラメーターは、この問題を効果的に防ぐことができます。

2。stmt_init ()prepare()の違いは何ですか?

stmt_init()空のステートメントオブジェクトを作成し、sqlテンプレートをroad ()repare()に掲載します。また、 stmt_init()をスキップして、 $ mysqli-> prepare()を直接呼び出して、初期化と準備を1つのステップで完了することもできます。

3。ステートメントオブジェクトは再利用できますか?

はい、SQLテンプレート構造が一貫している限り、ステートメントオブジェクトを再利用でき、バインドされたパラメーターを変更できます。

6。例:postフォームを使用してデータを挿入します

次の例は、フォームを介してデータを送信し、データベースに安全に挿入する方法を示しています。

 <?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>

7。概要

mysqli :: stmt_initprepare()の組み合わせは、PHPの強力なデータベースセキュリティメカニズムを提供します。パラメーターバインディングは、SQL注入を防ぐだけでなく、実行効率も向上させます。実際の開発では、常に前処理ステートメントを使用してデータベースを操作することをお勧めします。

mysqliのbind_param()bind_result()の高度な使用についてさらに詳しく知りたいですか?