我有一个数据库,其中保存了不同供应商提供的某些商品的库存水平。每个供应商每天都会向我发送一份包含当前库存水平的 CSV 文件。我正在尝试将库存水平更新到我的数据库中。
我遇到的问题是,当我从 CSV 中提取数据并通过查询发送数据时,它无法正常工作。
我在发送查询之前已经回显了查询,并且输出很好。使用 phpMyAdmin,如果我只是粘贴回显的代码,它就可以正常工作。这让我相信这是一个编码问题。
在 cPanel 文件管理器中查看 CSV 文件时,我发现文件开头有一个奇怪的字符。(我相信这被称为 BOM)。如果我删除此字符并保存 CSV 文件,那么我的代码将完美运行并且数据库将按预期更新。
在 cPanel 文件管理器中编辑文件,编码打开为 ansi_x3.110-1983。虽然手动删除角色可以解决问题,但这不是一个选项,因为我希望这是一个完全自动化的日常过程。
我的代码用于打开文件并从 CSV 中提取数据:
// Open File
$csvData = fopen($file, "r");
if($csvData !== FALSE)
{
while(!feof($csvData))
{
$csvRow[] = fgetcsv($csvData, 100);
}
}
// Close file
fclose($csvData);
我的代码用于构建简单的搜索查询
foreach($csvRow as $row)
{
$searchQuery = "SELECT * FROM supplier WHERE supplierItemCode = '".$row[0]."'";
$result = $conn->query($searchQuery);
echo "<br>".$searchQuery;
if($result->num_rows > 0)
{
// CODE NEVER REACHES HERE
}
如前所述,如果我只是将 echo 粘贴$searchQuery到 phpMyAdmin 中并运行查询,它就可以正常工作。
我尝试使用fseek($csvData, 2)它成功地从第一行数据中删除 BOM 字符,但这没有效果。
按照建议,我尝试过使用
$csvData = fopen($file, "r");
$BOM = null;
if($csvData !== FALSE)
{
$BOM = fread($csvData, 3);
if($BOM !== FALSE)
{
if($BOM != "\xef\xbb\xbf")
{
echo "<h5>BOM: ".$BOM; // This code is executed every time
fseek($csvData, 0);
}
}
//fseek($csvData, 2); // This was my earlier attempts without the above BOM filter
while(!feof($csvData))
{
$csvRow[] = fgetcsv($csvData, 100);
}
}
使用 BOM 过滤器方法会产生此输出。
进一步说明,您会注意到在我的更新查询输出中,SET 数量列中有一个空格。此空格在 csv 文件中不可见。
该查询是用构建的
$updateQuery = "UPDATE supplier SET ".$supplier." = '".$row[2]."' WHERE supplierItemCode = '".$row[0]."'";
关于到底是什么导致了这个问题以及如何解决这个问题的任何建议。
提前致谢。
慕妹3146593
暮色呼如