使用 PHP 读取 CSV 文件并导入 MySQL 数据库

南乔
南乔
发布时间:2026-10-14| 3人浏览过
原创

本文将演示如何利用 PHP 脚本将 CSV 格式的数据文件上传至服务器,并通过逐行解析的方式将其存储到 MySQL 数据库中。

实现原理与步骤

该功能的核心逻辑分为三个主要步骤:

  1. 文件上传:通过 HTML 表单允许用户上传 CSV 文件,并将其临时存储在服务器上。
  2. 读取解析:使用 fopen 打开文件,并利用 fgetcsv 函数按行读取 CSV 数据,将其转换为 PHP 数组。
  3. 数据入库:遍历解析后的数据数组,构建 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 数据处理的技术资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。