我重写了这个帮助请求,并简化了我试图尽量减少移动部件数量的内容。
我是一名经验丰富的 OOP 程序员,但这是我使用 LAMP、Laravel 或 Eloquent 的第一个项目。
我正在 Laravel-Spark 中构建数据导入工具。用户将提供一个 .csv 文件。我的程序将根据标题(第一)行数据确定提供了哪些数据。它将从那里向 MySQL 表中插入一个新行并更新提供的字段。
function ImportPositions($incomingfile)
{
if (($handle = fopen ( public_path () . '/ImportFiles/samplepositions.csv', 'r' )) !== FALSE) {
$header = fgetcsv($handle, 2000, ',');
$headercount = count($header);
while ( ($data = fgetcsv ( $handle, 2000, ',' )) !== FALSE ) {
$position = new Position;
$i = 0;
while ($i<$headercount):
$fieldname=$header[$i];
$fielddata=$data[$i];
// Example: $position->posno="12345";
$position->$fieldname=$fielddata;
$i++;
endwhile;
$position->save();
}
fclose ( $handle );
}
}
代码返回此错误。该字段肯定存在。
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'active' in 'field list' (SQL: insert into `positions` (`active`, `updated_at`, `created_at`) values (A, 2019-11-12 03:32:50, 2019-11-12 03:32:50))
在尝试调试时,这工作正常:
$fieldname2='active';
$fielddata2='A';
$position->$fieldname2=$fielddata2;
$position->save();
接下来,尝试证明我的派生值是有效的:
$fieldname=$header[$i];
$fielddata=$data[$i];
$fieldname2='active';
$fielddata2='A';
dump("|".$fieldname."|".$fieldname2."|");
dd("|".$fielddata."|".$fielddata2."|");
返回以下内容,因此两组变量看起来是相同的:
"|active|active|"
"|A|A|"
但是:当我用派生变量替换类型化变量时,它失败并给出上面列出的错误。
$fieldname=$header[$i];
$fielddata=$data[$i];
$position->$fieldname=$fielddata;
$position->save();
感谢您的帮助!
回答:我的输入文件有 BOM 标记,导致导入出现问题。它搞乱了 SQL 语句,即使它在显示脚本的调试消息中不可见。
修复:简单:在 Notepad++ 中打开导入文件,然后选中“ENCODING”。我的文件显示“UTF-8-BOM”。我将其更改为“UTF-8”并解决了问题。
感谢所有提供意见的人!
Tôi là một lập trình viên xuất sắc, rất giỏi!