将PHP mySQL与包含BOM的CSV数据结合使用

问题描述

我有一个数据库,该数据库保存不同供应商提供的某些商品的库存水平。每个供应商都会向我发送每日CSV文件以及其当前库存水平。我正在尝试将库存水平更新到我的数据库中。

我遇到的问题是,当我从CSV中提取数据并通过查询发送数据时,它无法正常工作。

在发送查询之前,我已经回显了查询,并且输出很好。使用phpMyAdmin,如果我只是粘贴回显的代码,它就可以正常工作。这使我相信这是一个编码问题。

在cPanel文件管理器中查看CSV文件,我发现文件开头有一个奇数字符。 (我相信这是生成BOM的方法)。如果删除此字符并保存CSV文件,则我的代码可以正常工作,并且数据库将按预期更新。

enter image description here

在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
  }

如前所述,如果我简单地将$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表筛选器方法将产生此输出。

Sample output

作为进一步的说明,您会注意到在我的Update查询输出中,SET数量列中有一个空格。该空间在csv文件中不可见。

此查询的构建依据

$updateQuery = "UPDATE supplier SET ".$supplier." = '".$row[2]."' WHERE supplierItemCode = '".$row[0]."'";

有关导致此问题的确切原因以及如何解决此问题的任何建议。

谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)