亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將 PHP mySQL 與包含 BOM 的 CSV 數據結合使用

將 PHP mySQL 與包含 BOM 的 CSV 數據結合使用

PHP
米琪卡哇伊 2023-10-22 21:02:17
我有一個數據庫,其中保存了不同供應商提供的某些商品的庫存水平。每個供應商每天都會向我發送一份包含當前庫存水平的 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 filefclose($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]."'";關于到底是什么導致了這個問題以及如何解決這個問題的任何建議。提前致謝。
查看完整描述

2 回答

?
慕妹3146593

TA貢獻1820條經驗 獲得超9個贊

我終于找到了可行的解決方案。經過大量調查后,我相信它是用 UTF-16 編碼的,盡管 BOM 字符可能已經說明了這一點。


我剛剛編寫了一個簡單的函數來轉換我傳遞給 SQL 的每個 CSV 值。


function Convert($str)

    {

        return mb_convert_encoding($str, "UTF-8", "UTF-16BE");

    }


........


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

                

我不確定為什么 BOM 會導致此類問題,以及為什么完全刪除它不起作用。感謝大家的幫助讓我發現了編碼問題。


查看完整回答
反對 回復 2023-10-22
?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

嘗試對打開和讀取 CSV 文件的代碼進行以下修改。它檢查 BOM 是否存在,如果存在則繞過它:


$cvsRow = [];

// Open File

$csvData = fopen($file, "r");

if($csvData !== FALSE)

{

  $BOM = fread($csvData, 4); // read potential BOM sequences to see if one is present or not

  if ($BOM !== FALSE)

  {

    if (strlen($BOM) >= 3 && substr_compare($BOM, "\xef\xbb\xbf", 0, 3) == 0)

    {

      fseek($csvData, 3); // found UTF-8 encoded BOM

    }

    elseif (strlen($BOM) >= 2 && (substr_compare($BOM, "\xfe\xff", 0, 2) == 0 || substr_compare($BOM, "\xff\xfe", 0, 2) == 0))

    {

      fseek($csvData, 2); // found UTF-16 encoded BOM

    }

    elseif ($BOM != "\00\00\xfe\xff" && $BOM != "\xff\xfe\00\00")

    {

      fseek($csvData, 0); // did not find UTF-32 encoded BOM

    }

    while(!feof($csvData))

    {

        $csvRow[] = fgetcsv($csvData, 100);

    }

  }

  // Close file (only if it has been successfully opened)

  fclose($csvData);

}


查看完整回答
反對 回復 2023-10-22
  • 2 回答
  • 0 關注
  • 171 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號