From:             RQuadling at GMail dot com
Operating system: Windows XP SP2
PHP version:      5CVS-2006-08-18 (snap)
PHP Bug Type:     Streams related
Bug description:  fgetcsv() doesn't report delimiter/enclosure greater than 1 
char like fputcsv.

Description:
------------
Hi.

The issue was initially caught when I used '\t' rather than "\t".

The source for fputcsv reports notices when you use a delimiter or an
enclosure of > 1 character. But fgetcsv doesn't report this.

The following patch should fix this.

Index: file.c
===================================================================
RCS file: /repository/php-src/ext/standard/file.c,v
retrieving revision 1.449
diff -u -r1.449 file.c
--- file.c      16 Jul 2006 15:54:25 -0000      1.449
+++ file.c      18 Aug 2006 10:30:51 -0000
@@ -2081,6 +2081,8 @@
                        if (delimiter_str_len < 1) {
                                php_error_docref(NULL TSRMLS_CC,
E_WARNING, "delimiter must be a character");
                                RETURN_FALSE;
+                       } else if (delimiter_str_len > 1) {
+                               php_error_docref(NULL TSRMLS_CC, E_NOTICE,
"delimiter must be a single character");
                        }

                        /* use first character from string */
@@ -2091,6 +2093,8 @@
                        if (enclosure_str_len < 1) {
                                php_error_docref(NULL TSRMLS_CC,
E_WARNING, "enclosure must be a character");
                                RETURN_FALSE;
+                       } else if (enclosure_str_len > 1) {
+                               php_error_docref(NULL TSRMLS_CC, E_NOTICE,
"enclosure must be a single character");
                        }
                        /* use first character from string */
                        enclosure = enclosure_str[0];



Reproduce code:
---------------
<?php
error_reporting(E_ALL);
++$dummy; // Proof of notices working.

// Store CSV like data in temporary file.
$fp = tmpfile();

// Real data I've been given - yeuch!
fwrite($fp,  <<< END_DATA
BO1`11519`112733`CELTIC002`2002/01/02````D.W.`Marilyn````````2`2``2`1225`10039
BO1`11520`=VARIOUS`HILL
1`2002/01/18````Various`Marilyn````````36``36`36`1225`VARIOUS
BO1`11521`+VARIOUS`HILL
1`2002/01/14````Various`Marilyn````````32``32`32`1225`VARIOUS
BO1`11522`\\VARIOUS`HILL
1`2002/01/14````Various`Marilyn````````133``133`133`1225`VARIOUS
BO1`11523`113027`FRAIKIN006`2002/01/02````S.W.`Marilyn```````10`1``1`1`1225`AAN124

END_DATA
);

// Reset the file pointer.
fseek($fp, 0, SEEK_SET);

// Get data and report the number of 
$a = array
        (
        fgetcsv($fp, 8192, '``'), // Expect notice - php_error_docref(NULL
TSRMLS_CC, E_NOTICE, "delimiter must be a single character")
        fgetcsv($fp, 8192, '`', '\t'), // Expect notice - php_error_docref(NULL
TSRMLS_CC, E_NOTICE, "enclosure must be a single character");
        fgetcsv($fp, 8192, '`', '\t'), // Expect notice - php_error_docref(NULL
TSRMLS_CC, E_NOTICE, "enclosure must be a single character");
        fgetcsv($fp, 8192, '`', '\t'), // Expect notice - php_error_docref(NULL
TSRMLS_CC, E_NOTICE, "enclosure must be a single character");
        fgetcsv($fp, 8192, '`', "\t"), // Nothing wrong with this one.
        );
foreach($a as $b)
        {
        // Each row has 23 values.
        echo count($b), ' ', $b[2], "\n";
        }
fclose($fp);
?>

Expected result:
----------------
Notices about enclosure or delimiter not being a single character like
fputcsv

Actual result:
--------------
Notice: Undefined variable: dummy in C:\a.php on line 3
23 112733
23 =VARIOUS
23 +VARIOUS
3 VARIOUS`HILL
1`2002/01/14````Various`Marilyn````````133``133`133`1225`VARIOUS
BO1`11523`113027`FRAIKIN006`2002/01/02````S.W.`Marilyn```````10`1``1`1`1225`AAN124

1

-- 
Edit bug report at http://bugs.php.net/?id=38496&edit=1
-- 
Try a CVS snapshot (PHP 4.4): 
http://bugs.php.net/fix.php?id=38496&r=trysnapshot44
Try a CVS snapshot (PHP 5.2): 
http://bugs.php.net/fix.php?id=38496&r=trysnapshot52
Try a CVS snapshot (PHP 6.0): 
http://bugs.php.net/fix.php?id=38496&r=trysnapshot60
Fixed in CVS:                 http://bugs.php.net/fix.php?id=38496&r=fixedcvs
Fixed in release:             
http://bugs.php.net/fix.php?id=38496&r=alreadyfixed
Need backtrace:               http://bugs.php.net/fix.php?id=38496&r=needtrace
Need Reproduce Script:        http://bugs.php.net/fix.php?id=38496&r=needscript
Try newer version:            http://bugs.php.net/fix.php?id=38496&r=oldversion
Not developer issue:          http://bugs.php.net/fix.php?id=38496&r=support
Expected behavior:            http://bugs.php.net/fix.php?id=38496&r=notwrong
Not enough info:              
http://bugs.php.net/fix.php?id=38496&r=notenoughinfo
Submitted twice:              
http://bugs.php.net/fix.php?id=38496&r=submittedtwice
register_globals:             http://bugs.php.net/fix.php?id=38496&r=globals
PHP 3 support discontinued:   http://bugs.php.net/fix.php?id=38496&r=php3
Daylight Savings:             http://bugs.php.net/fix.php?id=38496&r=dst
IIS Stability:                http://bugs.php.net/fix.php?id=38496&r=isapi
Install GNU Sed:              http://bugs.php.net/fix.php?id=38496&r=gnused
Floating point limitations:   http://bugs.php.net/fix.php?id=38496&r=float
No Zend Extensions:           http://bugs.php.net/fix.php?id=38496&r=nozend
MySQL Configuration Error:    http://bugs.php.net/fix.php?id=38496&r=mysqlcfg

Reply via email to