You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过PHP实现多TXT文件数据导入MySQL数据库

问题分析与解决方案

首先明确两个核心问题:

  1. 你的brands表中id字段定义为NOT NULL但未设置自增属性,原脚本插入NULL会直接触发非空约束错误;
  2. 原插入语句只提供了id和bmw字段的值,未填充mercedes和audi字段,而这两个字段同样是NOT NULL约束,这是报错的直接原因。

前置准备:修正表结构

先修改brands表,将id设为自增主键,避免手动维护ID:

ALTER TABLE brands 
MODIFY COLUMN id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY;

方案一:三个文件数据一一对应插入同一行

如果三个TXT文件的行数相同,每行数据是一组对应品牌的记录(比如BMW文件第n行对应奔驰、奥迪文件的第n行),可以按以下方式实现:

<?php
$dsn = 'mysql:dbname=admin_cars;host=127.0.0.1';
$user = 'admin_cars';
$password = '********';

try {
    $dbh = new PDO($dsn, $user, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 开启异常模式便于调试
} catch (PDOException $e) {
    die('数据库连接失败: ' . $e->getMessage());
}

// 打开三个目标文件
$bmwFile = new SplFileObject('/var/www/html/bmw/index.txt');
$mercedesFile = new SplFileObject('/var/www/html/mercedes/index.txt');
$audiFile = new SplFileObject('/var/www/html/audi/index.txt');

// 预编译插入语句,明确指定字段列表避免顺序问题
$insertStmt = $dbh->prepare('INSERT INTO brands (bmw, mercedes, audi) VALUES (?, ?, ?)');

// 循环读取每行数据,直到任一文件读取完毕
while (!$bmwFile->eof() && !$mercedesFile->eof() && !$audiFile->eof()) {
    // 读取并清理每行数据(去除换行符和首尾空白)
    $bmwVal = trim($bmwFile->fgets());
    $mercedesVal = trim($mercedesFile->fgets());
    $audiVal = trim($audiFile->fgets());

    // 跳过空白行
    if (empty($bmwVal) && empty($mercedesVal) && empty($audiVal)) {
        continue;
    }

    // 绑定参数并执行插入
    $insertStmt->bindValue(1, $bmwVal, PDO::PARAM_STR);
    $insertStmt->bindValue(2, $mercedesVal, PDO::PARAM_STR);
    $insertStmt->bindValue(3, $audiVal, PDO::PARAM_STR);
    $insertStmt->execute();
}

echo '数据导入完成';
?>

方案二:各品牌数据独立插入行(其他字段填空字符串)

如果三个文件的数据没有对应关系,只是各自品牌的独立记录,可将未涉及的字段填充空字符串(符合NOT NULL约束):

<?php
$dsn = 'mysql:dbname=admin_cars;host=127.0.0.1';
$user = 'admin_cars';
$password = '********';

try {
    $dbh = new PDO($dsn, $user, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    die('数据库连接失败: ' . $e->getMessage());
}

// 定义文件路径与对应字段的映射
$fileFieldMap = [
    '/var/www/html/bmw/index.txt' => 'bmw',
    '/var/www/html/mercedes/index.txt' => 'mercedes',
    '/var/www/html/audi/index.txt' => 'audi'
];

// 遍历每个文件处理数据
foreach ($fileFieldMap as $filePath => $targetField) {
    $file = new SplFileObject($filePath);
    $insertStmt = $dbh->prepare('INSERT INTO brands (bmw, mercedes, audi) VALUES (?, ?, ?)');

    while (!$file->eof()) {
        $fieldVal = trim($file->fgets());
        if (empty($fieldVal)) {
            continue;
        }

        // 根据目标字段设置对应参数,其他字段填空字符串
        switch ($targetField) {
            case 'bmw':
                $insertStmt->bindValue(1, $fieldVal, PDO::PARAM_STR);
                $insertStmt->bindValue(2, '', PDO::PARAM_STR);
                $insertStmt->bindValue(3, '', PDO::PARAM_STR);
                break;
            case 'mercedes':
                $insertStmt->bindValue(1, '', PDO::PARAM_STR);
                $insertStmt->bindValue(2, $fieldVal, PDO::PARAM_STR);
                $insertStmt->bindValue(3, '', PDO::PARAM_STR);
                break;
            case 'audi':
                $insertStmt->bindValue(1, '', PDO::PARAM_STR);
                $insertStmt->bindValue(2, '', PDO::PARAM_STR);
                $insertStmt->bindValue(3, $fieldVal, PDO::PARAM_STR);
                break;
        }

        $insertStmt->execute();
    }
}

echo '数据导入完成';
?>

内容的提问来源于stack exchange,提问作者STACKKER

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 06:12:49