From: rjones-php-ibase-bug at ico dot viva dot org
Operating system: windows 2000 and Linux
PHP version: 4.3.6
PHP Bug Type: InterBase related
Bug description: ibase_fetch_row returns inconsistent formats for TIMESTAMP fields on
firebird
Description:
------------
This function does not work consistently on Linux and Windows 2000 with
dates with small years.
The strings it returns are
under Linux: "01/01/1"
under Windows: "01/01/0001"
I have traced this back:
ibase_fetch_row -> _php_ibase_fetch_hash -> _php_ibase_var_zval ->
strftime
in interbase.c at line 1919:
#if HAVE_STRFTIME
Z_STRLEN_P(val) = strftime(string_data,
sizeof(string_data), format,
&t);
#else
/* FIXME */
if (!t.tm_hour && !t.tm_min && !t.tm_sec) {
Z_STRLEN_P(val) = sprintf(string_data,
"%02d/%02d/%4d", t.tm_mon + 1,
t.tm_mday, t.tm_year + 1900);
} else {
Z_STRLEN_P(val) = sprintf(string_data,
"%02d/%02d/%4d
%02d:%02d:%02d", t.tm_mon+1, t.tm_mday, t.tm_year + 1900, t.tm_hour,
t.tm_min, t.tm_sec);
}
#endif
As a work-around, I've used
#if HAVE_STRFTIME
// Make this consistent with PHP on windows.
// FixMe This should give consistent results for all years from 0001
onwards
if(t.tm_year < 10)
{
if (!t.tm_hour && !t.tm_min && !t.tm_sec) {
Z_STRLEN_P(val) = sprintf(string_data,
"%02d/%02d/000%d", t.tm_mon +
1, t.tm_mday, t.tm_year+1900);
} else {
Z_STRLEN_P(val) = sprintf(string_data,
"%02d/%02d/000%d
%02d:%02d:%02d", t.tm_mon+1, t.tm_mday, t.tm_year+1900, t.tm_hour,
t.tm_min, t.tm_sec);
}
}
else
{
Z_STRLEN_P(val) = strftime(string_data,
sizeof(string_data), format,
&t);
}
#else
/* FIXME */
if (!t.tm_hour && !t.tm_min && !t.tm_sec) {
Z_STRLEN_P(val) = sprintf(string_data,
"%02d/%02d/%4d", t.tm_mon + 1,
t.tm_mday, t.tm_year + 1900);
} else {
Z_STRLEN_P(val) = sprintf(string_data,
"%02d/%02d/%4d
%02d:%02d:%02d", t.tm_mon+1, t.tm_mday, t.tm_year + 1900, t.tm_hour,
t.tm_min, t.tm_sec);
}
#endif
Reproduce code:
---------------
$rs_temp=ibase_query("SELECT time_stamp_field FROM
some_stored_procedure()");
$row_temp=ibase_fetch_row($rs_temp);
print($row_temp[0]);
Expected result:
----------------
01/01/0001
Actual result:
--------------
01/01/1
--
Edit bug report at http://bugs.php.net/?id=28543&edit=1
--
Try a CVS snapshot (php4): http://bugs.php.net/fix.php?id=28543&r=trysnapshot4
Try a CVS snapshot (php5): http://bugs.php.net/fix.php?id=28543&r=trysnapshot5
Fixed in CVS: http://bugs.php.net/fix.php?id=28543&r=fixedcvs
Fixed in release: http://bugs.php.net/fix.php?id=28543&r=alreadyfixed
Need backtrace: http://bugs.php.net/fix.php?id=28543&r=needtrace
Need Reproduce Script: http://bugs.php.net/fix.php?id=28543&r=needscript
Try newer version: http://bugs.php.net/fix.php?id=28543&r=oldversion
Not developer issue: http://bugs.php.net/fix.php?id=28543&r=support
Expected behavior: http://bugs.php.net/fix.php?id=28543&r=notwrong
Not enough info: http://bugs.php.net/fix.php?id=28543&r=notenoughinfo
Submitted twice: http://bugs.php.net/fix.php?id=28543&r=submittedtwice
register_globals: http://bugs.php.net/fix.php?id=28543&r=globals
PHP 3 support discontinued: http://bugs.php.net/fix.php?id=28543&r=php3
Daylight Savings: http://bugs.php.net/fix.php?id=28543&r=dst
IIS Stability: http://bugs.php.net/fix.php?id=28543&r=isapi
Install GNU Sed: http://bugs.php.net/fix.php?id=28543&r=gnused
Floating point limitations: http://bugs.php.net/fix.php?id=28543&r=float