php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #29163 field consisting of one space char is read as an empty string by fgetcsv
Submitted: 2004-07-14 22:02 UTC Modified: 2005-03-14 01:00 UTC
Votes:3
Avg. Score:5.0 ± 0.0
Reproduced:2 of 2 (100.0%)
Same Version:2 (100.0%)
Same OS:2 (100.0%)
From: ramon_herrera at eloyalty dot com Assigned: moriyoshi (profile)
Status: No Feedback Package: Filesystem function related
PHP Version: 5.0.1 OS: win2k & GNU/Linux (FC2)
Private report: No CVE-ID: None
Welcome back! If you're the original bug submitter, here's where you can edit the bug or add additional notes.
If this is not your bug, you can add a comment by following this link.
If this is your bug, but you forgot your password, you can retrieve your password here.
Password:
Status:
Package:
Bug Type:
Summary:
From: ramon_herrera at eloyalty dot com
New email:
PHP Version: OS:

 

 [2004-07-14 22:02 UTC] ramon_herrera at eloyalty dot com
Description:
------------
A field consisting of one space character is read as an empty string by the fgetcsv function in version 5.0.0 where the version 4.3.7 fgetcsv reads the space as it is presented.

The startup .bat file and the CSV file are both listed below.

./test.bat, set to use the PHP 5.0.0 binaries
--------------------------------------------\
@echo off
set PHPROOT=.
REM set PHPVER=4.3.7
set PHPVER=5.0.0
set PHPEXE=%PHPROOT%\bin_%PHPVER%\php.exe
set PHPINI=%PHPROOT%\etc\test.ini
set PHPPHP=%PHPROOT%\usr\test.php
%PHPEXE% -c %PHPINI% -f %PHPPHP%
--------------------------------------------/

./var/zinput.txt
--------------------------------------------\
foo,bar,nextisspace, ,previsspace,last

--------------------------------------------/

Reproduce code:
---------------
<?
define('ZINPUT', 'var/zinput.txt');;
define('FDLM',   ',');
define('LLEN',   512);

$fhin  = @fopen(ZINPUT, 'rb');
while ( FALSE !== ($s = fgetcsv($fhin, LLEN, FDLM)) )
	$inputlines[] = $s;
fclose($fhin);

var_dump($inputlines);

echo "\r\nTested with version " . phpversion() . "\r\n";
?>

Expected result:
----------------
D:\foo>test.bat
array(1) {
  [0]=>
  array(6) {
    [0]=>
    string(3) "foo"
    [1]=>
    string(3) "bar"
    [2]=>
    string(11) "nextisspace"
    [3]=>
    string(1) " "
    [4]=>
    string(11) "previsspace"
    [5]=>
    string(4) "last"
  }
}

Tested with version 4.3.7

D:\foo>

Actual result:
--------------
D:\foo>test.bat
array(1) {
  [0]=>
  array(6) {
    [0]=>
    string(3) "foo"
    [1]=>
    string(3) "bar"
    [2]=>
    string(11) "nextisspace"
    [3]=>
    string(0) ""
    [4]=>
    string(11) "previsspace"
    [5]=>
    string(4) "last"
  }
}

Tested with version 5.0.0

D:\foo>

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2004-07-15 18:07 UTC] ramon_herrera at eloyalty dot com
Version 4.3.8 results are identical to the version 4.3.7 results.
 [2004-07-20 22:40 UTC] moriyoshi@php.net
The reported behaviour is inconsistent with these of 
older versions prior to 4.3.4.

Assigning to the person who broke it.

 [2004-07-20 22:53 UTC] ramon_herrera at eloyalty dot com
The version 4.3.8 fgetcsv() works fine.  It reads a single space character from a CSV field containing a single space character.  If that is what my data is then that is exactly what I want fgetcsv() to read.

The version 5.0.0 fgetcsv() drops that space character.

Thank you very much for your efforts.
 [2004-07-20 23:07 UTC] iliaa@php.net
Current PHP 4 behavior is correct, old behavior was wrong. 
Opening the given file with other CVS parsers such as 
OpenOffice confirms that the PHP 4 behavior is correct. 
 [2004-07-20 23:23 UTC] moriyoshi@php.net
*sigh* as I mentioned again and again, whether it's 
correct or not doesn't matter. Personally I'm for Ilia's 
opinion, but compatibility should always come first.

 [2004-07-21 05:54 UTC] ramon_herrera at eloyalty dot com
Is this a matter of compatibility versus correctness?

What is the consensus among the developers/maintainers regarding this matter?

Thanks again.
 [2004-08-04 08:33 UTC] ramon_herrera at eloyalty dot com
Is this bug destined to be fixed in a later release?
 [2004-08-12 08:25 UTC] ramon_herrera at eloyalty dot com
The bug still shows up in CVS php5-200408120430 under Fedora Core 2.
 [2004-08-13 07:16 UTC] ramon_herrera at eloyalty dot com
This bug shows up in version 5.0.1 under Fedora Core 2.
 [2004-08-13 08:12 UTC] ramon_herrera at eloyalty dot com
IMO, correctness trumps backwards compatibility in this case, especially since pre-4.3.4 was so long ago.  Compatibility with something that was broken is not a persuasive argument.

If a single space char is what a CSV field is comprised of, then, IMO, that is exactly how it should be represented in this function's result.  Must there be quotes?  Backslash escapes?  What else is needed?

Moriyoshi, what do your colleagues believe?
 [2004-09-02 15:04 UTC] php at tntweb dot f9 dot co dot uk
White space between fields should be ignored, so the field ...,  ,... should be returned as an empty string and not a single space. The latest PHP 4 version breaks this and returns a single space.

To include leading or trailing spaces then they must be quoted.

For further info read http://www.creativyst.com/Doc/Articles/CSV/CSV01.htm
 [2004-09-02 17:53 UTC] ramon_herrera at eloyalty dot com
Thanks to the person at "php at tntweb dot f9 dot co dot uk" for pointing to what I see is a very nice-looking doc at the creativyst.com site.

Does anybody know if something like an RFC exists for CSV?  If not, should we just make one for PHP and stick with it?  Or should we compare CSV functions against those of other popular software applications and judge accordingly?

IMPORTANT: The creativyst.com page that's linked to in the previous comment has a restrictive-looking notice at the bottom.  Don't copy/redistribute that material without their permission.
 [2004-10-15 18:33 UTC] moriyoshi@php.net
Just FYI: have a look at http://voltex.jp/articles/
csvtests/

 [2005-03-06 20:42 UTC] sniper@php.net
Please try using this CVS snapshot:

  http://snaps.php.net/php5-latest.tar.gz
 
For Windows:
 
  http://snaps.php.net/win32/php5-win32-latest.zip


 [2005-03-14 01:00 UTC] php-bugs at lists dot php dot net
No feedback was provided for this bug for over a week, so it is
being suspended automatically. If you are able to provide the
information that was originally requested, please do so and change
the status of the bug back to "Open".
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Fri Mar 29 10:01:28 2024 UTC