如何通过PHP实现多TXT文件数据导入MySQL数据库
问题分析与解决方案
首先明确两个核心问题:
- 你的
brands表中id字段定义为NOT NULL但未设置自增属性,原脚本插入NULL会直接触发非空约束错误; - 原插入语句只提供了
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
相关产品推荐
相关产品推荐

