沃梦达 / IT编程 / 数据库 / 正文

php使用PDO事务配合表格读取大量数据插入操作实现方法

下面我来详细讲解“PHP使用PDO事务配合表格读取大量数据插入操作实现方法”的完整攻略。

下面我来详细讲解“PHP使用PDO事务配合表格读取大量数据插入操作实现方法”的完整攻略。

什么是PDO

PDO(PHP Data Objects)是一个轻量级、通用性较强的PHP数据访问层,它提供了一个数据访问抽象层,用于从数据源(如 MySQL、Oracle、SQL Server等)中获取和操作数据。相比于传统的mysql、mysqli扩展,PDO更加灵活,可以方便地支持多种不同类型的数据库,操作更加安全,能够有效防止SQL注入攻击。

PDO事务

PDO事务是指在访问数据库时,将多个操作作为一个整体进行处理,要么全部成功,要么全部失败。事务机制能够有效地保护数据的完整性,避免数据不一致问题,无论任何操作失败,都可以回滚到事务开始前的状态,保证数据的一致性和完整性。

PDO事务插入大量数据

在需要插入大量数据的情况下,一条一条地执行SQL语句效率较低,会出现超时等问题。这时候可以使用PDO事务,在事务中批量插入数据,提高操作的效率。

下面是使用PDO事务插入大量数据的完整步骤:

  1. 打开数据库连接,并设置PDO属性,例如:

php
$dsn = 'mysql:host=localhost;dbname=test;charset=utf8mb4';
$username = 'root';
$password = '123';
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
];
$pdo = new PDO($dsn, $username, $password, $options);

  1. 开始PDO事务,例如:

php
$pdo->beginTransaction();

  1. 准备SQL插入语句,例如:

php
$sql = "INSERT INTO `users` (`name`, `email`) VALUES (:name, :email)";
$stmt = $pdo->prepare($sql);

注意,这里使用了占位符: name 和: email,稍后需要使用bindParam()或bindValue()方法来给占位符赋值。

  1. 读取大量数据,例如:

php
$file = fopen('data.csv', 'r');
$data = [];
while (($row = fgetcsv($file)) !== false) {
$data[] = [
'name' => $row[0],
'email' => $row[1],
];
}
fclose($file);

这里假设数据已存储在一个CSV文件中,每行数据有两个字段:name和email,通过fgetcsv()函数逐行读取数据,并把每行数据存储在一个数组中。

  1. 给占位符赋值,并执行SQL插入语句,例如:

php
foreach ($data as $item) {
$stmt->bindParam(':name', $item['name']);
$stmt->bindParam(':email', $item['email']);
$stmt->execute();
}

这里依次遍历数组中的每一个元素($item),并分别使用bindParam()方法给占位符赋值,最后调用execute()方法执行SQL语句,完成数据插入操作。

  1. 提交PDO事务,例如:

php
$pdo->commit();

如果插入操作全部成功,则提交事务,否则回滚事务。

下面是两个示例:

示例一:PDO事务插入大量数据

假设有一个名为users的表格,其中包含两个字段:name和email,需要把从CSV文件中读取到的大量数据写入表格中,可以使用PDO事务插入大量数据,代码如下:

$dsn = 'mysql:host=localhost;dbname=test;charset=utf8mb4';
$username = 'root';
$password = '123';
$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => false,
];
$pdo = new PDO($dsn, $username, $password, $options);

$pdo->beginTransaction();

$sql = "INSERT INTO `users` (`name`, `email`) VALUES (:name, :email)";
$stmt = $pdo->prepare($sql);

$file = fopen('data.csv', 'r');
$data = [];
while (($row = fgetcsv($file)) !== false) {
    $data[] = [
        'name' => $row[0],
        'email' => $row[1],
    ];
}
fclose($file);

foreach ($data as $item) {
    $stmt->bindParam(':name', $item['name']);
    $stmt->bindParam(':email', $item['email']);
    $stmt->execute();
}

$pdo->commit();

示例二:PDO事务删除特定数据

假设有一个名为users的表格,其中包含两个字段:name和email,需要删除其中name等于Tom的所有数据,可以使用PDO事务删除特定数据,代码如下:

$dsn = 'mysql:host=localhost;dbname=test;charset=utf8mb4';
$username = 'root';
$password = '123';
$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_EMULATE_PREPARES => false,
];
$pdo = new PDO($dsn, $username, $password, $options);

$pdo->beginTransaction();

$sql = "DELETE FROM `users` WHERE `name` = :name";
$stmt = $pdo->prepare($sql);

$stmt->bindParam(':name', $name);
$name = 'Tom';
$stmt->execute();

$stmt->bindParam(':name', $name);
$name = 'Jerry';
$stmt->execute();

$pdo->commit();

这里使用了两个bindParam()方法,再调用execute()方法删除表格中name等于Tom和Jerry的数据。如果两次执行SQL语句都成功,则提交事务,否则回滚事务。

本文标题为:php使用PDO事务配合表格读取大量数据插入操作实现方法