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