ID: 3091
Updated by: [EMAIL PROTECTED]
Reported By: anne dot schoolcraft at mnplan dot state dot mn dot us
-Status: Open
+Status: Wont Fix
Bug Type: dBase related
Operating System: RedHat Linux 6.0
PHP Version: 3.0.12
New Comment:
We are sorry, but we can not support PHP 3 related problems anymore.
Momentum is gathering for PHP 5, and we think supporting PHP 3 will
lead to a waste of resources which we want to put into getting PHP 5
ready. Of course PHP 4 will continue to be supported for the
forseeable future.
Previous Comments:
------------------------------------------------------------------------
[2000-01-05 15:55:01] anne dot schoolcraft at mnplan dot state dot mn
dot us
One other problem with the fix listed above--it doesn't work well with
dbase_get_record_with names. It
produces inconsistent output. But it works fine with
dbase_get_record.
------------------------------------------------------------------------
[2000-01-05 12:22:04] anne dot schoolcraft at mnplan dot state dot mn
dot us
Figured out a fix, with the help of my colleauge, Brent Lund. In the
PHP source, in the functions directory,
the file dbase.c needs to be modified. Change line 348 from
num_fields = _php3_hash_num_elements(fields->value.ht);
to
num_fields = _php3_hash_num_elements(fields->value.ht) - 1;
The original version always saw the "deleted" field of a record that
dbase_get_record adds onto the end
of the record array. Adding the -1 drops the unneeded field.
Saying in the PHP code
unset($rec["deleted"]);
was apparently not effective.
My only concern with this fix is that it assumes it is being passed an
array generated by dbase_get_record or
dbase_get_record_with_names. I'm not sure how it will react if you
send it a "home-made" array.
Anne :)
------------------------------------------------------------------------
[2000-01-03 12:55:25] anne dot schoolcraft at mnplan dot state dot mn
dot us
Here's my configure line:
./configure --with-apxs=/usr/sbin/apxs
--with-config-file-path=/etc/httpd --with-mysql --with-gd --with-zlib
\
--with-system-regex --with-dbase
I have written a script to reproduce my error. It will need to
interact with a dbase file, the contents of which I provide below.
<?php
$dbf=dbase_open("county.dbf",2);
$LocIdx=1;
$numRec=dbase_numrecords($dbf);
for($i=1;$i<$numRec;$i++)
{
//read a record, change one field,and put it back
$rec=dbase_get_record_with_names($dbf,$i);
$count=count($rec);
$rec["FLD001"]=$i%5;
unset($rec["deleted"]);
$changed=dbase_replace_record($dbf,$rec,$i);//line 12
$rightNum=dbase_numfields($dbf);
if(!$changed)
printf("Didn't change record %d.<BR>",$i);
printf("old record had %d, new has %d should be
%d<BR>",$count,count($rec),$rightNum);
}
dbase_close($dbf);
?>
I am pasting in a dbase file that I have converted to tab-delimited.
You should be able to paste it into a program such as Excel and save it
as a dbase IV file (county.dbf). If you have any troubles, feel free to
contact me. I apologize for the large number of fields, but I felt it
was necessary to use the same fields that caused my original problem.
I don't know if it is significant that there are 256 fields.
AREA PERIMETER MN_CTYCB_ MN_CTYCB_I FIPS_CTY
MLMIS_CTY NAME_4CHAR NAME_LOWER NAME_UPPER FLD001 FLD002
FLD003 FLD004 FLD005 FLD006 FLD007 FLD009 FLD008 FLD010 FLD011 FLD012
FLD013 FLD014 FLD015 FLD016 FLD017 FLD019 FLD018 FLD020 FLD021 FLD022
FLD023 FLD024 FLD025 FLD026 FLD027 FLD029 FLD028 FLD030 FLD031 FLD032
FLD033 FLD034 FLD035 FLD036 FLD037 FLD039 FLD038 FLD040 FLD041 FLD042
FLD043 FLD044 FLD045 FLD046 FLD047 FLD049 FLD048 FLD050 FLD051 FLD052
FLD053 FLD054 FLD055 FLD056 FLD057 FLD059 FLD058 FLD060 FLD061 FLD062
FLD063 FLD064 FLD065 FLD066 FLD067 FLD069 FLD068 FLD070 FLD071 FLD072
FLD073 FLD074 FLD075 FLD076 FLD077 FLD079 FLD078 FLD080 FLD081 FLD082
FLD083 FLD084 FLD085 FLD086 FLD087 FLD089 FLD088 FLD090 FLD091 FLD092
FLD093 FLD094 FLD095 FLD096 FLD097 FLD099 FLD098 FLD100 FLD101 FLD102
FLD103 FLD104 FLD105 FLD106 FLD107 FLD109 FLD108 FLD110 FLD111 FLD112
FLD113 FLD114 FLD115 FLD116 FLD117 FLD119 FLD118 FLD120 FLD121 FLD122
FLD123 FLD124 FLD125 FLD126 FLD127 FLD129 FLD12!
8 FLD130 FLD131 FLD132 FLD133 FLD134 FLD135 FLD136 FLD137 FLD139
FLD138 FLD140 FLD141 FLD142 FLD143 FLD144 FLD145 FLD146 FLD147 FLD149
FLD148 FLD150 FLD151 FLD152 FLD153 FLD154 FLD155 FLD156 FLD157 FLD159
FLD158 FLD160 FLD161 FLD162 FLD163 FLD164 FLD165 FLD166 FLD167 FLD169
FLD168 FLD170 FLD171 FLD172 FLD173 FLD174 FLD175 FLD176 FLD177 FLD179
FLD178 FLD180 FLD181 FLD182 FLD183 FLD184 FLD185 FLD186 FLD187 FLD189
FLD188 FLD190 FLD191 FLD192 FLD193 FLD194 FLD195 FLD196 FLD197 FLD199
FLD198 FLD200 FLD201 FLD202 FLD203 FLD204 FLD205 FLD206 FLD207 FLD209
FLD208 FLD210 FLD211 FLD212 FLD213 FLD214 FLD215 FLD216 FLD217 FLD219
FLD218 FLD220 FLD221 FLD222 FLD223 FLD224 FLD225 FLD226 FLD227 FLD229
FLD228 FLD230 FLD231 FLD232 FLD233 FLD234 FLD235 FLD236 FLD237 FLD239
FLD238 FLD240 FLD241 FLD242 FLD243 FLD244 FLD245 FLD246
4595838464.00000 390257.06250 2 1 77 39 LOTW
Lake of the Woods LAKE OF
THE
WOODS 4 4 4 4 4 2 2 2 2
2 1 1 1 2 4 4 4 4 4
4 1 1 1 1 1 1 1 1 1
4 1 1 1 4 1 3 4 4 1
1 1 4 4 4 1 1 4 1 2
4 4 1 1 4 4 4 1 1 1
1 4 1 4 1 1 1 1 1 1
1 1 1 4 4 0 4 1 3 4
1 1 1 1 1 1 2 2 2 2
0 2 2 2 2 2 2 1 1 1
1 1 1 1 1 4 1 1 1
3 4 2 2 1 1 1 4 1 4
1 3 2 1 1 3 1 4 3 4
3 1 1 1 3 3 1 2 1 1
3 3 3 4 4 1 1 4 4 4
4 4 4 4 4 4 4 4 4 4
2 1 3 4 4 4 4 4 4 4
4 4 4 4 4 4 4 4 4 1
4 4 4 4 0 4 4 4 4 4
3 3 4 4 4 4 0 4 4 4
4 1 3 3 3 1 1 1 2 1
3 3 1 3 1 3 3 1 1 1
1 2 3 1 1 1 1 2 3 3
1 3 3 3 1 1 1 1 3 2
1 3 1 3 3 3 1
2861194240.00000 263163.87500 3 2 69 35 KITT
Kittson KITTSON 2 2 2 2 2 1 1 1
1 1 1 1 1 2 2 2 2 2
2 2 1 1 1 1 1 1 1 1
1 2 1 1 1 2 1 1 1 2
1 1 1 2 2 2 1 1 2 1
1 2 2 1 1 2 2 2 1 1
1 1 2 1 2 1 1 1 1 1
1 1 1 1 2 2 0 2 1 1
3 1 1 1 1 1 1 2 2 2
2 0 2 2 2 2 2 2 1 1
1 1 1 1 1 1 2 1 1
1 1 1 1 1 1 1 1 2 1
2 1 2 1 1 1 1 1 2 1
2 1 1 1 1 1 1 1 1 1
1 1 1 1 2 2 1 1 2 2
2 2 2 2 2 2 2 2 2 2
2 1 1 1 1 1 2 2 2 2
2 2 2 2 2 2 2 2 2 2
1 2 2 2 2 2 2 2 2 2
2 1 1 2 2 2 2 0 2 2
2 2 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
When I run my script, the following message appears for all but the
last record in the file:
Warning: Wrong number of fields specified in
/home/httpd/html/php/bugtest.php3 on line 12
Didn't change record 1.
old record had 256, new has 255 should be 255
My php3.ini file follows:
[PHP_3]
;;;;;;;;;;;;;;;;;;;
; About this file ;
;;;;;;;;;;;;;;;;;;;
; This file controls many aspects of PHP's behavior. In order for PHP
to
; read it, it must be named 'php3.ini'. PHP looks for it in the
current
; working directory, in the path designated by the environment
variable
; PHPRC, and in the path that was defined in compile time (in that
order).
; Under Windows, the compile-time path is the Windows directory. The
; path in which the php3.ini file is looked for can be overriden using
; the -c argument in command line mode.
;
; The syntax of the file is extremely simple. Whitespace and Lines
; beginning with a semicolon are silently ignored (as you probably
guessed).
; Section headers (e.g. [Foo]) are also silently ignored, even though
; they might mean something in the future (they probably won't).
;
; Options are specified using the syntax key = value or key = "complex
value".
; Key names are *case sensitive*. foo = bar is different from FOO =
bar.
; 'value' can be any number, word or keyword (keywords are On, Off,
True,
; False, Yes and No, and are case insensitive).
; 'complex value' can be just about anything, expcept for " and a
newline
; Boolean flags can be turned on using the values 1, On, True or Yes.
; They can be turned off using the values 0, Off, False or No.
;
; All the values in the php3.ini-dist file correspond to the builtin
; defaults (that is, if no php3.ini is used, or if you delete these
lines,
; the builtin defaults will be identical).
;;;;;;;;;;;;;;;;;;;;
; Language Options ;
;;;;;;;;;;;;;;;;;;;;
engine = On ; enable PHP 3.0 parser
short_open_tag = On ; allow the <? tag. otherwise, only <?php and
<script> tags are recognized.
asp_tags = Off ; allow ASP-style <% %> tags
precision = 14 ; number of significant digits
displayed in floating
point numbers
y2k_compliance = Off ; whether to be year 2000 compliant (will cause
problems with non y2k compliant browsers)
; Safe Mode
safe_mode = Off
safe_mode_exec_dir =
; Colors for Syntax Highlighting mode. Anything that's acceptable in
<font color=???> would work.
highlight.string = #DD0000
highlight.comment = #FF8000
highlight.keyword = #007700
highlight.bg = #FFFFFF
highlight.default = #0000BB
highlight.html = #000000
;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;
max_execution_time = 30 ; Maximum execution time of each script, in
seconds
memory_limit = 8388608 ; Maximum amount of memory a script may consume
(8MB)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Error handling and logging ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; error_reporting is a bit-field. Add each number up to get desired
error reporting level
; 1 = Normal errors
; 2 = Normal warnings
; 4 = Parser errors
; 8 = Notices - warnings you can ignore, but sometimes imply a bug
(e.g., using an uninitialized variable)
error_reporting =7
display_errors = On ; Print out errors (as a part of the HTML
script)
log_errors = Off ; Log errors into a log file
(server-specific log,
stderr, or error_log (below))
track_errors = Off ; Store the last error/warning message in
$php_errormsg (boolean)
;error_prepend_string = "<font color=ff0000>" ; string to output
before an error message
;error_append_string = "</font>" ; string to output
after an error message
;error_log = filename ; log errors to specified file
;error_log = syslog ; log errors to syslog (Event Log on
NT, not valid
in Windows 95)
warn_plus_overloading = Off ; warn if the + operator is
used with
strings
;;;;;;;;;;;;;;;;;
; Data Handling ;
;;;;;;;;;;;;;;;;;
magic_quotes_gpc = On ; magic quotes for incoming
GET/POST/Cookie
data
magic_quotes_runtime= Off ; magic quotes for runtime-generated
data,
e.g. data from SQL, from exec(), etc.
magic_quotes_sybase = Off ; Use Sybase-style magic quotes
(escape '
with '' instead of \')
track_vars = On ; enable
$HTTP_GET_VARS[], $HTTP_POST_VARS[] and
$HTTP_COOKIE_VARS[] arrays
; automatically add files before or after any PHP 3.0 document
auto_prepend_file =
auto_append_file =
;;;;;;;;;;;;;;;;;;;;;;;;;
; Paths and Directories ;
;;;;;;;;;;;;;;;;;;;;;;;;;
include_path = ; UNIX: "/path1:/path2" Windows:
"\path1;\path2"
doc_root = ; the root of
the php pages, used only if nonempty
user_dir = ; the directory
under which php opens the script using
/~username, used only if nonempty
;upload_tmp_dir = ; temporary directory for HTTP
uploaded files (will use system default if not specified)
upload_max_filesize = 2097152 ; 2 Meg default limit on file
uploads
extension_dir = ./ ; directory in which
the loadable extensions
(modules) reside
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
; if you wish to have an extension loaded automaticly, use the
; following syntax: extension=modulename.extension
; for example, on windows,
; extension=msql.dll
; or under UNIX,
; extension=msql.so
; Note that it should be the name of the module only, no directory
information
; needs to go here. Specify the location of the extension with the
extension_dir directive above.
;Windows Extensions
;extension=php3_mysql.dll
;extension=php3_calendar.dll
;extension=php3_dbase.dll
;extension=php3_gd.dll
;extension=php3_dbm.dll
;extension=php3_mssql.dll
;extension=php3_zlib.dll
;extension=php3_filepro.dll
;extension=php3_imap4r1.dll
;extension=php3_ldap.dll
;extension=php3_crypt.dll
;extension=php3_msql2.dll
;extension=php3_odbc.dll
;;;;;;;;;;;;;;;;;;;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;
[Syslog]
define_syslog_variables = Off ; Whether or not to define the various
syslog variables,
; e.g.
$LOG_PID, $LOG_CRON, etc. Turning it off is a
; good idea
performance-wise. In runtime, you can define
; these
variables by calling define_syslog_variables()
[mail function]
SMTP = localhost ;for win32 only
sendmail_from = [EMAIL PROTECTED] ;for win32 only
sendmail_path = ;for unix only,
may supply arguments as well
(default is sendmail -t)
[Debugger]
debugger.host = localhost
debugger.port = 7869
debugger.enabled = False
[Logging]
; These configuration directives are used by the example logging
mechanism.
; See examples/README.logging for more explanation.
;logging.method = db
;logging.directory = /path/to/log/directory
[SQL]
sql.safe_mode = Off
[ODBC]
;uodbc.default_db = Not yet implemented
;uodbc.default_user = Not yet implemented
;uodbc.default_pw = Not yet implemented
uodbc.allow_persistent = On ; allow or prevent persistent links
uodbc.max_persistent = -1 ; maximum number of persistent links. -1
means no limit
uodbc.max_links = -1 ; maximum number of links
(persistent+non
persistent). -1 means no limit
uodbc.defaultlrl = 4096 ; Handling of LONG fields. Returns
number of
bytes to variables, 0 means passthru
uodbc.defaultbinmode = 1 ; Handling of binary data. 0 means
passthru,
1 return as is, 2 convert to char
; See the documentation on odbc_binmode and odbc_longreadlen for an
explanation of uodbc.defaultlrl
; and uodbc.defaultbinmode
[MySQL]
mysql.allow_persistent = On ; allow or prevent persistent link
mysql.max_persistent = -1 ; maximum number of persistent links. -1
means no limit
mysql.max_links = -1 ; maximum number of links
(persistent+non
persistent). -1 means no limit
mysql.default_port = ; default port number for
mysql_connect(). If
unset,
;
mysql_connect() will use the $MYSQL_TCP_PORT, or the
mysql-tcp
; entry in
/etc/services, or the compile-time defined
MYSQL_PORT
; (in that
order). Win32 will only look at MYSQL_PORT.
mysql.default_host = ; default host for
mysql_connect() (doesn't
apply in safe mode)
mysql.default_user = ; default user for
mysql_connect() (doesn't
apply in safe mode)
mysql.default_password = ; default password for mysql_connect()
(doesn't apply in safe mode)
; Note that
this is generally a *bad* idea to store passwords
; in this file.
*Any* user with PHP access can run
; 'echo
cfg_get_var("mysql.default_password")' and reveal that
; password!
And of course, any users with read access to this
; file will be
able to reveal the password as well.
[mSQL]
msql.allow_persistent = On ; allow or prevent persistent link
msql.max_persistent = -1 ; maximum number of persistent
links. -1
means no limit
msql.max_links = -1 ; maximum number of links
(persistent+non
persistent). -1 means no limit
[PostgresSQL]
pgsql.allow_persistent = On ; allow or prevent persistent link
pgsql.max_persistent = -1 ; maximum number of persistent links. -1
means no limit
pgsql.max_links = -1 ; maximum number of links
(persistent+non
persistent). -1 means no limit
[Sybase]
sybase.allow_persistent = On ; allow or prevent persistent link
sybase.max_persistent = -1 ; maximum number of persistent links. -1
means no limit
sybase.max_links = -1 ; maximum number of links
(persistent+non
persistent). -1 means no limit
;sybase.interface_file = "/usr/sybase/interfaces"
sybase.min_error_severity = 10 ; minimum error severity to
display
sybase.min_message_severity = 10 ; minimum message severity to
display
sybase.compatability_mode = Off ; compatability mode with earlier
versions of PHP 3.0.
; If
on, this will cause PHP to automatically assign types to
results
;
according to their Sybase type, instead of treating them all
as
;
strings. This compatability mode will probably not stay
around
;
forever, so try applying whatever necessary changes to your
code,
; and
turn it off.
[Sybase-CT]
sybct.allow_persistent = On ; allow or prevent persistent
link
sybct.max_persistent = -1 ; maximum number of persistent
links. -1
means no limit
sybct.max_links = -1 ; maximum number of
links (persistent+non
persistent). -1 means no limit
sybct.min_server_severity = 10 ; minimum server message
severity to
display
sybct.min_client_severity = 10 ; minimum client message
severity to
display
[bcmath]
bcmath.scale = 0 ; number of decimal digits for all bcmath
functions
[browscap]
;browscap = extra/browscap.ini
[image]
;ps.default_encoding = "/etc/t1lib/enc/IsoLatin1.enc" ; default
character encoding vector for PostScript Type1 fonts
[Informix]
ifx.default_host = ; default host for
ifx_connect() (doesn't apply in
safe mode)
ifx.default_user = ; default user for
ifx_connect() (doesn't apply in
safe mode)
ifx.default_password = ; default password for
ifx_connect() (doesn't
apply in safe mode)
ifx.allow_persistent = On ; allow or prevent persistent
link
ifx.max_persistent = -1 ; maximum number of persistent
links. -1 means
no limit
ifx.max_links = -1 ; maximum number of links
(persistent+non
persistent). -1 means no limit
ifx.textasvarchar = 0 ; if set on, select statements
return the
contents of a text blob instead of it's id
ifx.byteasvarchar = 0 ; if set on, select statements
return the
contents of a byte blob instead of it's id
ifx.charasvarchar = 0 ; trailing blanks are stripped
from fixed-length
char columns. May help the life
; of Informix SE users.
ifx.blobinfile = 0 ; if set on, the contents of
text&byte blobs are
dumped to a file instead of
; keeping them in memory
ifx.nullformat = 0 ; NULL's are returned as empty
strings, unless
this is set to 1. In that case,
; NULL's are returned as string
'NULL'.
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=3091&edit=1