ID: 46282
Comment by: arne at bukkie dot nl
Reported By: mattias dot geniar at gmail dot com
Status: No Feedback
Bug Type: dBase related
Operating System: CentOS 5.2
PHP Version: 5.2.6
New Comment:
The problem is that a record of type D (date) as well as type L
(logical) get's into the database with the length of 0 and not 8 (or 1
in the case of L).
I traced down this bug to the put_dbf_field() function in dbf_head.c In
there the record is written to disk, but in neither of the D and L types
the length of the field is put in the correct struct. The fix is to
remove both the cases for D and L so the length is set using the default
case.
Was:
196 switch (dbf->db_type) {
197 case 'N':
198 dbfield.dbf_flen[0] = dbf->db_flen;
199 dbfield.dbf_flen[1] = dbf->db_fdc;
200 break;
201 case 'D':
202 dbf->db_flen = 8;
203 break;
204 case 'L':
205 dbf->db_flen = 1;
206 break;
207 default:
208 put_short(dbfield.dbf_flen, dbf->db_flen);
Is:
196 switch (dbf->db_type) {
197 case 'N':
198 dbfield.dbf_flen[0] = dbf->db_flen;
199 dbfield.dbf_flen[1] = dbf->db_fdc;
200 break;
201 default:
202 put_short(dbfield.dbf_flen, dbf->db_flen);
203 }
I am aware this is not the way to submit fixes but I'm limited by time
and still wanted to share the knowledge I did proceed using comments to
specify this. Hopefully someone with an CVS account can use this info to
get the change into the repository.
Previous Comments:
------------------------------------------------------------------------
[2009-01-15 10:48:38] no at spam dot net
I have the same problem on FreeBSD 6.3-STABLE, PHP5.2.8
------------------------------------------------------------------------
[2008-11-18 01:00:02] 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".
------------------------------------------------------------------------
[2008-11-10 11:32:59] [email protected]
Please try using this CVS snapshot:
http://snaps.php.net/php5.2-latest.tar.gz
For Windows:
http://windows.php.net/snapshots/
------------------------------------------------------------------------
[2008-10-12 14:03:50] mattias dot geniar at gmail dot com
Description:
------------
Creating a dBase file with a DATE-field type, will corrupt the
database. Work-around as for now is to use a CHAR-type and convert it
later manually.
This bug is similar to #42261, which dates back to August 2007.
Reproduce code:
---------------
<?php
// database "definition"
$def = array(
array("date", "D"),
array("name", "C", 50),
array("email", "C", 128),
array("ismember", "L")
);
// creation
if (!dbase_create('test.dbf', $def)) {
echo "Error, can't create the database\n";
}
// open in read-write mode
$db = dbase_open('test.dbf', 2);
if ($db) {
for ($i = 0; $i < 5; $i++) {
dbase_add_record($db, array(
date('Ymd'),
'Name #'. $i,
'Email #'. $i,
'T'));
}
dbase_close($db);
}
?>
Expected result:
----------------
A simple database with 5 lines, where DATE, Name & Email are entered
correctly.
Actual result:
--------------
The code above will create file called "test.dbf", which is corrupted
when opening it with any normal DBF-viewer (CDBF, DBF Manager, ...). If
the DATE-field is replaced with a CHAR-field, all works fine.
Date-format is taken from the PHP.NET website and confirmed by the
dBase-format.
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=46282&edit=1