如何配置PHP网站数据导入导出:批量数据处理与格式转换配置方法
在PHP网站开发过程中,数据导入导出是高频需求,比如批量上传商品信息、导出用户报表、不同格式数据转换等场景都需要用到相关功能。本文将详细介绍PHP网站中数据导入导出的完整配置方法,包含批量数据处理逻辑和常见格式(CSV、Excel、JSON)的转换实现。
一、基础环境配置
在实现数据导入导出功能前,需要先确保PHP环境满足基础要求,以下是必要的配置项:
- 开启PHP的
file_uploads配置,允许文件上传,修改php.ini文件:file_uploads = On - 调整上传文件大小限制,避免大批量数据上传失败:
upload_max_filesize = 20M,post_max_size = 20M - 若需要处理Excel格式文件,建议安装PhpSpreadsheet扩展(可通过Composer安装:
composer require phpoffice/phpspreadsheet) - 确保PHP有文件读写权限,导入导出的临时文件需要存储在服务器可写目录,比如
./uploads/目录
二、批量数据导入配置与实现
批量数据导入的核心流程是:接收上传文件 → 校验文件格式与合法性 → 解析文件内容 → 批量写入数据库。下面以CSV格式批量导入用户数据为例,给出完整实现代码。
<?php
// 配置部分:定义允许上传的文件类型、存储目录、数据库信息
$allowedTypes = ['csv'];
$uploadDir = './uploads/';
$dbHost = '127.0.0.1';
$dbName = 'test_db';
$dbUser = 'root';
$dbPass = 'root123';
// 1. 校验上传文件
if (!isset($_FILES['import_file']) || $_FILES['import_file']['error'] != 0) {
die('文件上传失败,请检查文件大小或格式');
}
$file = $_FILES['import_file'];
$fileExt = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));
if (!in_array($fileExt, $allowedTypes)) {
die('仅支持CSV格式文件导入');
}
// 2. 移动文件到指定目录
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0777, true);
}
$savePath = $uploadDir . uniqid() . '.' . $fileExt;
if (!move_uploaded_file($file['tmp_name'], $savePath)) {
die('文件保存失败');
}
// 3. 连接数据库
try {
$pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8", $dbUser, $dbPass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die('数据库连接失败:' . $e->getMessage());
}
// 4. 解析CSV文件并批量写入数据库
$handle = fopen($savePath, 'r');
// 跳过表头行
fgetcsv($handle);
$insertSql = 'INSERT INTO users (name, email, age) VALUES (?, ?, ?)';
$stmt = $pdo->prepare($insertSql);
$successCount = 0;
$failCount = 0;
while (($data = fgetcsv($handle)) !== false) {
// 数据校验:确保每行有3个字段,邮箱格式合法
if (count($data) != 3 || !filter_var($data[1], FILTER_VALIDATE_EMAIL)) {
$failCount++;
continue;
}
try {
$stmt->execute([$data[0], $data[1], $data[2]]);
$successCount++;
} catch (PDOException $e) {
$failCount++;
}
}
fclose($handle);
// 清理临时文件
unlink($savePath);
echo "导入完成:成功{$successCount}条,失败{$failCount}条";
?>上述代码中,首先完成文件上传的校验与存储,然后通过fgetcsv函数逐行解析CSV内容,使用预处理语句批量插入数据库,同时做了基础的数据合法性校验,避免无效数据写入。如果需要导入Excel格式,只需替换文件解析部分的逻辑,使用PhpSpreadsheet读取Excel内容即可。
三、批量数据导出配置与实现
批量数据导出的核心流程是:查询数据库数据 → 按目标格式组装内容 → 设置HTTP响应头 → 输出文件内容。下面分别给出CSV和Excel两种格式的导出实现。
3.1 CSV格式批量导出
CSV格式导出不需要额外扩展,兼容性最好,适合大批量数据导出,代码如下:
<?php
// 配置部分:数据库信息、导出文件名
$dbHost = '127.0.0.1';
$dbName = 'test_db';
$dbUser = 'root';
$dbPass = 'root123';
$exportFileName = 'users_' . date('YmdHis') . '.csv';
// 1. 连接数据库
try {
$pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8", $dbUser, $dbPass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die('数据库连接失败:' . $e->getMessage());
}
// 2. 查询需要导出的数据
$stmt = $pdo->query('SELECT name, email, age FROM users WHERE status = 1');
$dataList = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 3. 设置响应头,告诉浏览器输出CSV文件
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="' . $exportFileName . '"');
// 4. 打开输出流,写入表头和内容
$output = fopen('php://output', 'w');
// 写入表头
fputcsv($output, ['姓名', '邮箱', '年龄']);
// 写入数据行
foreach ($dataList as $row) {
fputcsv($output, [$row['name'], $row['email'], $row['age']]);
}
fclose($output);
exit;
?>3.2 Excel格式批量导出
如果需要导出带格式、多Sheet的Excel文件,可以使用PhpSpreadsheet扩展实现,代码如下:
<?php
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
// 配置部分:数据库信息、导出文件名
$dbHost = '127.0.0.1';
$dbName = 'test_db';
$dbUser = 'root';
$dbPass = 'root123';
$exportFileName = 'users_' . date('YmdHis') . '.xlsx';
// 1. 连接数据库并查询数据
try {
$pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8", $dbUser, $dbPass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die('数据库连接失败:' . $e->getMessage());
}
$stmt = $pdo->query('SELECT name, email, age FROM users WHERE status = 1');
$dataList = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 2. 创建Spreadsheet实例
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// 设置表头
$sheet->setCellValue('A1', '姓名');
$sheet->setCellValue('B1', '邮箱');
$sheet->setCellValue('C1', '年龄');
// 3. 写入数据行
$rowIndex = 2;
foreach ($dataList as $row) {
$sheet->setCellValue('A' . $rowIndex, $row['name']);
$sheet->setCellValue('B' . $rowIndex, $row['email']);
$sheet->setCellValue('C' . $rowIndex, $row['age']);
$rowIndex++;
}
// 4. 设置响应头并输出文件
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment; filename="' . $exportFileName . '"');
header('Cache-Control: max-age=0');
$writer = new Xlsx($spreadsheet);
$writer->save('php://output');
exit;
?>四、数据格式转换配置
实际业务中经常需要不同格式数据的互相转换,比如将数据库查询结果转换为JSON格式给前端接口使用,或者将CSV转换为Excel格式。以下是JSON导出和CSV转Excel的实现示例。
4.1 数据导出为JSON格式
<?php
// 配置数据库信息
$dbHost = '127.0.0.1';
$dbName = 'test_db';
$dbUser = 'root';
$dbPass = 'root123';
// 连接数据库并查询数据
try {
$pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8", $dbUser, $dbPass);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die('数据库连接失败:' . $e->getMessage());
}
$stmt = $pdo->query('SELECT id, name, email, age FROM users WHERE status = 1');
$dataList = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 设置响应头为JSON格式
header('Content-Type: application/json; charset=utf-8');
// 直接输出JSON内容
echo json_encode([
'code' => 0,
'msg' => 'success',
'data' => $dataList
], JSON_UNESCAPED_UNICODE);
?>4.2 CSV转换为Excel格式
<?php
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\IOFactory;
// 配置CSV文件路径和输出Excel路径
$csvPath = './uploads/test.csv';
$excelPath = './uploads/test_' . date('YmdHis') . '.xlsx';
if (!file_exists($csvPath)) {
die('CSV文件不存在');
}
// 使用IOFactory加载CSV文件,自动转换为Spreadsheet对象
$reader = IOFactory::createReader('Csv');
$spreadsheet = $reader->load($csvPath);
// 保存为Excel格式
$writer = new Xlsx($spreadsheet);
$writer->save($excelPath);
echo '转换完成,文件保存在:' . $excelPath;
?>五、注意事项与优化建议
- 大批量数据导入时,建议使用事务处理,所有数据插入成功后再提交,避免部分插入导致的数据不一致问题
- 导出数据量过大时,CSV格式比Excel更适合,Excel单Sheet最多支持1048576行数据,超出会报错
- 文件上传后一定要做类型和大小校验,避免恶意文件上传带来的安全风险
- 导入时建议做重复数据校验,比如根据邮箱判断用户是否已存在,避免重复写入
- 生产环境中,建议将导入导出任务改为异步处理,避免脚本执行时间过长导致超时,可通过消息队列或者定时任务实现