第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

將 PHP mySQL 與包含 BOM 的 CSV 數(shù)據(jù)結(jié)合使用

將 PHP mySQL 與包含 BOM 的 CSV 數(shù)據(jù)結(jié)合使用

PHP
米琪卡哇伊 2023-10-22 21:02:17
我有一個數(shù)據(jù)庫,其中保存了不同供應(yīng)商提供的某些商品的庫存水平。每個供應(yīng)商每天都會向我發(fā)送一份包含當(dāng)前庫存水平的 CSV 文件。我正在嘗試將庫存水平更新到我的數(shù)據(jù)庫中。我遇到的問題是,當(dāng)我從 CSV 中提取數(shù)據(jù)并通過查詢發(fā)送數(shù)據(jù)時,它無法正常工作。我在發(fā)送查詢之前已經(jīng)回顯了查詢,并且輸出很好。使用 phpMyAdmin,如果我只是粘貼回顯的代碼,它就可以正常工作。這讓我相信這是一個編碼問題。在 cPanel 文件管理器中查看 CSV 文件時,我發(fā)現(xiàn)文件開頭有一個奇怪的字符。(我相信這被稱為 BOM)。如果我刪除此字符并保存 CSV 文件,那么我的代碼將完美運行并且數(shù)據(jù)庫將按預(yù)期更新。在 cPanel 文件管理器中編輯文件,編碼打開為 ansi_x3.110-1983。雖然手動刪除角色可以解決問題,但這不是一個選項,因為我希望這是一個完全自動化的日常過程。我的代碼用于打開文件并從 CSV 中提取數(shù)據(jù):// Open File        $csvData = fopen($file, "r");       if($csvData !== FALSE){  while(!feof($csvData))  {      $csvRow[] = fgetcsv($csvData, 100);  }}// Close filefclose($csvData);我的代碼用于構(gòu)建簡單的搜索查詢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)它成功地從第一行數(shù)據(jù)中刪除 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 過濾器方法會產(chǎn)生此輸出。進一步說明,您會注意到在我的更新查詢輸出中,SET 數(shù)量列中有一個空格。此空格在 csv 文件中不可見。該查詢是用構(gòu)建的$updateQuery = "UPDATE supplier SET ".$supplier." = '".$row[2]."' WHERE supplierItemCode = '".$row[0]."'";關(guān)于到底是什么導(dǎo)致了這個問題以及如何解決這個問題的任何建議。提前致謝。
查看完整描述

2 回答

?
慕妹3146593

TA貢獻1820條經(jīng)驗 獲得超9個贊

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


我剛剛編寫了一個簡單的函數(shù)來轉(zhuǎn)換我傳遞給 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 會導(dǎo)致此類問題,以及為什么完全刪除它不起作用。感謝大家的幫助讓我發(fā)現(xiàn)了編碼問題。


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

TA貢獻1853條經(jīng)驗 獲得超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);

}


查看完整回答
反對 回復(fù) 2023-10-22
  • 2 回答
  • 0 關(guān)注
  • 188 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號