mysqli_stmt_affected_rows.phpt 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. --TEST--
  2. mysqli_stmt_affected_rows()
  3. --SKIPIF--
  4. <?php
  5. require_once('skipif.inc');
  6. require_once('skipifemb.inc');
  7. require_once('skipifconnectfailure.inc');
  8. ?>
  9. --FILE--
  10. <?php
  11. require_once("connect.inc");
  12. $tmp = NULL;
  13. $link = NULL;
  14. if (!is_null($tmp = @mysqli_stmt_affected_rows()))
  15. printf("[001] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
  16. if (!is_null($tmp = @mysqli_stmt_affected_rows($link)))
  17. printf("[002] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
  18. if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket)) {
  19. printf("Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n",
  20. $host, $user, $db, $port, $socket);
  21. }
  22. $stmt = mysqli_stmt_init($link);
  23. if (!mysqli_stmt_prepare($stmt, 'DROP TABLE IF EXISTS test') ||
  24. !mysqli_stmt_execute($stmt)) {
  25. printf("[003] Failed to drop old test table: [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
  26. }
  27. if (!mysqli_stmt_prepare($stmt, 'CREATE TABLE test(id INT, label CHAR(1), PRIMARY KEY(id)) ENGINE = ' . $engine) ||
  28. !mysqli_stmt_execute($stmt)) {
  29. printf("[004] Failed to create test table: [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
  30. }
  31. if (0 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
  32. printf("[005] Expecting int/0, got %s/'%s'\n", gettype($tmp), $tmp);
  33. mysqli_stmt_close($stmt);
  34. $stmt = mysqli_stmt_init($link);
  35. if (!mysqli_stmt_prepare($stmt, "INSERT INTO test(id, label) VALUES (1, 'a')") ||
  36. !mysqli_stmt_execute($stmt))
  37. printf("[006] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
  38. mysqli_stmt_close($stmt);
  39. $stmt = mysqli_stmt_init($link);
  40. if (!mysqli_stmt_prepare($stmt, "INSERT INTO test(id, label) VALUES (100, 'z')") ||
  41. !mysqli_stmt_execute($stmt))
  42. printf("[007] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
  43. if (1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
  44. printf("[008] Expecting int/1, got %s/%s\n", gettype($tmp), $tmp);
  45. mysqli_stmt_close($stmt);
  46. $stmt = mysqli_stmt_init($link);
  47. if (!mysqli_stmt_prepare($stmt, "INSERT INTO test(id, label) VALUES (100, 'z')") ||
  48. !mysqli_stmt_execute($stmt))
  49. // NOTE: the error message varies with the MySQL Server version, dump only the error code!
  50. printf("[009] [%d] (error message varies with the MySQL Server version, check the error code)\n", mysqli_stmt_errno($stmt));
  51. /* an error occurred: affected rows should return -1 */
  52. if (-1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
  53. printf("[010] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp);
  54. mysqli_stmt_close($stmt);
  55. $stmt = mysqli_stmt_init($link);
  56. if (!mysqli_stmt_prepare($stmt, "INSERT INTO test(id, label) VALUES (1, 'a') ON DUPLICATE KEY UPDATE id = 4") ||
  57. !mysqli_stmt_execute($stmt))
  58. printf("[011] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
  59. if (2 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
  60. printf("[012] Expecting int/2, got %s/%s\n", gettype($tmp), $tmp);
  61. mysqli_stmt_close($stmt);
  62. $stmt = mysqli_stmt_init($link);
  63. if (!mysqli_stmt_prepare($stmt, "INSERT INTO test(id, label) VALUES (2, 'b'), (3, 'c')") ||
  64. !mysqli_stmt_execute($stmt))
  65. printf("[013] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
  66. if (2 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
  67. printf("[014] Expecting int/2, got %s/%s\n", gettype($tmp), $tmp);
  68. mysqli_stmt_close($stmt);
  69. $stmt = mysqli_stmt_init($link);
  70. if (!mysqli_stmt_prepare($stmt, "INSERT IGNORE INTO test(id, label) VALUES (1, 'a')") ||
  71. !mysqli_stmt_execute($stmt))
  72. printf("[015] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
  73. if (1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
  74. printf("[016] Expecting int/1, got %s/%s\n", gettype($tmp), $tmp);
  75. if (!($res = mysqli_query($link, "SELECT count(id) AS num FROM test")) ||
  76. !($tmp = mysqli_fetch_assoc($res)))
  77. printf("[017] [%d] %s\n", mysqli_error($link), mysqli_error($link));
  78. $num = (int)$tmp['num'];
  79. mysqli_free_result($res);
  80. mysqli_stmt_close($stmt);
  81. $stmt = mysqli_stmt_init($link);
  82. if (!mysqli_stmt_prepare($stmt, "INSERT INTO test(id, label) SELECT id + 10, label FROM test") ||
  83. !mysqli_stmt_execute($stmt))
  84. printf("[018] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
  85. if ($num !== ($tmp = mysqli_stmt_affected_rows($stmt)))
  86. printf("[019] Expecting int/%d, got %s/%s\n", $num, gettype($tmp), $tmp);
  87. mysqli_stmt_close($stmt);
  88. $stmt = mysqli_stmt_init($link);
  89. if (!mysqli_stmt_prepare($stmt, "REPLACE INTO test(id, label) values (4, 'd')") ||
  90. !mysqli_stmt_execute($stmt))
  91. printf("[020] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
  92. if (2 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
  93. printf("[021] Expecting int/2, got %s/%s\n", gettype($tmp), $tmp);
  94. mysqli_stmt_close($stmt);
  95. $stmt = mysqli_stmt_init($link);
  96. if (!mysqli_stmt_prepare($stmt, "REPLACE INTO test(id, label) values (5, 'e')") ||
  97. !mysqli_stmt_execute($stmt))
  98. printf("[022] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
  99. if (1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
  100. printf("[023] Expecting int/1, got %s/%s\n", gettype($tmp), $tmp);
  101. mysqli_stmt_close($stmt);
  102. $stmt = mysqli_stmt_init($link);
  103. if (!mysqli_stmt_prepare($stmt, "UPDATE test SET label = 'a' WHERE id = 2") ||
  104. !mysqli_stmt_execute($stmt))
  105. printf("[024] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
  106. if (1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
  107. printf("[025] Expecting int/1, got %s/%s\n", gettype($tmp), $tmp);
  108. if (!mysqli_stmt_prepare($stmt, "UPDATE test SET label = 'a' WHERE id = 2") ||
  109. !mysqli_stmt_execute($stmt))
  110. printf("[026] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
  111. if (0 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
  112. printf("[027] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp);
  113. mysqli_stmt_close($stmt);
  114. $stmt = mysqli_stmt_init($link);
  115. if (!mysqli_stmt_prepare($stmt, "UPDATE test SET label = 'a' WHERE id = 100") ||
  116. !mysqli_stmt_execute($stmt))
  117. printf("[028] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
  118. if (1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
  119. printf("[029] Expecting int/1, got %s/%s\n", gettype($tmp), $tmp);
  120. if (!mysqli_stmt_prepare($stmt, 'SELECT label FROM test WHERE id = 100') ||
  121. !mysqli_stmt_execute($stmt))
  122. printf("[030] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
  123. /* use it like num_rows */
  124. /* PS are unbuffered, num_rows cannot determine the row count before all rows have been fetched and/or buffered */
  125. if (-1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
  126. printf("[031] Expecting int/-1, got %s/%s\n", gettype($tmp), $tmp);
  127. if (0 !== ($tmp = mysqli_stmt_num_rows($stmt)))
  128. printf("[032] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp);
  129. if (!mysqli_stmt_store_result($stmt))
  130. printf("[033] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
  131. if (1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
  132. printf("[034] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp);
  133. if (1 !== ($tmp = mysqli_stmt_num_rows($stmt)))
  134. printf("[035] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp);
  135. mysqli_stmt_free_result($stmt);
  136. mysqli_stmt_close($stmt);
  137. $stmt = mysqli_stmt_init($link);
  138. if (!mysqli_stmt_prepare($stmt, 'SELECT label FROM test WHERE 1 = 2') ||
  139. !mysqli_stmt_execute($stmt))
  140. printf("[036] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
  141. /* use it like num_rows */
  142. if (-1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
  143. printf("[037] Expecting int/-1, got %s/%s\n", gettype($tmp), $tmp);
  144. if (true !== ($tmp = mysqli_stmt_store_result($stmt)))
  145. printf("[038] Expecting boolean/true, got %s\%s\n", gettype($tmp), $tmp);
  146. if (0 !== ($tmp = mysqli_stmt_num_rows($stmt)))
  147. printf("[039] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp);
  148. if (0 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
  149. printf("[040] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp);
  150. /* try to use stmt_affected_rows like stmt_num_rows */
  151. /* stmt_affected_rows is not really meant for SELECT! */
  152. if (mysqli_stmt_prepare($stmt, 'SELECT unknown_column FROM this_table_does_not_exist') ||
  153. mysqli_stmt_execute($stmt))
  154. printf("[041] The invalid SELECT statement is issued on purpose\n");
  155. if (-1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
  156. printf("[042] Expecting int/-1, got %s/%s\n", gettype($tmp), $tmp);
  157. if ($IS_MYSQLND) {
  158. if (false !== ($tmp = mysqli_stmt_store_result($stmt)))
  159. printf("[043] Expecting boolean/false, got %s\%s\n", gettype($tmp), $tmp);
  160. } else {
  161. if (true !== ($tmp = mysqli_stmt_store_result($stmt)))
  162. printf("[043] Libmysql does not care if the previous statement was bogus, expecting boolean/true, got %s\%s\n", gettype($tmp), $tmp);
  163. }
  164. if (0 !== ($tmp = mysqli_stmt_num_rows($stmt)))
  165. printf("[044] Expecting int/0, got %s/%s\n", gettype($tmp), $tmp);
  166. if (-1 !== ($tmp = mysqli_stmt_affected_rows($stmt)))
  167. printf("[045] Expecting int/-1, got %s/%s\n", gettype($tmp), $tmp);
  168. mysqli_stmt_close($stmt);
  169. $stmt = mysqli_stmt_init($link);
  170. if (!mysqli_stmt_prepare($stmt, "DROP TABLE IF EXISTS test") ||
  171. !mysqli_stmt_execute($stmt))
  172. printf("[046] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
  173. mysqli_stmt_close($stmt);
  174. if (!is_null($tmp = mysqli_stmt_affected_rows($stmt)))
  175. printf("[047] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
  176. mysqli_close($link);
  177. print "done!";
  178. ?>
  179. --CLEAN--
  180. <?php
  181. require_once("clean_table.inc");
  182. ?>
  183. --EXPECTF--
  184. [009] [%d] (error message varies with the MySQL Server version, check the error code)
  185. Warning: mysqli_stmt_affected_rows(): Couldn't fetch mysqli_stmt in %s on line %d
  186. done!