在 PHP 中操作 My态数据库(MySQL)时,插入数据是常见的任务之一。你可以通过多种方法进行数据插入,包括使用 MySQLi 或 PDO 扩展进行数据库操作。本文将详细介绍 PHP 中的插入操作,包括基本的插入方法、参数化查询、防止 SQL 注入、批量插入、事务操作等。

1. 基本的插入操作

1.1 使用 MySQLi 插入数据

MySQLi 是 PHP 中一种提供 MySQL 数据库操作的扩展,支持面向对象(OOP)和过程式编程。

1.1.1 面向过程的写法
<?php
// 连接数据库
$conn = mysqli_connect("localhost", "username", "password", "database");

if (!$conn) {
    die("连接失败: " . mysqli_connect_error());
}

// 插入数据
$sql = "INSERT INTO users (username, email, password) VALUES ('john_doe', 'john@example.com', 'password123')";
if (mysqli_query($conn, $sql)) {
    echo "数据插入成功!";
} else {
    echo "错误: " . $sql . "<br>" . mysqli_error($conn);
}

// 关闭连接
mysqli_close($conn);
?>
1.1.2 面向对象的写法
<?php
// 连接数据库
$conn = new mysqli("localhost", "username", "password", "database");

if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}

// 插入数据
$sql = "INSERT INTO users (username, email, password) VALUES ('john_doe', 'john@example.com', 'password123')";
if ($conn->query($sql) === TRUE) {
    echo "数据插入成功!";
} else {
    echo "错误: " . $sql . "<br>" . $conn->error;
}

// 关闭连接
$conn->close();
?>

1.2 使用 PDO 插入数据

PDO(PHP 数据对象)是一个数据库访问接口,它支持多种数据库,包括 MySQL。与 MySQLi 相比,PDO 提供了更好的数据库抽象,支持多数据库操作,且更适合于大规模开发。

1.2.1 PDO 插入数据
<?php
try {
    // 连接数据库
    $pdo = new PDO("mysql:host=localhost;dbname=database", "username", "password");

    // 设置错误模式
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 插入数据
    $sql = "INSERT INTO users (username, email, password) VALUES (:username, :email, :password)";
    $stmt = $pdo->prepare($sql);

    // 绑定参数
    $stmt->bindParam(':username', $username);
    $stmt->bindParam(':email', $email);
    $stmt->bindParam(':password', $password);

    // 设置参数并执行
    $username = "john_doe";
    $email = "john@example.com";
    $password = "password123";
    $stmt->execute();

    echo "数据插入成功!";
} catch (PDOException $e) {
    echo "错误: " . $e->getMessage();
}

// 关闭连接
$pdo = null;
?>

2. 防止 SQL 注入

在进行数据库操作时,SQL 注入 是一个常见的安全漏洞。它允许攻击者通过输入恶意 SQL 代码来篡改数据库内容。为了防止 SQL 注入,建议使用 参数化查询

2.1 MySQLi 防止 SQL 注入

通过预处理语句和参数化查询来防止 SQL 注入。

2.1.1 MySQLi 参数化查询
<?php
// 连接数据库
$conn = new mysqli("localhost", "username", "password", "database");

if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}

// 插入数据:使用预处理语句
$stmt = $conn->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $username, $email, $password);  // "sss"表示三个字符串参数

// 设置参数并执行
$username = "john_doe";
$email = "john@example.com";
$password = "password123";
$stmt->execute();

echo "数据插入成功!";

// 关闭连接
$stmt->close();
$conn->close();
?>

2.2 PDO 防止 SQL 注入

PDO 本身也支持预处理语句和参数化查询,能够有效防止 SQL 注入。

2.2.1 PDO 参数化查询
<?php
try {
    // 连接数据库
    $pdo = new PDO("mysql:host=localhost;dbname=database", "username", "password");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 插入数据:使用预处理语句
    $stmt = $pdo->prepare("INSERT INTO users (username, email, password) VALUES (:username, :email, :password)");

    // 绑定参数并执行
    $stmt->bindParam(':username', $username);
    $stmt->bindParam(':email', $email);
    $stmt->bindParam(':password', $password);

    $username = "john_doe";
    $email = "john@example.com";
    $password = "password123";

    $stmt->execute();

    echo "数据插入成功!";
} catch (PDOException $e) {
    echo "错误: " . $e->getMessage();
}

// 关闭连接
$pdo = null;
?>

3. 批量插入数据

有时你可能需要一次性插入多条数据,批量插入比逐条插入要高效得多,尤其是在大量数据插入时。

3.1 MySQLi 批量插入

<?php
// 连接数据库
$conn = new mysqli("localhost", "username", "password", "database");

if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}

// 多条插入数据
$sql = "INSERT INTO users (username, email, password) VALUES 
        ('user1', 'user1@example.com', 'password123'),
        ('user2', 'user2@example.com', 'password456'),
        ('user3', 'user3@example.com', 'password789')";

if ($conn->query($sql) === TRUE) {
    echo "批量插入成功!";
} else {
    echo "错误: " . $conn->error;
}

// 关闭连接
$conn->close();
?>

3.2 PDO 批量插入

<?php
try {
    // 连接数据库
    $pdo = new PDO("mysql:host=localhost;dbname=database", "username", "password");
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 开始事务
    $pdo->beginTransaction();

    // 批量插入数据
    $stmt = $pdo->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");

    $stmt->execute(['user1', 'user1@example.com', 'password123']);
    $stmt->execute(['user2', 'user2@example.com', 'password456']);
    $stmt->execute(['user3', 'user3@example.com', 'password789']);

    // 提交事务
    $pdo->commit();

    echo "批量插入成功!";
} catch (PDOException $e) {
    // 回滚事务
    $pdo->rollBack();
    echo "错误: " . $e->getMessage();
}

// 关闭连接
$pdo = null;
?>

4. 事务操作

在进行批量插入或者需要确保多个操作同时成功的情况下,事务 是非常重要的。事务可以确保在一组 SQL 操作中,如果某个操作失败,所有操作都会回滚,保证数据的一致性。

4.1 使用 MySQLi 事务

<?php
// 连接数据库
$conn = new mysqli("localhost", "username", "password", "database");

if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}

// 开始事务
$conn->begin_transaction();

try {
    // 插入数据
    $conn->query("INSERT INTO users (username, email, password) VALUES ('user1', 'user1@example.com', 'password123')");
    $conn->query("INSERT INTO users (username, email, password) VALUES ('user2', 'user2@example.com', 'password456')");
    
    // 提交事务
    $conn->commit();
    echo "事务提交成功!";
} catch (Exception $e) {
    // 回滚事务
    $conn->rollback();
    echo "错误: " . $e->getMessage();
}

// 关闭连接
$conn->close();
?>

4.2 使用 PDO 事务

<?php
try {
    // 连接

数据库
$pdo = new PDO(“mysql:host=localhost;dbname=database”, “username”, “password”);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// 开始事务
$pdo->beginTransaction();

// 插入数据
$stmt = $pdo->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");
$stmt->execute(['user1', 'user1@example.com', 'password123']);
$stmt->execute(['user2', 'user2@example.com', 'password456']);

// 提交事务
$pdo->commit();
echo "事务提交成功!";

} catch (PDOException $e) {
// 回滚事务
$pdo->rollBack();
echo “错误: ” . $e->getMessage();
}

// 关闭连接
$pdo = null;
?>


### 5. **总结**
- **基本插入**:可以使用 `MySQLi` 或 `PDO` 来执行插入操作,`PDO` 提供了更好的跨数据库支持。
- **防止 SQL 注入**:使用 **参数化查询** 来防止 SQL 注入。
- **批量插入**:通过一次性插入多条数据来提高性能。
- **事务操作**:在执行多条 SQL 语句时,使用事务确保数据的一致性和完整性。

掌握了这些技巧,你就可以在 PHP 中更加高效、安全地进行 MySQL 数据插入操作。