PHP的fgetcsv在文件开头返回false

3
这是一个在Windows下运行的PHP脚本。它之前一直工作正常,但最近出现了问题。
文件已打开并返回有效的文件句柄:$fh = fopen($filename, 'r'); 然而,在第一次调用fgetcsv时,它返回false
$headers = fgetcsv($fh, 6000, ',');
$line_no++;
if($headers === FALSE){
    echo 'Error parsing file headers';
}

我尝试处理所有的csv文件时都会出现这种情况。我已经尝试了一些其他方法,但似乎都没有用:

  • ini_set('auto_detect_line_endings', true); 在打开文件之前设置
  • rewind($fh); 在打开文件之后设置
  • 在第二个参数中使用0或类似6000的数字。
  • 将文件的行结束样式从Unix更改为Windows和Mac。

看起来像是Windows系统导致该文件无法解析。

有没有办法从fgetcsv中返回实际的错误信息?文档并没有提到可以返回错误信息,只说在任何错误时返回false。是否还有其他Windows设置可能会导致问题?Windows安全设置给予所有人对文件的完全控制。

2个回答

2
问题在于脚本开头的更改使用相同的文件作为锁定文件,因此脚本不会在同一时间运行两次相同的文件。然后,在脚本稍后实际想要解析文件时,我再次打开它(这是成功的),但是我无法实际读取内容。
我使用的解决方案是基于文件名创建临时锁定文件,而不是使用实际文件。例如:$filename.'.lock' 这是我的一个愚蠢错误,但是如果PHP在某个时候返回或写入错误/警告,那将会更有帮助。

我以前在自己的代码中遇到过这个问题,这是一个很好的见解,可能会帮助很多人,因为我认为这是一个常见的错误。尽管如此,它仍然没有回答这个问题。fgetcsv返回错误的原因还有其他的,比如它到达了文件结尾(也许文件是空的)。在这里甚至可能无法访问错误?也许函数中根本没有实现错误处理,这是一个疏忽,但可以通过贡献代码来长期修正它,更新在未来的PHP版本中。 - cazort

-1

调试此问题的规范方法是“print_r($headers)”。

fgetcsv返回一个数组,它必须为空或非数组。如果您可以配置(或已经配置)PHP将错误记录到已知位置(使用IIS的Windows应该是“syslog”,并且应该显示在事件查看器中),则应该能够找出问题所在。


没有运气。print_r 没有给出任何东西,这是我所怀疑的,因为它已经等于 false。我也打开了所有 PHP 错误(E_ALL),除了两个不相关的通知外,什么都没有得到。 - William W
这对我也不起作用。PHP文档说此函数返回“其他错误为false”,但它没有说明如何显示或访问此类错误。在这种情况下,$headers只是一个等于false的布尔变量。 - cazort

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接