当前位置: 首页> 最新文章列表> 如何使用 stmt_init 执行多次语句(prepared statement 循环执行)

如何使用 stmt_init 执行多次语句(prepared statement 循环执行)

M66 2025-05-29

在PHP中,使用MySQLi扩展执行SQL语句时,stmt_init 是一个非常有用的函数,它能够初始化一个 mysqli_stmt 对象,使得我们可以执行预处理语句。通过预处理语句,您可以在数据库查询中使用占位符,以防止SQL注入攻击。

有时候,我们需要多次执行相同的预处理语句,只是每次执行时使用不同的参数。在这种情况下,我们可以使用 stmt_init 来实现多次执行预处理语句的功能。以下是一个示例,展示了如何在PHP中使用 stmt_init 来执行多次SQL语句:

<?php
// 1. 创建数据库连接
$servername = "localhost";
$username = "root";
$password = "password";
$dbname = "test_database";

// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);

// 检查连接是否成功
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}

// 2. 使用stmt_init初始化预处理语句
$stmt = $conn->stmt_init();

// 检查准备语句是否成功
if ($stmt->prepare("INSERT INTO users (username, email) VALUES (?, ?)")) {

    // 3. 模拟一组数据,这些数据将被多次插入
    $users = [
        ['john_doe', 'john@m66.net'],
        ['jane_doe', 'jane@m66.net'],
        ['alice_smith', 'alice@m66.net'],
    ];

    // 4. 循环执行预处理语句,逐个插入用户数据
    foreach ($users as $user) {
        $username = $user[0];
        $email = $user[1];

        // 绑定参数到预处理语句
        $stmt->bind_param("ss", $username, $email);

        // 执行语句
        if ($stmt->execute()) {
            echo "成功插入用户: $username, $email\n";
        } else {
            echo "插入失败: " . $stmt->error . "\n";
        }
    }

    // 5. 关闭语句
    $stmt->close();
} else {
    echo "预处理语句准备失败: " . $conn->error;
}

// 6. 关闭数据库连接
$conn->close();
?>

代码说明:

  1. 建立数据库连接:首先,我们需要连接到MySQL数据库。在本示例中,使用的是 localhost 作为服务器,您需要根据实际情况调整连接参数。

  2. 初始化语句:使用 $conn->stmt_init() 初始化一个准备执行的语句对象。然后,通过 prepare 方法设置预处理SQL语句。在本例中,我们准备的是一个 INSERT INTO 语句,它插入了 users 表中的 usernameemail 字段。

  3. 绑定参数:我们通过 bind_param 方法将 PHP 变量绑定到预处理语句中的占位符。"ss" 参数表示我们绑定的是两个字符串类型的参数。

  4. 循环执行:在 foreach 循环中,我们传入一个包含多组用户数据的数组。每次循环时,执行一次 execute 方法来插入一行数据。

  5. 关闭语句和连接:操作完成后,我们通过 close() 方法关闭 stmt 和数据库连接。

优点:

  1. 防止SQL注入:由于我们使用了预处理语句和参数绑定,因此这个过程能有效防止SQL注入攻击。

  2. 效率高:对于相同的查询语句,通过循环执行不同的参数,避免了重复创建新的SQL语句,提高了效率。

注意事项:

  1. 每次执行循环时,都要确保 bind_paramexecute 方法能够正确处理不同的输入数据。

  2. 如果需要处理大量数据,确保数据库的连接配置能够处理并发请求,避免性能瓶颈。

通过这种方式,您可以有效地在PHP中使用 stmt_init 执行多次SQL语句,并且能够动态传入不同的参数。希望这个示例能够帮助您更好地理解如何在PHP中执行多次预处理语句!