123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- --TEST--
- PDO PgSQL Bug #33876 (PDO misquotes/miscasts bool(false))
- --EXTENSIONS--
- pdo
- pdo_pgsql
- --SKIPIF--
- <?php
- require __DIR__ . '/config.inc';
- require __DIR__ . '/../../../ext/pdo/tests/pdo_test.inc';
- PDOTest::skip();
- ?>
- --FILE--
- <?php
- require __DIR__ . '/../../../ext/pdo/tests/pdo_test.inc';
- $db = PDOTest::test_factory(__DIR__ . '/common.phpt');
- $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
- $db->exec("SET LC_MESSAGES='C'");
- $db->exec('CREATE TABLE test (foo varchar(5) NOT NULL, bar bool NOT NULL)');
- $db->exec("INSERT INTO test VALUES('false','f')");
- $db->exec("INSERT INTO test VALUES('true', 't')");
- $res = $db->prepare('SELECT foo from test where bar = ?');
- # this is the portable approach to binding a bool
- $res->bindValue(1, false, PDO::PARAM_BOOL);
- if (!$res->execute())
- print_r($res->errorInfo());
- else
- print_r($res->fetchAll(PDO::FETCH_ASSOC));
- # this is the portable approach to binding a bool
- $res->bindValue(1, true, PDO::PARAM_BOOL);
- if (!$res->execute())
- print_r($res->errorInfo());
- else
- print_r($res->fetchAll(PDO::FETCH_ASSOC));
- # true gets cast to string (because the implied default is string)
- # true-as-string is 1, so this "works"
- if (!$res->execute(array(true)))
- print_r($res->errorInfo());
- else
- print_r($res->fetchAll(PDO::FETCH_ASSOC));
- # Expected to fail; unless told otherwise, PDO assumes string inputs
- # false -> "" as string, which pgsql doesn't like
- if (!$res->execute(array(false)))
- print_r(normalizeErrorInfo($res->errorInfo()));
- else
- print_r($res->fetchAll(PDO::FETCH_ASSOC));
- # And now using emulator prepares
- echo "EMUL\n";
- $res = $db->prepare('SELECT foo from test where bar = ?', array(
- PDO::ATTR_EMULATE_PREPARES => true));
- # this is the portable approach to binding a bool
- $res->bindValue(1, false, PDO::PARAM_BOOL);
- if (!$res->execute())
- print_r($res->errorInfo());
- else
- print_r($res->fetchAll(PDO::FETCH_ASSOC));
- # this is the portable approach to binding a bool
- $res->bindValue(1, true, PDO::PARAM_BOOL);
- if (!$res->execute())
- print_r($res->errorInfo());
- else
- print_r($res->fetchAll(PDO::FETCH_ASSOC));
- # true gets cast to string (because the implied default is string)
- # true-as-string is 1, so this "works"
- if (!$res->execute(array(true)))
- print_r($res->errorInfo());
- else
- print_r($res->fetchAll(PDO::FETCH_ASSOC));
- # Expected to fail; unless told otherwise, PDO assumes string inputs
- # false -> "" as string, which pgsql doesn't like
- if (!$res->execute(array(false))) {
- print_r(normalizeErrorInfo($res->errorInfo()));
- } else {
- print_r($res->fetchAll(PDO::FETCH_ASSOC));
- }
- function normalizeErrorInfo(array $err): array {
- // Strip additional lines outputted by recent PgSQL versions
- $err[2] = trim(current(explode("\n", $err[2])));
- return $err;
- }
- ?>
- --EXPECTF--
- Array
- (
- [0] => Array
- (
- [foo] => false
- )
- )
- Array
- (
- [0] => Array
- (
- [foo] => true
- )
- )
- Array
- (
- [0] => Array
- (
- [foo] => true
- )
- )
- Array
- (
- [0] => 22P02
- [1] => 7
- [2] => %s: %sboolean%s
- )
- EMUL
- Array
- (
- [0] => Array
- (
- [foo] => false
- )
- )
- Array
- (
- [0] => Array
- (
- [foo] => true
- )
- )
- Array
- (
- [0] => Array
- (
- [foo] => true
- )
- )
- Array
- (
- [0] => 22P02
- [1] => 7
- [2] => %s: %sboolean%s
- )
|