使用 PHP 读取 CSV 文件并导入 MySQL 数据库
本文将演示如何利用 PHP 脚本将 CSV 格式的数据文件上传至服务器,并通过逐行解析的方式将其存储到 MySQL 数据库中。
实现原理与步骤
该功能的核心逻辑分为三个主要步骤:
- 文件上传:通过 HTML 表单允许用户上传 CSV 文件,并将其临时存储在服务器上。
- 读取解析:使用
fopen打开文件,并利用fgetcsv函数按行读取 CSV 数据,将其转换为 PHP 数组。 - 数据入库:遍历解析后的数据数组,构建 SQL
INSERT语句,并将记录逐一写入目标数据库表中。
准备条件
- 已安装并运行 Apache/Nginx 与 PHP 环境(支持 PHP 5.x 及以上版本)。
- 拥有可用的 MySQL 数据库实例及相应的读写权限。
- 待导入的 CSV 文件格式规范,字段以逗号分隔(可根据实际情况修改分隔符)。
代码实现详解
以下是一个基于原文逻辑重构的完整示例。为了清晰展示流程,我们将前端上传界面与后端处理逻辑整合在一个脚本中。
第1步:创建前端上传表单
创建一个 HTML 表单,设置 enctype 为 multipart/form-data,以确保文件能正确传输。
<form enctype="multipart/form-data" action="" method="post">
<p>选择要导入的 CSV 文件:<br />
<input name="myfile" type="file" />
<input value="提交导入" type="submit"/>
</p>
</form>
第2步:后端处理与数据库连接
当表单提交后,PHP 脚本接收文件。原文中使用了 mysql_connect 等已废弃的函数,且存在注入风险。以下是保留原意但修正了基础结构的代码框架(注:生产环境请务必使用 PDO 或 Mysqli 并配合预处理语句)。
<?php
// 假设表单已提交
if (isset($_FILES['myfile'])) {
$fname = $_FILES['myfile']['name'];
// 注意:实际生产中应避免直接使用上传文件名,需增加重命名和安全检查
$tmp_name = $_FILES['myfile']['tmp_name'];
// 可选:将文件复制到固定路径以便读取,或直接读取 tmp_name
// $do = copy($tmp_name, $fname);
if (empty($fname)) {
echo "未选择文件";
exit;
}
// 数据库配置
$host = 'localhost';
$user = 'root';
$pass = ''; // 请替换为你的数据库密码
$dbname = 'gklqtzcx'; // 请替换为你的数据库名
// 建议使用 PDO 或 Mysqli,此处仅按原文逻辑展示旧式写法用于参考
// 警告:mysql_* 函数已在 PHP 7.0+ 中移除
/*
$connect = mysql_connect($host, $user, $pass) or die("Could not connect to database");
mysql_select_db($dbname, $connect);
mysql_query("set names 'utf8'"); // 推荐 utf8mb4,原文为 gbk
*/
// 读取 CSV 文件
// 假设文件位于当前目录,实际应使用绝对路径或正确的相对路径
$handle = fopen($tmp_name, "r");
// 跳过表头(如果 CSV 有标题行)
// fgetcsv($handle);
while ($data = fgetcsv($handle, 10000, ",")) {
// 原文假设 CSV 列顺序为:name, classes, a_time 等
// 对应数组索引 $data[1] 到 $data[8]
// 注意:数组索引从 0 开始,需根据实际 CSV 结构调整
$col1 = mysql_real_escape_string($data[1]);
$col2 = mysql_real_escape_string($data[2]);
$col3 = mysql_real_escape_string($data[3]);
$col4 = mysql_real_escape_string($data[4]);
$col5 = mysql_real_escape_string($data[5]);
$col6 = mysql_real_escape_string($data[6]);
$col7 = mysql_real_escape_string($data[7]);
$col8 = mysql_real_escape_string($data[8]);
$q = "INSERT INTO records (name, classes, a_time, college, notify, receiver, r_time, handler)
VALUES ('$col1', '$col2', '$col3', '$col4', '$col5', '$col6', '$col7', '$col8')";
// mysql_query($q) or die(mysql_error());
}
fclose($handle);
echo "数据处理完成,正在跳转...";
// header("Refresh: 1; url=list.php");
}
?>
第3步:执行与验证
上传文件后,脚本会尝试逐行插入数据。如果执行成功,通常会显示“导入数据成功”并跳转至列表页(如 list.php)。请在数据库中查询目标表,确认数据是否已准确录入。
注意事项与排错
- 函数废弃问题:原文使用的
mysql_*系列函数在 PHP 5.5.0 起已被废弃,PHP 7.0.0 起彻底移除。新项目中必须使用Mysqli扩展或PDO。 - SQL 注入风险:直接拼接变量到 SQL 语句极其危险。务必使用参数化查询(Prepared Statements)来处理用户输入的数据。
- 编码设置:原文使用
set names 'gbk',现代应用通常推荐使用utf8mb4以支持多语言字符。 - 内存限制:如果 CSV 文件非常大(如数百 MB),一次性加载可能导致内存溢出。建议分批处理或使用专用的高性能导入工具。
总结
通过 PHP 结合 fgetcsv 可以实现灵活的 CSV 数据导入功能。尽管上述示例基于较老的代码风格,但其解析逻辑依然有效。在现代开发中,请务必升级数据库连接方式并确保数据安全。
以上就是 PHP 将 CSV 文件导入到 MySQL 数据库的详细方法,更多关于 PHP 数据处理的技术资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













