ID: 47113
Updated by: [email protected]
Reported By: Shock dot art at gmail dot com
Status: Bogus
Bug Type: dBase related
Operating System: FreeBSD 6.3-STABLE
PHP Version: 5.2.8
New Comment:
"dbfield.dbf_flen" and "dbf->db_flen" - is not the same!!! :)
Sure, that was the problem. And 'D' an 'L' can use perfectly the
put_short(). They doesnt requires setting the value manually as 'N'.
What problem are you seeing? Thanks.
Previous Comments:
------------------------------------------------------------------------
[2009-01-18 10:45:09] Shock dot art at gmail dot com
Be attentive!!!
To fix this bug maybe must do replace some lines in module dbf_head.c
For function put_dbf_field()
In put_dbf_field 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);
maybe correct 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 case 'D':
202(delete) dbf->db_flen = 8;
202(add) dbfield.dbf_flen[0] = 8;
(add) dbfield.dbf_flen[1] = ??? dbf->db_fdc;?
203 break;
204 case 'L':
205(delete) dbf->db_flen = 1;
205(add) dbfield.dbf_flen[0] = 1;
(add) dbfield.dbf_flen[1] = ??? dbf->db_fdc;?
206 break;
207 default:
208 put_short(dbfield.dbf_flen, dbf->db_flen);
"dbfield.dbf_flen" and "dbf->db_flen" - is not the same!!! :)
compare with function "get_dbf_field":
153 dbf->db_type = dbfield.dbf_type;
154 switch (dbf->db_type) {
155 case 'N':
156 case 'F':
157 dbf->db_flen = dbfield.dbf_flen[0];
158 dbf->db_fdc = dbfield.dbf_flen[1];
159 break;
160 case 'D':
161 dbf->db_flen = 8;
162 break;
163 case 'L':
164 dbf->db_flen = 1;
165 break;
166 default:
167 dbf->db_flen = get_short(dbfield.dbf_flen);
168 break;
169 }
I hopefully this is solve the problem and someone with an CVS account
can use this info to
get the change into the repository.
And i hope that "someone with an CVS" don't be a lazy for check my
code. :)
------------------------------------------------------------------------
[2009-01-18 10:29:06] Shock dot art at gmail dot com
Don't fixed!
------------------------------------------------------------------------
[2009-01-17 22:37:26] [email protected]
Duplicated of Bug #46282, which was hopefully fixed today.
Thanks.
------------------------------------------------------------------------
[2009-01-15 10:46:39] Shock dot art at gmail dot com
Creating a dBase file with a DATE-field type, will corrupt the
database.
------------------------------------------------------------------------
[2009-01-15 10:43:36] Shock dot art at gmail dot com
Description:
------------
Creating or opening a dBase file with a DATE-field type, will create a
database with lenght = 0 for "date" field type.
Reproduce code:
---------------
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=47113&edit=1