问题描述
我有一个数据库,该数据库保存不同供应商提供的某些商品的库存水平。每个供应商都会向我发送每日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
}
如前所述,如果我简单地将$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);
}
}
作为进一步的说明,您会注意到在我的Update查询输出中,SET数量列中有一个空格。该空间在csv文件中不可见。
此查询的构建依据
$updateQuery = "UPDATE supplier SET ".$supplier." = '".$row[2]."' WHERE supplierItemCode = '".$row[0]."'";
有关导致此问题的确切原因以及如何解决此问题的任何建议。
谢谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)