bug_38546.phpt 6.1 KB

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