Edit report at https://bugs.php.net/bug.php?id=47615&edit=1

 ID:                 47615
 Comment by:         cornelius dot howl at gmail dot com
 Reported by:        kenaniah at gmail dot com
 Summary:            PDO parameter binding is in clear violation of the
                     ISO 9075 standard
 Status:             Open
 Type:               Feature/Change Request
 Package:            PDO related
 Operating System:   *
 PHP Version:        5.2.9
 Block user comment: N
 Private report:     N

 New Comment:

BTW, My PHP version 5.3.10.

pdo_pgsql

PDO Driver for PostgreSQL => enabled
PostgreSQL(libpq) Version => 9.1.2
Module version => 1.0.2
Revision =>  $Id: pdo_pgsql.c 321634 2012-01-01 13:15:04Z felipe $ 

pdo_sqlite

PDO Driver for SQLite 3.x => enabled
SQLite Library => 3.7.10

pgsql

PostgreSQL Support => enabled
PostgreSQL(libpq) Version => 9.1.2
Multibyte character support => enabled
SSL support => enabled
Active Persistent Links => 0
Active Links => 0


Previous Comments:
------------------------------------------------------------------------
[2012-03-05 18:11:35] cornelius dot howl at gmail dot com

Same here. 


<?php
$db = new PDO('pgsql:host=localhost;dbname=test;', 'root', '123123' );
// $db = new PDO('sqlite::memory:');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$db->query( <<<EOS
CREATE TABLE products( 
        name varchar(256),
        subtitle varchar(256),
        sn varchar(128),
        spec text,
        content text,
        category_id integer,
        is_cover boolean,
        thumb varchar(250),
        image varchar(250),
        lang varchar(5),
        price integer,
        token varchar(128),
        hide boolean default FALSE,
        created_on timestamp,
        created_by integer
);
EOS
);

$stm = $db->prepare('INSERT INTO products 
    ( name,sn,subtitle,hide,token,price,content,spec,created_by,created_on) 
    VALUES 
(:name,:sn,:subtitle,:hide,:token,:price,:content,:spec,:created_by,:created_on)
 
    ');
$stm->execute(array( 
      ':name' =>  'Test',
      ':sn' =>  'Test',
      ':subtitle' => '123',
      ':hide'     => false,
      ':token' =>  'd862899f5c4b38f6b6a161e77c2936fb5541deb5',
      ':price' =>  0,
      ':content' => '<p>123</p>',
      ':spec' => '<p>123</p>',
      ':created_by' => 1,
      ':created_on' => '2012-03-06T01:37:50+08:00',
));

foreach( $db->query('select * from products') as $item ) {
    var_dump( $item ); 
}






Which throws


PHP Fatal error:  Uncaught exception 'PDOException' with message 
'SQLSTATE[22P02]: 
Invalid text representation: 7 ERROR:  invalid input syntax for type boolean: 
""' 
in /Users/c9s/git/Work/phifty/pdo_test.php:44
Stack trace:
#0 /Users/c9s/git/Work/phifty/pdo_test.php(44): PDOStatement->execute(Array)
#1 {main}
  thrown in /Users/c9s/git/Work/phifty/pdo_test.php on line 44

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[22P02]: 
Invalid text representation: 7 ERROR:  invalid input syntax for type boolean: 
""' 
in /Users/c9s/git/Work/phifty/pdo_test.php on line 44

PDOException: SQLSTATE[22P02]: Invalid text representation: 7 ERROR:  invalid 
input syntax for type boolean: "" in /Users/c9s/git/Work/phifty/pdo_test.php on 
line 44

------------------------------------------------------------------------
[2009-03-10 18:32:51] kenaniah at gmail dot com

Description:
------------
Referencing ISO 9075, PDO does not properly bind boolean parameters when the 
parameter type has not been made known to PDO.

According to the standard, booleans represent a truth, false, or unknown value. 
According to the SQL language definition (feel free to reference SQL-92), the 
SQL equivalents for a boolean value are TRUE, FALSE, and NULL respectively.

The PDO core should automatically convert boolean values to their proper SQL 
counterparts, and it should be the role of the client driver to deal with these 
values if the database platform in question does not support the ISO standard. 

Rather than listing workarounds, we ask that the PDO core be brought into 
compliance with the SQL standards, and that individual database drivers be 
modified to handle the cases in which their underlying database is not 
standards compliant. 

Reproduce code:
---------------
$res = $db->prepare('SELECT id FROM table WHERE mybool = ?');
$res->execute(array(false));

Expected result:
----------------
SQL statement sent to server:

SELECT id FROM table WHERE mybool = FALSE

(unless modified by DB driver due to a lack of standards compliance on the part 
of the DB)

Actual result:
--------------
Fatal error: Uncaught exception 'PDOException' with message
'SQLSTATE[22P02]: Invalid text representation: 7 ERROR:  invalid input
syntax for type boolean: ""' 

^^for Postgres driver (Postgres is an standard compliant DB as far as booleans 
are concerned)


------------------------------------------------------------------------



-- 
Edit this bug report at https://bugs.php.net/bug.php?id=47615&edit=1

Reply via email to