PHP:字符串不等于字符串

时间:2018-04-09 18:06:57

标签: php csv encoding ascii

项目:

我正在解析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

我试过:(删除null)

$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。

1 个答案:

答案 0 :(得分:0)

前3个字符似乎是问题,你在文件的开头有字符239,187和191。查看这些代码组合似乎为UTF-8提供了一个字节顺序标记(https://en.wikipedia.org/wiki/Byte_order_mark)。

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

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