123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287 |
- --TEST--
- PDO MySQL Bug #38546 (bindParam incorrect processing of bool types)
- --EXTENSIONS--
- pdo
- pdo_mysql
- --SKIPIF--
- <?php
- require dirname(__FILE__) . '/config.inc';
- require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
- PDOTest::skip();
- ?>
- --FILE--
- <?php
- require dirname(__FILE__) . '/config.inc';
- require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
- $db = PDOTest::test_factory(dirname(__FILE__) . '/common.phpt');
- $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
- // To test error cases.
- $db->exec("SET sql_mode='STRICT_TRANS_TABLES'");
- $db->exec("DROP TABLE IF EXISTS test");
- $query = "CREATE TABLE test(
- uid MEDIUMINT UNSIGNED NOT NULL,
- some_bool_1 BOOL NOT NULL,
- some_bool_2 BOOL NOT NULL,
- some_int TINYINT NOT NULL
- )";
- $db->exec($query);
- $st = $db->prepare("INSERT INTO test (uid, some_bool_1, some_bool_2, some_int) VALUES (?, ?, ?, ?)");
- $values = [
- 'uid' => 6,
- 'some_bool_1' => false,
- 'some_bool_2' => true,
- 'some_int' => -23
- ];
- $st->bindParam(1, $values['uid'], PDO::PARAM_INT);
- $st->bindParam(2, $values['some_bool_1'], PDO::PARAM_BOOL);
- $st->bindParam(3, $values['some_bool_2'], PDO::PARAM_BOOL);
- $st->bindParam(4, $values['some_int'], PDO::PARAM_INT);
- $result = $st->execute();
- if ($result === false) {
- var_dump($st->errorInfo());
- } else {
- print("ok insert\n");
- }
- foreach ($db->query('SELECT * from test') as $row) {
- print_r($row);
- }
- $st = $db->prepare("UPDATE test SET some_bool_1=?, some_bool_2=?, some_int=? WHERE uid=?");
- $values = [
- 'uid' => 6,
- 'some_bool_1' => (bool) 1,
- 'some_bool_2' => (bool) 0,
- 'some_int' => 1,
- ];
- $st->bindParam(1, $values['some_bool_1'], PDO::PARAM_BOOL);
- $st->bindParam(2, $values['some_bool_2'], PDO::PARAM_BOOL);
- $st->bindParam(3, $values['some_int'], PDO::PARAM_INT);
- $st->bindParam(4, $values['uid'], PDO::PARAM_INT);
- $result = $st->execute();
- if ($result === false) {
- var_dump($st->errorInfo());
- } else {
- print("ok prepare 1\n");
- }
- foreach ($db->query('SELECT * from test') as $row) {
- print_r($row);
- }
- $st = $db->prepare("UPDATE test SET some_bool_1=?, some_bool_2=?, some_int=? WHERE uid=?");
- $values = [
- 'uid' => 6,
- 'some_bool_1' => (bool) 0,
- 'some_bool_2' => (bool) 1,
- 'some_int' => 2,
- ];
- $st->bindParam(1, $values['some_bool_1'], PDO::PARAM_BOOL);
- $st->bindParam(2, $values['some_bool_2'], PDO::PARAM_BOOL);
- $st->bindParam(3, $values['some_int'], PDO::PARAM_INT);
- $st->bindParam(4, $values['uid'], PDO::PARAM_INT);
- $result = $st->execute();
- if ($result === false) {
- var_dump($st->errorInfo());
- } else {
- print("ok prepare 2\n");
- }
- foreach ($db->query('SELECT * from test') as $row) {
- print_r($row);
- }
- // String true and false should fail
- $st = $db->prepare("UPDATE test SET some_bool_1=?, some_bool_2=?, some_int=? WHERE uid=?");
- $values = [
- 'uid' => 6,
- 'some_bool_1' => 'true',
- 'some_bool_2' => 'false',
- 'some_int' => 3,
- ];
- $st->bindParam(1, $values['some_bool_1'], PDO::PARAM_BOOL);
- $st->bindParam(2, $values['some_bool_2'], PDO::PARAM_BOOL);
- $st->bindParam(3, $values['some_int'], PDO::PARAM_INT);
- $st->bindParam(4, $values['uid'], PDO::PARAM_INT);
- $result = $st->execute();
- if ($result === false) {
- var_dump($st->errorInfo());
- } else {
- print("ok prepare 3\n");
- }
- foreach ($db->query('SELECT * from test') as $row) {
- print_r($row);
- }
- // Null should not be treated as false
- $st = $db->prepare("UPDATE test SET some_bool_1=?, some_bool_2=?, some_int=? WHERE uid=?");
- $values = [
- 'uid' => 6,
- 'some_bool_1' => true,
- 'some_bool_2' => null,
- 'some_int' => 4,
- ];
- $st->bindParam(1, $values['some_bool_1'], PDO::PARAM_BOOL);
- $st->bindParam(2, $values['some_bool_2'], PDO::PARAM_BOOL);
- $st->bindParam(3, $values['some_int'], PDO::PARAM_INT);
- $st->bindParam(4, $values['uid'], PDO::PARAM_INT);
- $result = $st->execute();
- if ($result === false) {
- var_dump($st->errorInfo());
- } else {
- print("ok prepare 4\n");
- }
- foreach ($db->query('SELECT * from test') as $row) {
- print_r($row);
- }
- // Integers converted correctly
- $st = $db->prepare("UPDATE test SET some_bool_1=?, some_bool_2=?, some_int=? WHERE uid=?");
- $values = [
- 'uid' => 6,
- 'some_bool_1' => 256,
- 'some_bool_2' => 0,
- 'some_int' => 5,
- ];
- $st->bindParam(1, $values['some_bool_1'], PDO::PARAM_BOOL);
- $st->bindParam(2, $values['some_bool_2'], PDO::PARAM_BOOL);
- $st->bindParam(3, $values['some_int'], PDO::PARAM_INT);
- $st->bindParam(4, $values['uid'], PDO::PARAM_INT);
- $result = $st->execute();
- if ($result === false) {
- var_dump($st->errorInfo());
- } else {
- print("ok prepare 5\n");
- }
- foreach ($db->query('SELECT * from test') as $row) {
- print_r($row);
- }
- ?>
- --CLEAN--
- <?php
- require dirname(__FILE__) . '/mysql_pdo_test.inc';
- MySQLPDOTest::dropTestTable();
- ?>
- --EXPECTF--
- ok insert
- Array
- (
- [uid] => 6
- [0] => 6
- [some_bool_1] => 0
- [1] => 0
- [some_bool_2] => 1
- [2] => 1
- [some_int] => -23
- [3] => -23
- )
- ok prepare 1
- Array
- (
- [uid] => 6
- [0] => 6
- [some_bool_1] => 1
- [1] => 1
- [some_bool_2] => 0
- [2] => 0
- [some_int] => 1
- [3] => 1
- )
- ok prepare 2
- Array
- (
- [uid] => 6
- [0] => 6
- [some_bool_1] => 0
- [1] => 0
- [some_bool_2] => 1
- [2] => 1
- [some_int] => 2
- [3] => 2
- )
- Warning: PDOStatement::execute(): SQLSTATE[%s]: %s: 1366 Incorrect integer value: 'true' for column %s at row 1 in %s
- array(3) {
- [0]=>
- string(5) "%s"
- [1]=>
- int(1366)
- [2]=>
- string(%d) "Incorrect integer value: 'true' for column %s at row 1"
- }
- Array
- (
- [uid] => 6
- [0] => 6
- [some_bool_1] => 0
- [1] => 0
- [some_bool_2] => 1
- [2] => 1
- [some_int] => 2
- [3] => 2
- )
- Warning: PDOStatement::execute(): SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'some_bool_2' cannot be null in %s
- array(3) {
- [0]=>
- string(5) "23000"
- [1]=>
- int(1048)
- [2]=>
- string(35) "Column 'some_bool_2' cannot be null"
- }
- Array
- (
- [uid] => 6
- [0] => 6
- [some_bool_1] => 0
- [1] => 0
- [some_bool_2] => 1
- [2] => 1
- [some_int] => 2
- [3] => 2
- )
- ok prepare 5
- Array
- (
- [uid] => 6
- [0] => 6
- [some_bool_1] => 1
- [1] => 1
- [some_bool_2] => 0
- [2] => 0
- [some_int] => 5
- [3] => 5
- )
|