bug_44707.phpt 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. --TEST--
  2. Bug #44707 (The MySQL PDO driver resets variable content after bindParam on tinyint field)
  3. --EXTENSIONS--
  4. pdo
  5. pdo_mysql
  6. --SKIPIF--
  7. <?php
  8. require_once(__DIR__ . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
  9. MySQLPDOTest::skip();
  10. $db = MySQLPDOTest::factory();
  11. $stmt = $db->query('SELECT VERSION() as _version');
  12. $row = $stmt->fetch(PDO::FETCH_ASSOC);
  13. $matches = array();
  14. if (!preg_match('/^(\d+)\.(\d+)\.(\d+)/ismU', $row['_version'], $matches))
  15. die(sprintf("skip Cannot determine MySQL Server version\n"));
  16. $version = $matches[1] * 10000 + $matches[2] * 100 + $matches[3];
  17. if ($version < 41000)
  18. die(sprintf("skip Will work different with MySQL Server < 4.1.0, found %d.%02d.%02d (%d)\n",
  19. $matches[1], $matches[2], $matches[3], $version));
  20. ?>
  21. --FILE--
  22. <?php
  23. require __DIR__ . '/config.inc';
  24. require __DIR__ . '/../../../ext/pdo/tests/pdo_test.inc';
  25. $db = PDOTest::test_factory(__DIR__ . '/common.phpt');
  26. function bug_44707($db) {
  27. $db->exec('DROP TABLE IF EXISTS test');
  28. $db->exec('CREATE TABLE test(id INT, mybool TINYINT)');
  29. $id = 1;
  30. $mybool = false;
  31. var_dump($mybool);
  32. $stmt = $db->prepare('INSERT INTO test(id, mybool) VALUES (?, ?)');
  33. $stmt->bindParam(1, $id);
  34. $stmt->bindParam(2, $mybool, PDO::PARAM_BOOL);
  35. var_dump($mybool);
  36. $stmt->execute();
  37. var_dump($mybool);
  38. $stmt = $db->query('SELECT * FROM test');
  39. var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
  40. $stmt = $db->prepare('INSERT INTO test(id, mybool) VALUES (?, ?)');
  41. $stmt->bindParam(1, $id);
  42. // INT and integer work well together
  43. $stmt->bindParam(2, $mybool, PDO::PARAM_INT);
  44. $stmt->execute();
  45. $stmt = $db->query('SELECT * FROM test');
  46. var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
  47. }
  48. /*
  49. // This is beyond the control of the driver... - the driver never gets in touch with bound values
  50. print "Emulated Prepared Statements\n";
  51. $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1);
  52. bug_44707($db);
  53. */
  54. print "Native Prepared Statements\n";
  55. $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 0);
  56. bug_44707($db);
  57. print "done!";
  58. ?>
  59. --EXPECT--
  60. Native Prepared Statements
  61. bool(false)
  62. bool(false)
  63. bool(false)
  64. array(1) {
  65. [0]=>
  66. array(2) {
  67. ["id"]=>
  68. string(1) "1"
  69. ["mybool"]=>
  70. string(1) "0"
  71. }
  72. }
  73. array(2) {
  74. [0]=>
  75. array(2) {
  76. ["id"]=>
  77. string(1) "1"
  78. ["mybool"]=>
  79. string(1) "0"
  80. }
  81. [1]=>
  82. array(2) {
  83. ["id"]=>
  84. string(1) "1"
  85. ["mybool"]=>
  86. string(1) "0"
  87. }
  88. }
  89. done!