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 <phpster@xxxxxxxxx> Date: Mon, Jun 29, 2015 at 7:21 PM Subject: Re: PHP ODBC odbc_fetch_array returns uninitialized values for Booleans To: Bruce Bailey <brucebailey320@xxxxxxxxx>, php-db@xxxxxxxxxxxxx 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 <brucebailey320@xxxxxxxxx> 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 >