从 PHP 8.0 到 8.1 中,fgetcsv 通过 SplFileObject 的行为并不相同 - 如何保持向后兼容?

Behavior of fgetcsv through SplFileObject is not the same from PHP 8.0 to 8.1 - how to stay backwards compatible?

提问人:Réal Thibeault 提问时间:10/21/2022 最后编辑:Réal Thibeault 更新时间:10/22/2022 访问量:102

问:

我的代码中有类似的东西,几年来运行良好:

$spl_file = new SplFileObject($file_path, 'r', false, null);
$spl_file->setFlags(SplFileObject::READ_CSV | SplFileObject::READ_AHEAD);
$result = $spl_file->fgetcsv();

我在 PHP 8.0 和 PHP 8.1 之间做了不同的测试。如果我们的文件(例如 $file_path)中有一行,例如 或 ,则在 PHP 8.0 和 PHP 8.1 的所有情况下结果都是相同的,例如包含 和 的数组。这是预期行为。"Value1","Val"Value1,ValValue1Val

但是,如果我们有一个损坏的 csv 文件,它在两个 PHP 版本中的作用并不相同。我发现不同的案例有不同的行为。例如,对于 和 。PHP 8.0 在每种情况下都会返回一个空数组,但 PHP 8.1 将返回前 2 种情况 和 ,以及最后一种情况。"Value1,Val"Value1","ValValue1","ValValue1ValValue1"Val

这是一个很大的改进,但是此更新可能会对某些现有案例产生重要影响。有没有办法在更新到 8.1 时保持 fgetcsv 的相同行为?

php fgetcsv splfile对象

评论

1赞 Tangentially Perpendicular 10/22/2022
如果您希望在处理损坏的数据时保证某些行为,您可能必须编写自己的解析器。这里的真正解决方案是修复创建损坏的CSV文件的任何内容。
0赞 Réal Thibeault 10/22/2022
@TangentiallyPerpendicular我们有成千上万的客户上传他们自己的文件,我们不能只是修复“损坏的CSV文件”。在某些可能存在问题的情况下,这些文件可能具有被跳过的标头,因为它们没有有效的 csv 行。现在,它们可以被“验证”,而不应该被“验证”。
0赞 Réal Thibeault 10/22/2022
我写了“这些文件可以有被跳过的标题,因为它们没有有效的 csv 行”——例如,它可以是一个包含有关文件源的源、日期等的通用信息的标题。
0赞 Chris Haas 10/22/2022
@RéalThibeault,我认为这是带来变化的错误。我非常怀疑PHP会恢复这一点,但如果你真的想推动它,那可能就是这样做的地方。

答: 暂无答案