PHP MySQL 插入多条数据

本文介绍如何使用MySQLi和PDO在MySQL数据库中批量插入多条记录。包括使用mysqli_multi_query()函数执行多条SQL语句的方法,以及利用PDO的事务处理进行批量插入。还介绍了预处理语句和参数绑定的方法来提高安全性。

使用 MySQLi 和 PDO 向 MySQL 插入多条数据

mysqli_multi_query() 函数可用来执行多条SQL语句。

以下实例向 "MyGuests" 表添加了三条新的记录:

实例 (MySQLi - 面向对象)

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
 
// 创建链接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查链接
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
} 
 
$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com');";
$sql .= "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('Mary', 'Moe', 'mary@example.com');";
$sql .= "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('Julie', 'Dooley', 'julie@example.com')";
 
if ($conn->multi_query($sql) === TRUE) {
    echo "新记录插入成功";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}
 
$conn->close();
?>

请注意,每个SQL语句必须用分号隔开。

实例 (MySQLi - 面向过程)

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
 
// 创建链接
$conn = mysqli_connect($servername, $username, $password, $dbname);
// 检查链接
if (!$conn) {
    die("连接失败: " . mysqli_connect_error());
}
 
$sql = "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com');";
$sql .= "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('Mary', 'Moe', 'mary@example.com');";
$sql .= "INSERT INTO MyGuests (firstname, lastname, email)
VALUES ('Julie', 'Dooley', 'julie@example.com')";
 
if (mysqli_multi_query($conn, $sql)) {
    echo "新记录插入成功";
} else {
    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
 
mysqli_close($conn);
?>

实例 (PDO)

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";
 
try {
    $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
    // set the PDO error mode to exception
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 
    // 开始事务
    $conn->beginTransaction();
    // SQL 语句
    $conn->exec("INSERT INTO MyGuests (firstname, lastname, email) 
    VALUES ('John', 'Doe', 'john@example.com')");
    $conn->exec("INSERT INTO MyGuests (firstname, lastname, email) 
    VALUES ('Mary', 'Moe', 'mary@example.com')");
    $conn->exec("INSERT INTO MyGuests (firstname, lastname, email) 
    VALUES ('Julie', 'Dooley', 'julie@example.com')");
 
    // 提交事务
    $conn->commit();
    echo "新记录插入成功";
}
catch(PDOException $e)
{
    // 如果执行失败回滚
    $conn->rollback();
    echo $sql . "<br>" . $e->getMessage();
}
 
$conn = null;
?>

使用预处理语句

mysqli 扩展提供了第二种方式用于插入语句。

我们可以预处理语句及绑定参数。

mysql 扩展可以不带数据发送语句或查询到mysql数据库。 你可以向列关联或 "绑定" 变量。

实例 (MySQLi 使用预处理语句)

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";
 
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检测连接
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
} else {
    $sql = "INSERT INTO MyGuests(firstname, lastname, email)  VALUES(?, ?, ?)";
 
    // 为 mysqli_stmt_prepare() 初始化 statement 对象
    $stmt = mysqli_stmt_init($conn);
 
    //预处理语句
    if (mysqli_stmt_prepare($stmt, $sql)) {
        // 绑定参数
        mysqli_stmt_bind_param($stmt, 'sss', $firstname, $lastname, $email);
 
        // 设置参数并执行
        $firstname = 'John';
        $lastname = 'Doe';
        $email = 'john@example.com';
        mysqli_stmt_execute($stmt);
 
        $firstname = 'Mary';
        $lastname = 'Moe';
        $email = 'mary@example.com';
        mysqli_stmt_execute($stmt);
 
        $firstname = 'Julie';
        $lastname = 'Dooley';
        $email = 'julie@example.com';
        mysqli_stmt_execute($stmt);
    }
}
?>

我们可以看到以上实例中使用模块化来处理问题。我们可以通过创建代码块实现更简单的读取和管理。

注意参数的绑定。让我们看下 mysqli_stmt_bind_param() 中的代码:

mysqli_stmt_bind_param($stmt, 'sss', $firstname, $lastname, $email);

该函数绑定参数查询并将参数传递给数据库。第二个参数是 "sss" 。以下列表展示了参数的类型。 s 字符告诉 mysql 参数是字符串。

可以是以下四种参数:

  • i - 整数
  • d - 双精度浮点数
  • s - 字符串
  • b - 布尔值

每个参数必须指定类型,来保证数据的安全性。通过类型的判断可以减少SQL注入漏洞带来的风险。

 

<think>根据用户的问题,用户希望了解在PHP中使用MySQL插入数据或上传图片的方法。结合用户提供的引用信息,我将分步骤解释如何实现这两个功能。 ### 插入数据MySQLPHP插入数据MySQL数据库通常遵循以下步骤: 1. **建立数据库连接**:使用`mysql_connect`或`mysqli`(推荐)函数连接数据库。 2. **选择数据库**:使用`mysql_select_db`或`mysqli`的相应方法选择要操作的数据库。 3. **构造SQL插入语句**:使用`INSERT INTO`语句来插入数据。 4. **执行SQL语句**:使用`mysql_query`或`mysqli_query`执行SQL语句。 5. **检查执行结果**:根据返回结果判断是否插入成功。 #### 示例代码(使用MySQLi面向对象方式): ```php <?php // 创建数据库连接 $servername = "localhost"; $username = "root"; $password = "123"; $dbname = "book"; $conn = new mysqli($servername, $username, $password, $dbname); // 检查连接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } // 准备SQL插入语句 $sql = "INSERT INTO goods (name, price) VALUES ('PHP Book', 39.99)"; // 执行查询 if ($conn->query($sql) === TRUE) { echo "新记录插入成功"; } else { echo "错误: " . $sql . "<br>" . $conn->error; } // 关闭连接 $conn->close(); ?> ``` #### 批量插入数据 当需要插入大量数据时,可以使用批量插入的方式提高效率。引用[2]中提到,使用多值插入(一次插入多条记录)可以显著提升性能。 示例: ```php $sql = "INSERT INTO goods (name, price) VALUES ('Book1', 10.99), ('Book2', 20.99), ('Book3', 30.99)"; if ($conn->multi_query($sql) === TRUE) { echo "批量插入成功"; } else { echo "错误: " . $sql . "<br>" . $conn->error; } ``` ### 上传图片到MySQLMySQL中存储图片通常有两种方式: 1. **直接存储图片的二进制数据**(使用`BLOB`类型字段)。 2. **存储图片路径**,将图片文件保存在服务器上,数据库中只保存路径字符串。 推荐使用第二种方式,因为直接存储二进制数据会导致数据库膨胀,且访问效率较低。 #### 方法1:存储图片路径 步骤: 1. 创建上传表单(HTML表单)。 2. 处理上传的图片文件(PHP)。 3. 将图片移动到服务器上的指定目录。 4. 将图片路径保存到数据库。 ##### 示例代码: HTML表单(upload.html): ```html <form action="upload.php" method="post" enctype="multipart/form-data"> 选择图片: <input type="file" name="image"> <input type="submit" value="上传"> </form> ``` PHP处理(upload.php): ```php <?php session_start(); $db = mysqli_connect("localhost", "root", "123", "book"); if(isset($_FILES['image'])) { $errors = array(); $file_name = $_FILES['image']['name']; $file_size = $_FILES['image']['size']; $file_tmp = $_FILES['image']['tmp_name']; $file_type = $_FILES['image']['type']; // 设置允许的扩展名和大小 $extensions = array("jpeg", "jpg", "png"); $file_ext = strtolower(pathinfo($file_name, PATHINFO_EXTENSION)); if(!in_array($file_ext, $extensions)) { $errors[] = "只允许上传JPEG, JPG, PNG格式的图片"; } if($file_size > 2097152) { // 2MB $errors[] = '文件大小不能超过2MB'; } if(empty($errors)) { // 移动文件到指定目录 $upload_path = "uploads/" . $file_name; move_uploaded_file($file_tmp, $upload_path); // 将路径保存到数据库 $sql = "INSERT INTO goods (image_path) VALUES ('$upload_path')"; if(mysqli_query($db, $sql)) { echo "图片上传并保存成功"; } else { echo "数据库错误: " . mysqli_error($db); } } else { print_r($errors); } } ?> ``` #### 方法2:直接存储二进制数据(不推荐) 如果必须直接存储二进制数据,可以使用`BLOB`类型字段。 示例代码: ```php // 读取图片文件 $image_data = file_get_contents($_FILES['image']['tmp_name']); $image_data = mysqli_real_escape_string($db, $image_data); // 转义特殊字符 $sql = "INSERT INTO goods (image_data) VALUES ('$image_data')"; // 执行插入... ``` ### 常见问题及解决方法 1. **插入失败**:检查SQL语句是否正确,数据库连接是否正常。引用[1]中提到,确保数据库选择正确(`mysql_select_db`)。 2. **字符集问题**:引用[3]提到,确保数据库、表和连接使用相同的字符集(如UTF-8)。在连接后执行: ```php mysqli_set_charset($conn, "utf8"); ``` 3. **插入大量数据失败**:引用[4]提到,调整MySQL的`max_allowed_packet`参数(默认可能较小),在my.cnf(或my.ini)中增加该值,例如: ``` max_allowed_packet=200M ``` 4. **验证插入是否成功**:引用[5]中提到,可以通过检查`mysql_query`或`mysqli_query`的返回值来判断。如果返回`TRUE`则成功,否则失败。 ### 总结 - 插入数据:建立连接,构造SQL语句,执行并检查结果。 - 上传图片:推荐存储路径,避免直接存二进制数据。 - 注意事项:字符集统一、大文件上传限制、批量插入优化。 §§相关问题§§ 1. 如何解决PHPMySQL插入数据时的乱码问题? 2. PHP中如何安全地上传图片文件? 3. 如何优化PHPMySQL批量插入大量数据的性能? 4. MySQL中存储图片的最佳实践是什么?</think>### PHP MySQL 插入数据/上传图片方法指南 #### 一、插入数据MySQL **核心步骤**: 1. **建立数据库连接** ```php <?php $servername = "localhost"; $username = "root"; $password = "123"; $dbname = "book"; // 创建连接(推荐使用mysqli) $conn = new mysqli($servername, $username, $password, $dbname); // 检查连接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } ?> ``` 2. **构造并执行SQL插入语句** ```php // 准备数据 $name = "PHP教程"; $price = 59.99; // 创建预处理语句(防SQL注入) $stmt = $conn->prepare("INSERT INTO goods (name, price) VALUES (?, ?)"); $stmt->bind_param("sd", $name, $price); // s=字符串, d=双精度浮点数 // 执行并检查结果 if ($stmt->execute()) { echo "数据插入成功"; } else { echo "错误: " . $stmt->error; } // 关闭连接 $stmt->close(); $conn->close(); ``` **常见问题解决**: - **插入失败检查项**: - 确保表字段名正确(区分大小写) - 检查用户权限(`GRANT INSERT ON database.* TO 'user'@'localhost'`) - 验证字符集一致性(推荐UTF-8)[^3] ```php // 设置连接字符集 $conn->set_charset("utf8mb4"); ``` - **批量插入优化**(引用[2]): ```php // 多值插入语法(提高5倍速度) $sql = "INSERT INTO goods (name, price) VALUES ('Book1', 19.99), ('Book2', 29.99), ('Book3', 39.99)"; ``` - **大文件插入错误**(引用[4]): 修改MySQL配置: ```ini # my.cnf 配置 max_allowed_packet = 200M ``` #### 二、上传图片到MySQL **推荐方案**:存储文件路径(非二进制数据) 1. **文件上传处理** ```php $target_dir = "uploads/"; $target_file = $target_dir . basename($_FILES["image"]["name"]); // 移动上传文件 if (move_uploaded_file($_FILES["image"]["tmp_name"], $target_file)) { // 将路径存入数据库 $stmt = $conn->prepare("INSERT INTO goods (image_path) VALUES (?)"); $stmt->bind_param("s", $target_file); $stmt->execute(); } ``` 2. **安全验证**(必需): ```php // 检查文件类型 $imageFileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION)); $allowed_types = ["jpg", "png", "jpeg", "gif"]; if (!in_array($imageFileType, $allowed_types)) { die("只允许JPG, PNG, GIF文件"); } // 检查文件大小(<2MB) if ($_FILES["image"]["size"] > 2000000) { die("文件过大"); } ``` **备选方案**:存储二进制数据(BLOB类型) ```php $imageData = file_get_contents($_FILES["image"]["tmp_name"]); $stmt = $conn->prepare("INSERT INTO goods (image_data) VALUES (?)"); $stmt->bind_param("b", $imageData); // b=blob类型 $stmt->send_long_data(0, $imageData); // 处理大文件 ``` #### 三、完整图片上传示例 ```php <?php // 数据库连接 $conn = new mysqli("localhost", "root", "123", "book"); if ($_SERVER["REQUEST_METHOD"] == "POST") { // 文件处理 $target_dir = "uploads/"; $target_file = $target_dir . uniqid() . "." . pathinfo($_FILES["image"]["name"], PATHINFO_EXTENSION); // 验证 $check = getimagesize($_FILES["image"]["tmp_name"]); if ($check === false) die("不是有效图片"); // 保存文件 if (move_uploaded_file($_FILES["image"]["tmp_name"], $target_file)) { // 插入数据库 $stmt = $conn->prepare("INSERT INTO goods (name, image_path) VALUES (?, ?)"); $product_name = "示例产品"; $stmt->bind_param("ss", $product_name, $target_file); if ($stmt->execute()) { echo "图片和记录上传成功"; } } } ?> <!-- HTML表单 --> <form method="post" enctype="multipart/form-data"> 选择图片: <input type="file" name="image"> <input type="submit" value="上传"> </form> ``` #### 四、调试技巧 1. **错误日志**: ```php error_reporting(E_ALL); ini_set('display_errors', 1); ``` 2. **插入验证**(引用[5]): ```php if ($conn->affected_rows > 0) { echo "成功插入".$conn->affected_rows."记录"; } else { echo "插入失败: ".$conn->error; } ``` 3. **权限检查**: - 确保`uploads/`目录有写入权限(Linux: `chmod -R 755 uploads`) - 验证MySQL用户有INSERT权限 > **关键提示**:生产环境必须使用预处理语句防止SQL注入,避免直接拼接SQL语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智慧浩海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值