bug_38546.phpt 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. --TEST--
  2. PDO MySQL Bug #38546 (bindParam incorrect processing of bool types)
  3. --EXTENSIONS--
  4. pdo
  5. pdo_mysql
  6. --SKIPIF--
  7. <?php
  8. require dirname(__FILE__) . '/config.inc';
  9. require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
  10. PDOTest::skip();
  11. ?>
  12. --FILE--
  13. <?php
  14. require dirname(__FILE__) . '/config.inc';
  15. require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
  16. $db = PDOTest::test_factory(dirname(__FILE__) . '/common.phpt');
  17. $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
  18. // To test error cases.
  19. $db->exec("SET sql_mode='STRICT_TRANS_TABLES'");
  20. $db->exec("DROP TABLE IF EXISTS test");
  21. $query = "CREATE TABLE test(
  22. uid MEDIUMINT UNSIGNED NOT NULL,
  23. some_bool_1 BOOL NOT NULL,
  24. some_bool_2 BOOL NOT NULL,
  25. some_int TINYINT NOT NULL
  26. )";
  27. $db->exec($query);
  28. $st = $db->prepare("INSERT INTO test (uid, some_bool_1, some_bool_2, some_int) VALUES (?, ?, ?, ?)");
  29. $values = [
  30. 'uid' => 6,
  31. 'some_bool_1' => false,
  32. 'some_bool_2' => true,
  33. 'some_int' => -23
  34. ];
  35. $st->bindParam(1, $values['uid'], PDO::PARAM_INT);
  36. $st->bindParam(2, $values['some_bool_1'], PDO::PARAM_BOOL);
  37. $st->bindParam(3, $values['some_bool_2'], PDO::PARAM_BOOL);
  38. $st->bindParam(4, $values['some_int'], PDO::PARAM_INT);
  39. $result = $st->execute();
  40. if ($result === false) {
  41. var_dump($st->errorInfo());
  42. } else {
  43. print("ok insert\n");
  44. }
  45. foreach ($db->query('SELECT * from test') as $row) {
  46. print_r($row);
  47. }
  48. $st = $db->prepare("UPDATE test SET some_bool_1=?, some_bool_2=?, some_int=? WHERE uid=?");
  49. $values = [
  50. 'uid' => 6,
  51. 'some_bool_1' => (bool) 1,
  52. 'some_bool_2' => (bool) 0,
  53. 'some_int' => 1,
  54. ];
  55. $st->bindParam(1, $values['some_bool_1'], PDO::PARAM_BOOL);
  56. $st->bindParam(2, $values['some_bool_2'], PDO::PARAM_BOOL);
  57. $st->bindParam(3, $values['some_int'], PDO::PARAM_INT);
  58. $st->bindParam(4, $values['uid'], PDO::PARAM_INT);
  59. $result = $st->execute();
  60. if ($result === false) {
  61. var_dump($st->errorInfo());
  62. } else {
  63. print("ok prepare 1\n");
  64. }
  65. foreach ($db->query('SELECT * from test') as $row) {
  66. print_r($row);
  67. }
  68. $st = $db->prepare("UPDATE test SET some_bool_1=?, some_bool_2=?, some_int=? WHERE uid=?");
  69. $values = [
  70. 'uid' => 6,
  71. 'some_bool_1' => (bool) 0,
  72. 'some_bool_2' => (bool) 1,
  73. 'some_int' => 2,
  74. ];
  75. $st->bindParam(1, $values['some_bool_1'], PDO::PARAM_BOOL);
  76. $st->bindParam(2, $values['some_bool_2'], PDO::PARAM_BOOL);
  77. $st->bindParam(3, $values['some_int'], PDO::PARAM_INT);
  78. $st->bindParam(4, $values['uid'], PDO::PARAM_INT);
  79. $result = $st->execute();
  80. if ($result === false) {
  81. var_dump($st->errorInfo());
  82. } else {
  83. print("ok prepare 2\n");
  84. }
  85. foreach ($db->query('SELECT * from test') as $row) {
  86. print_r($row);
  87. }
  88. // String true and false should fail
  89. $st = $db->prepare("UPDATE test SET some_bool_1=?, some_bool_2=?, some_int=? WHERE uid=?");
  90. $values = [
  91. 'uid' => 6,
  92. 'some_bool_1' => 'true',
  93. 'some_bool_2' => 'false',
  94. 'some_int' => 3,
  95. ];
  96. $st->bindParam(1, $values['some_bool_1'], PDO::PARAM_BOOL);
  97. $st->bindParam(2, $values['some_bool_2'], PDO::PARAM_BOOL);
  98. $st->bindParam(3, $values['some_int'], PDO::PARAM_INT);
  99. $st->bindParam(4, $values['uid'], PDO::PARAM_INT);
  100. $result = $st->execute();
  101. if ($result === false) {
  102. var_dump($st->errorInfo());
  103. } else {
  104. print("ok prepare 3\n");
  105. }
  106. foreach ($db->query('SELECT * from test') as $row) {
  107. print_r($row);
  108. }
  109. // Null should not be treated as false
  110. $st = $db->prepare("UPDATE test SET some_bool_1=?, some_bool_2=?, some_int=? WHERE uid=?");
  111. $values = [
  112. 'uid' => 6,
  113. 'some_bool_1' => true,
  114. 'some_bool_2' => null,
  115. 'some_int' => 4,
  116. ];
  117. $st->bindParam(1, $values['some_bool_1'], PDO::PARAM_BOOL);
  118. $st->bindParam(2, $values['some_bool_2'], PDO::PARAM_BOOL);
  119. $st->bindParam(3, $values['some_int'], PDO::PARAM_INT);
  120. $st->bindParam(4, $values['uid'], PDO::PARAM_INT);
  121. $result = $st->execute();
  122. if ($result === false) {
  123. var_dump($st->errorInfo());
  124. } else {
  125. print("ok prepare 4\n");
  126. }
  127. foreach ($db->query('SELECT * from test') as $row) {
  128. print_r($row);
  129. }
  130. // Integers converted correctly
  131. $st = $db->prepare("UPDATE test SET some_bool_1=?, some_bool_2=?, some_int=? WHERE uid=?");
  132. $values = [
  133. 'uid' => 6,
  134. 'some_bool_1' => 256,
  135. 'some_bool_2' => 0,
  136. 'some_int' => 5,
  137. ];
  138. $st->bindParam(1, $values['some_bool_1'], PDO::PARAM_BOOL);
  139. $st->bindParam(2, $values['some_bool_2'], PDO::PARAM_BOOL);
  140. $st->bindParam(3, $values['some_int'], PDO::PARAM_INT);
  141. $st->bindParam(4, $values['uid'], PDO::PARAM_INT);
  142. $result = $st->execute();
  143. if ($result === false) {
  144. var_dump($st->errorInfo());
  145. } else {
  146. print("ok prepare 5\n");
  147. }
  148. foreach ($db->query('SELECT * from test') as $row) {
  149. print_r($row);
  150. }
  151. ?>
  152. --CLEAN--
  153. <?php
  154. require dirname(__FILE__) . '/mysql_pdo_test.inc';
  155. MySQLPDOTest::dropTestTable();
  156. ?>
  157. --EXPECTF--
  158. ok insert
  159. Array
  160. (
  161. [uid] => 6
  162. [0] => 6
  163. [some_bool_1] => 0
  164. [1] => 0
  165. [some_bool_2] => 1
  166. [2] => 1
  167. [some_int] => -23
  168. [3] => -23
  169. )
  170. ok prepare 1
  171. Array
  172. (
  173. [uid] => 6
  174. [0] => 6
  175. [some_bool_1] => 1
  176. [1] => 1
  177. [some_bool_2] => 0
  178. [2] => 0
  179. [some_int] => 1
  180. [3] => 1
  181. )
  182. ok prepare 2
  183. Array
  184. (
  185. [uid] => 6
  186. [0] => 6
  187. [some_bool_1] => 0
  188. [1] => 0
  189. [some_bool_2] => 1
  190. [2] => 1
  191. [some_int] => 2
  192. [3] => 2
  193. )
  194. Warning: PDOStatement::execute(): SQLSTATE[%s]: %s: 1366 Incorrect integer value: 'true' for column %s at row 1 in %s
  195. array(3) {
  196. [0]=>
  197. string(5) "%s"
  198. [1]=>
  199. int(1366)
  200. [2]=>
  201. string(%d) "Incorrect integer value: 'true' for column %s at row 1"
  202. }
  203. Array
  204. (
  205. [uid] => 6
  206. [0] => 6
  207. [some_bool_1] => 0
  208. [1] => 0
  209. [some_bool_2] => 1
  210. [2] => 1
  211. [some_int] => 2
  212. [3] => 2
  213. )
  214. Warning: PDOStatement::execute(): SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'some_bool_2' cannot be null in %s
  215. array(3) {
  216. [0]=>
  217. string(5) "23000"
  218. [1]=>
  219. int(1048)
  220. [2]=>
  221. string(35) "Column 'some_bool_2' cannot be null"
  222. }
  223. Array
  224. (
  225. [uid] => 6
  226. [0] => 6
  227. [some_bool_1] => 0
  228. [1] => 0
  229. [some_bool_2] => 1
  230. [2] => 1
  231. [some_int] => 2
  232. [3] => 2
  233. )
  234. ok prepare 5
  235. Array
  236. (
  237. [uid] => 6
  238. [0] => 6
  239. [some_bool_1] => 1
  240. [1] => 1
  241. [some_bool_2] => 0
  242. [2] => 0
  243. [some_int] => 5
  244. [3] => 5
  245. )