
本文详解如何在php中实现csv文件批量导入mysql的同时,为每一行数据动态生成唯一qr码,并将码值与记录一同持久化存储,涵盖安全写入、路径处理及错误反馈等关键实践。
本文详解如何在php中实现csv文件批量导入mysql的同时,为每一行数据动态生成唯一qr码,并将码值与记录一同持久化存储,涵盖安全写入、路径处理及错误反馈等关键实践。
在批量数据导入场景中,仅插入原始字段远远不够——许多业务(如资产登记、会员管理、工单追踪)要求每条记录绑定唯一可识别的二维码(QR Code),用于后续扫码核验或快速定位。本教程将基于你已有的CSV导入逻辑,无缝集成QR码生成功能,确保每条CSV记录对应一个独立、不可重复、可存储、可追溯的QR图像与数据库字段。
✅ 核心设计原则
- 逐行生成,非全局复用:uniqid('IT-') 必须置于 while 循环内部,保证每条记录获得唯一ID(原错误在于将其提至循环外,导致所有记录共用同一码值);
- 先生成后插入:QR图像文件必须在执行 INSERT 前完成写入,避免数据库存了码值但文件未生成;
- SQL安全加固:原始代码直接拼接 $getData[0] 存在严重SQL注入风险,必须使用预处理语句;
- 目录可写性保障:../temp/ 目录需存在且Web服务器用户(如 www-data)具有写权限,建议添加目录检查逻辑。
✅ 完整安全实现代码(含注释)
<?php
$conn = getdb();
if (isset($_POST["Import"])) {
$filename = $_FILES["file"]["tmp_name"];
// 检查上传文件是否有效
if (empty($filename) || $_FILES["file"]["error"] !== UPLOAD_ERR_OK) {
echo "<script>alert('文件上传失败,请重试'); window.location='ad-bulk.php';</script>";
exit;
}
if ($_FILES["file"]["size"] <= 0) {
echo "<script>alert('CSV文件不能为空'); window.location='ad-bulk.php';</script>";
exit;
}
// 确保QR码存储目录存在且可写
$qrPath = '../temp/';
if (!is_dir($qrPath)) {
mkdir($qrPath, 0755, true);
}
if (!is_writable($qrPath)) {
die("错误:目录 {$qrPath} 不可写,请检查权限");
}
$file = fopen($filename, "r");
if (!$file) {
die("无法打开CSV文件");
}
// 开启事务提升一致性(可选但推荐)
mysqli_begin_transaction($conn);
try {
$successCount = 0;
while (($row = fgetcsv($file, 10000, ",")) !== FALSE) {
if (empty($row[0])) continue; // 跳过空姓名行
// ✅ 每行独立生成唯一ID与QR码
$uniqueId = uniqid('IT-', true); // 加true增强唯一性(微秒级)
$qrFileName = $qrPath . $uniqueId . '.png';
$qrText = $uniqueId;
// 生成并保存QR码(需已引入qrcode library,如phpqrcode)
QRcode::png($qrText, $qrFileName, QR_ECLEVEL_L, 4, 2);
// ✅ 使用预处理语句防止SQL注入
$stmt = $conn->prepare("INSERT INTO users (code, name) VALUES (?, ?)");
$stmt->bind_param("ss", $uniqueId, $row[0]);
if ($stmt->execute()) {
$successCount++;
} else {
throw new Exception("插入失败: " . $stmt->error);
}
$stmt->close();
}
mysqli_commit($conn);
echo "<script>
alert('成功导入 {$successCount} 条记录,QR码已生成');
window.location = 'ad-bulk.php';
</script>";
} catch (Exception $e) {
mysqli_rollback($conn);
error_log("CSV导入失败: " . $e->getMessage());
echo "<script>
alert('导入过程中发生错误:{$e->getMessage()}');
window.location = 'ad-bulk.php';
</script>";
} finally {
fclose($file);
}
}
?>⚠️ 关键注意事项
- 依赖库:确保已正确安装 phpqrcode 库,并在脚本顶部 require_once 'phpqrcode/qrlib.php';
- 字段扩展:MySQL表 users 需提前新增 code VARCHAR(32) NOT NULL UNIQUE 字段,建议加索引加速查询;
-
QR码访问路径:生成的PNG文件可通过 https://yoursite.com/temp/IT-64a8f1b2c3d4e.png 直接访问,前端可结合
渲染;
- 大文件优化:若CSV超万行,建议增加 set_time_limit(0) 和内存限制调整,并考虑分批提交(如每500条 commit 一次);
- 错误日志:生产环境务必启用 error_log() 记录异常,避免静默失败。
通过以上结构化实现,你将获得一个健壮、安全、可维护的批量CSV+QR码一体化导入方案——既满足数据入库需求,又为每条记录赋予物理世界可识别的身份标识。










