PHP MySQL 插入数据(INSERT INTO)
                           
天天向上
发布: 2025-03-22 00:06:24

原创
255 人浏览过

在 PHP 中,我们可以使用 MySQLiPDO 连接 MySQL 并向表中插入数据。本教程将全面解析 插入数据的不同方式、错误处理、批量插入、预处理语句(防止 SQL 注入),并提供 最佳实践


1. 使用 MySQLi 插入数据

1.1 过程化风格(MySQLi Procedural)

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database"; 

// 连接 MySQL
$conn = mysqli_connect($servername, $username, $password, $dbname);

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

// 插入数据 SQL
$sql = "INSERT INTO users (username, email, password) 
        VALUES ('user1', 'user1@example.com', 'password123')";

if (mysqli_query($conn, $sql)) {
    echo "新记录插入成功,ID: " . mysqli_insert_id($conn);
} else {
    echo "错误: " . mysqli_error($conn);
}

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

📌 解析

  • INSERT INTO users (...) VALUES (...)users 表插入数据。
  • mysqli_insert_id($conn) 获取刚插入数据的 id(适用于 AUTO_INCREMENT)。
  • mysqli_error($conn) 获取错误信息(如果 SQL 执行失败)。

1.2 面向对象风格(MySQLi OOP)

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";

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

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

// 插入数据 SQL
$sql = "INSERT INTO users (username, email, password) 
        VALUES ('user2', 'user2@example.com', 'securepass')";

if ($conn->query($sql) === TRUE) {
    echo "新记录插入成功,ID: " . $conn->insert_id;
} else {
    echo "错误: " . $conn->error;
}

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

📌 面向对象风格的区别

  • new mysqli() 连接数据库。
  • $conn->query($sql) 执行 SQL 语句。
  • $conn->insert_id 获取插入数据的 id

2. 使用 PDO 插入数据(推荐)

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "my_database";

try {
    // 连接 MySQL
    $pdo = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 插入数据 SQL
    $sql = "INSERT INTO users (username, email, password) 
            VALUES ('user3', 'user3@example.com', 'mypassword')";

    $pdo->exec($sql);
    echo "新记录插入成功,ID: " . $pdo->lastInsertId();
} catch (PDOException $e) {
    echo "错误: " . $e->getMessage();
}

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

📌 PDO 方式的优势

  • 支持多种数据库(MySQL、PostgreSQL、SQLite)。
  • 默认开启 异常处理 (PDO::ERRMODE_EXCEPTION),更易调试。
  • 更安全,适用于生产环境。

3. 预处理语句(防止 SQL 注入,推荐)

避免 SQL 注入攻击,建议使用 prepare() + bind_param()(MySQLi)或 prepare() + bindValue()(PDO)

3.1 MySQLi 预处理(过程化)

<?php
$conn = mysqli_connect("localhost", "root", "", "my_database");

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

// 预处理 SQL
$stmt = mysqli_prepare($conn, "INSERT INTO users (username, email, password) VALUES (?, ?, ?)");

// 绑定参数("sss" 表示 3 个字符串)
mysqli_stmt_bind_param($stmt, "sss", $username, $email, $password);

// 设置变量并执行
$username = "user4";
$email = "user4@example.com";
$password = "securepassword";
mysqli_stmt_execute($stmt);

echo "新记录插入成功,ID: " . mysqli_insert_id($conn);

// 关闭
mysqli_stmt_close($stmt);
mysqli_close($conn);
?>

3.2 PDO 预处理(推荐)

<?php
$pdo = new PDO("mysql:host=localhost;dbname=my_database", "root", "");

// 预处理 SQL
$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 = "user5";
$email = "user5@example.com";
$password = "mypassword";
$stmt->execute();

echo "新记录插入成功,ID: " . $pdo->lastInsertId();

// 关闭
$pdo = null;
?>

📌 为什么推荐 PDO 预处理?

  • 更安全:自动防 SQL 注入,无需手动转义字符串。
  • 更灵活:支持 命名参数:username:email)。
  • 更高效:查询 预编译,执行更快。

4. 批量插入数据

<?php
$pdo = new PDO("mysql:host=localhost;dbname=my_database", "root", "");

$stmt = $pdo->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)");

$data = [
    ['user6', 'user6@example.com', 'pass6'],
    ['user7', 'user7@example.com', 'pass7'],
    ['user8', 'user8@example.com', 'pass8']
];

foreach ($data as $row) {
    $stmt->execute($row);
}

echo "批量插入成功!";
?>

📌 批量插入优势

  • 避免多次查询,提高性能。
  • 更安全,自动处理特殊字符。

5. 可能遇到的错误及解决方案

5.1 “Duplicate entry for key ‘PRIMARY'”

原因id 主键重复。

解决方案

  • 确保 id 设置为 AUTO_INCREMENT
  ALTER TABLE users MODIFY id INT AUTO_INCREMENT;

5.2 “Field ’email’ doesn’t have a default value”

原因:未提供 NOT NULL 字段的值。

解决方案

  • 确保插入所有 NOT NULL 字段:
  INSERT INTO users (username, email, password) VALUES ('user', 'user@example.com', 'pass');
  • 或者移除 NOT NULL 限制:
  ALTER TABLE users MODIFY email VARCHAR(100) NULL;

6. 总结

方式代码是否推荐
MySQLi 过程化mysqli_query($conn, $sql);
MySQLi 面向对象$conn->query($sql);
PDO 直接执行$pdo->exec($sql);
MySQLi 预处理$stmt = mysqli_prepare($conn, $sql);
PDO 预处理$stmt = $pdo->prepare($sql);
批量插入$stmt->execute($row);

更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *