php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #3091 dbase_replace_record miscounts number of fields
Submitted: 2000-01-03 12:55 UTC Modified: 2005-03-30 09:02 UTC
Votes:2
Avg. Score:4.0 ± 1.0
Reproduced:2 of 2 (100.0%)
Same Version:1 (50.0%)
Same OS:-1 (-50.0%)
From: anne dot schoolcraft at mnplan dot state dot mn dot us Assigned:
Status: Wont fix Package: dBase related
PHP Version: 3.0.12 OS: RedHat Linux 6.0
Private report: No CVE-ID: None
Have you experienced this issue?
Rate the importance of this bug to you:

 [2000-01-03 12:55 UTC] 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	FLD128	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	=	me@localhost.com	;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'.


Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2000-01-05 12:22 UTC] 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-05 15:55 UTC] 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.

 [2005-03-30 09:02 UTC] sniper@php.net
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.


 
PHP Copyright © 2001-2017 The PHP Group
All rights reserved.
Last updated: Sun Nov 19 01:31:42 2017 UTC