【问题标题】:PHP: string does not equal stringPHP:字符串不等于字符串
【发布时间】:2018-04-09 18:06:56
【问题描述】:

项目:

我正在解析一个 CSV 文件并将其数据插入到数据库中。在一个循环中,我获取 CSV 值并验证它们(确保它们已被填充),这些值的存储方式如下:

$current_order_number = $array[$i]['order_number'] ?? null;

("order_number" 是 CSV 文件中标题的名称。)

问题:

当我手动输入“order_number”时,$current_order_number 为空。

当我从 CSV 文件中复制“order_number”时,$current_order_number 是正确的。

(这是唯一可以执行此操作的 CSV 标头。我手动输入了其余部分,它们运行良好。)

调试:

我使用了一个字符串到ASCII的转换器,发现正确的字符串(“order_number”)转换成:

NULL 111 114 100 101 114 95 110 117 109 98 101 114

同时将不正确的字符串(“order_number”)转换成

111 114 100 101 114 95 110 117 109 98 101 114

我试过(删除空值):

$value = str_replace("\0", "", $value);

而且(认为是编码):

$value = utf8_encode($value);

没有运气。

完整代码:

$target_path = $target_path . basename( $_FILES['csv_raw']['name'] );

if ( move_uploaded_file($_FILES['csv_raw']['tmp_name'], $target_path) ) {
  echo "File Upload Successful: -- [" . $target_path . "] --\r\n";
  $array = $fields = array();
  $i = 0;
  $handle = @fopen($target_path, "r");
  if ($handle) {
    while (($row = fgetcsv($handle, 4096)) !== false) {
      if (empty($fields)) {
        $fields = $row;
        continue;
      }
      foreach ($row as $k=>$value) {
        if (strlen(trim($value)) == 0) {
          $value = 0;
        }
        $value = str_replace("\0", "", $value);
        $array[$i][$fields[$k]] = $value;
      }
      //print_r($array[$i]);
      //"order_number"(correct [NULL 111 114 100 101 114 95 110 117 109 98 101 114])
      //"order_number" (incorrect [111 114 100 101 114 95 110 117 109 98 101 114])
      $current_order_number = $array[$i]['order_number'] ?? null;
      $current_order_line = $array[$i]['order_line'] ?? null;
      $current_shipment_number = $array[$i]['shipment_number'] ?? null;
      $current_package_number = $array[$i]['package_number'] ?? null;
      $current_package_item_number = $array[$i]['package_item_num'] ?? null;
      $current_item_code = $array[$i]['item_code'] ?? null;
      $current_quantity = $array[$i]['qty_shipped'] ?? null;
      $query = query("SELECT * FROM `osl` WHERE `order_number` = ".$current_order_number." AND `item_code` = ".$current_item_code." ");
      confirm($query);

      if (mysqli_num_rows($query) == 0) {
        $query = query("SELECT * FROM `osl_daily` WHERE `order_number` = ".$current_order_number." AND `item_code` = ".$current_item_code." ");
        confirm($query);
        if (mysqli_num_rows($query) == 0) {
          $query = query("
          INSERT INTO `osl_daily` (`local_id`, `order_number`, `order_line`, `shipment_number`, `package_number`, `package_item_number`,`item_code`, `quantity`)
          VALUES (NULL,".$current_order_number.",".$current_order_line.",".$current_shipment_number.",".$current_package_number.",".$current_package_item_number.",".$current_item_code.",".$current_quantity.")
          ");
          confirm($query);
          echo "Success: Order Number ".$current_order_number." Lines Have Been Imported Successfully.\r\n";
        }
        else {
          echo "Error: Order Number ".$current_order_number." Line Already Exists in osl_daily.\r\n";
        }
      }
      else {
        echo "Error: Order Number ".$current_order_number." Line Already Exists in osl.\r\n";
      }

      $i++;
    }
    if (!feof($handle)) {
      echo "Error: unexpected fgets() fail\r\n";
    }
    fclose($handle);
  }
}
else {
  echo "Error: File Upload Failed\r\n";
}

CSV 代码: order_number,order_line,shipment_number,package_number,package_item_num,item_code,qty_shipped 43441,1,37294,1,1,10000,1 43441,2,37294,1,2,10010,1

为什么“order_number”不等于“order_number”?以及如何使 order_number = order_number?

【问题讨论】:

  • 也许如果您向我们展示真正的代码而不是从这里到那里的一两行代码,我们可能会更有帮助
  • 您的$i 设置是否正确?
  • 更新问题。文字“order_number”是问题
  • 能否也发一个csv文件的样本,几行就够了
  • 不知何故,您的 csv 似乎以空字节开头。你能把它去掉吗?或者,您可以尝试使用 $array[$i]["\0order_number"](双引号!) 访问该值

标签: php csv encoding ascii


【解决方案1】:

前三个字符似乎是问题所在。文件开头有字符 239、187 和 191。看看这种代码组合似乎会为 UTF-8 提供 byte order mark (BOM)。

处理此问题的简单方法是将它们从第一个字段中删除(如果存在)...

if (empty($fields)) {
    if ( substr($row[0],0,3) === chr(239).chr(187).chr(191))    {
        $row[0] = substr($row[0], 3);
    }
    $fields = $row;
    continue;
}

【讨论】:

  • 这是完美的。
猜你喜欢
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 2020-07-02
  • 2015-02-05
  • 2016-06-28
  • 2014-05-11
  • 1970-01-01
  • 2018-05-23
相关资源
最近更新 更多