PHP:字符串不等于字符串



项目:

我正在解析 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("", "", $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 . "] --rn";
$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("", "", $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.rn";
}
else {
echo "Error: Order Number ".$current_order_number." Line Already Exists in osl_daily.rn";
}
}
else {
echo "Error: Order Number ".$current_order_number." Line Already Exists in osl.rn";
}
$i++;
}
if (!feof($handle)) {
echo "Error: unexpected fgets() failrn";
}
fclose($handle);
}
}
else {
echo "Error: File Upload Failedrn";
}

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?

前三个字符似乎是问题所在。文件开头有字符 239、187 和 191。 寻找这种代码组合似乎为 UTF-8 提供了字节顺序标记 (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;
}

我们也可以使用str_contains来获取匹配的字符串。 该函数检查字符串并返回布尔值 true(如果存在),否则返回 false。

if (str_contains($str, $substr)) {
return "PHP string contains '$str'";
} else {
return "PHP string does not contain '$substr";
}

最新更新