Fwd: [PHP-DB] PHP ODBC odbc_fetch_array returns uninitialized values for Booleans

2015-06-30 Thread Bruce Bailey
Thanks very much for the reply.  There's very little doubt in my mind that
the converted boolean value is uninitialized -- extracting a larger number
of rows shows a largish number of values for the boolean columns.  The
postgresql tables contain true or false.  This code works just fine on
older systems.

Bruce




-- Forwarded message --
From: Bastien Koert phps...@gmail.com
Date: Mon, Jun 29, 2015 at 7:21 PM
Subject: Re: [PHP-DB] PHP ODBC odbc_fetch_array returns uninitialized
values for Booleans
To: Bruce Bailey brucebailey...@gmail.com, php-db@lists.php.net


Is it a truly a three state field (true, false, null) or just T/F? Perhaps
a default value for the field might be better?

On Mon, Jun 29, 2015 at 11:42 AM Bruce Bailey brucebailey...@gmail.com
wrote:

 *Description*

 The PHP function odbc_fetch_array returns uninitialized values for
 PostgreSQL boolean values.  On older systems, this function returned '1'
 for true and '0' for false values.  On our 64 bit system, the boolean
 values appear to be uninitialized data.

 *Additional information*

 Increasing buffer size in php_odbc.c (odbc.so) in function odbc_bindcols,
 just prior to call to SQLBindCol makes problem stop exhibiting.

 SQLColAttributes(...,SQL_COLUMN_TYPE,...) returns type of SQL_VARCHAR on
 system with problem, SQL_CHAR on system where code works as expected.

 SQLColAttributes is deprecated (shouldn't matter, though)

 *Recreation steps:*

 // Create table/data in PostgreSQL

 DROP TABLE IF EXISTS public.persons;
 create table public.persons (id int, name varchar(255), switch_sw boolean);
 insert into public.persons values (0, 'smith', true);
 insert into public.persons values (1, 'jones', false);
 insert into public.persons values (2, 'bailey', true);
 insert into public.persons values (3, 'johnson', false);

 // Test script
 ?php

if(!($conn = odbc_connect(... , ... , ...)))
   die(odbc_connect failed\n);

if(!($rows = odbc_exec($conn, select * from persons;)))
   die(odbc_exec failed\n);

for(;;)
{
   if (!($row = odbc_fetch_array ($rows)))
  break;

   print_r($row);
}

odbc_close($conn);
 ?

 *Actual output*

 Array
 (
 [id] = 0
 [name] = smith
 [switch_sw] = . // some unreadable binary content
 )
 . . .

 *Expected Output*

 Array
 (
 [id] = 0
 [name] = smith
 [switch_sw] = 1
 )
 . . .

 *Software levels*

 kernel - Linux C921189 3.10.0-123.20.1.el7.x86_64 . . . GNU/Linux
 ODBC - libodbc.so.1 (cannot exactly determine version)
 PostgreSQL - 9.3.0
 PHP - 5.6.7

 This system is little endian



[PHP-DB] PHP ODBC odbc_fetch_array returns uninitialized values for Booleans

2015-06-29 Thread Bruce Bailey
*Description*

The PHP function odbc_fetch_array returns uninitialized values for
PostgreSQL boolean values.  On older systems, this function returned '1'
for true and '0' for false values.  On our 64 bit system, the boolean
values appear to be uninitialized data.

*Additional information*

Increasing buffer size in php_odbc.c (odbc.so) in function odbc_bindcols,
just prior to call to SQLBindCol makes problem stop exhibiting.

SQLColAttributes(...,SQL_COLUMN_TYPE,...) returns type of SQL_VARCHAR on
system with problem, SQL_CHAR on system where code works as expected.

SQLColAttributes is deprecated (shouldn't matter, though)

*Recreation steps:*

// Create table/data in PostgreSQL

DROP TABLE IF EXISTS public.persons;
create table public.persons (id int, name varchar(255), switch_sw boolean);
insert into public.persons values (0, 'smith', true);
insert into public.persons values (1, 'jones', false);
insert into public.persons values (2, 'bailey', true);
insert into public.persons values (3, 'johnson', false);

// Test script
?php

   if(!($conn = odbc_connect(... , ... , ...)))
  die(odbc_connect failed\n);

   if(!($rows = odbc_exec($conn, select * from persons;)))
  die(odbc_exec failed\n);

   for(;;)
   {
  if (!($row = odbc_fetch_array ($rows)))
 break;

  print_r($row);
   }

   odbc_close($conn);
?

*Actual output*

Array
(
[id] = 0
[name] = smith
[switch_sw] = . // some unreadable binary content
)
. . .

*Expected Output*

Array
(
[id] = 0
[name] = smith
[switch_sw] = 1
)
. . .

*Software levels*

kernel - Linux C921189 3.10.0-123.20.1.el7.x86_64 . . . GNU/Linux
ODBC - libodbc.so.1 (cannot exactly determine version)
PostgreSQL - 9.3.0
PHP - 5.6.7

This system is little endian


Re: [PHP-DB] PHP ODBC odbc_fetch_array returns uninitialized values for Booleans

2015-06-29 Thread Bastien Koert
Is it a truly a three state field (true, false, null) or just T/F? Perhaps
a default value for the field might be better?

On Mon, Jun 29, 2015 at 11:42 AM Bruce Bailey brucebailey...@gmail.com
wrote:

 *Description*

 The PHP function odbc_fetch_array returns uninitialized values for
 PostgreSQL boolean values.  On older systems, this function returned '1'
 for true and '0' for false values.  On our 64 bit system, the boolean
 values appear to be uninitialized data.

 *Additional information*

 Increasing buffer size in php_odbc.c (odbc.so) in function odbc_bindcols,
 just prior to call to SQLBindCol makes problem stop exhibiting.

 SQLColAttributes(...,SQL_COLUMN_TYPE,...) returns type of SQL_VARCHAR on
 system with problem, SQL_CHAR on system where code works as expected.

 SQLColAttributes is deprecated (shouldn't matter, though)

 *Recreation steps:*

 // Create table/data in PostgreSQL

 DROP TABLE IF EXISTS public.persons;
 create table public.persons (id int, name varchar(255), switch_sw boolean);
 insert into public.persons values (0, 'smith', true);
 insert into public.persons values (1, 'jones', false);
 insert into public.persons values (2, 'bailey', true);
 insert into public.persons values (3, 'johnson', false);

 // Test script
 ?php

if(!($conn = odbc_connect(... , ... , ...)))
   die(odbc_connect failed\n);

if(!($rows = odbc_exec($conn, select * from persons;)))
   die(odbc_exec failed\n);

for(;;)
{
   if (!($row = odbc_fetch_array ($rows)))
  break;

   print_r($row);
}

odbc_close($conn);
 ?

 *Actual output*

 Array
 (
 [id] = 0
 [name] = smith
 [switch_sw] = . // some unreadable binary content
 )
 . . .

 *Expected Output*

 Array
 (
 [id] = 0
 [name] = smith
 [switch_sw] = 1
 )
 . . .

 *Software levels*

 kernel - Linux C921189 3.10.0-123.20.1.el7.x86_64 . . . GNU/Linux
 ODBC - libodbc.so.1 (cannot exactly determine version)
 PostgreSQL - 9.3.0
 PHP - 5.6.7

 This system is little endian