123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277 |
- --TEST--
- mysqli_stmt_attr_set() - mysqlnd does not check for invalid codes
- --SKIPIF--
- <?php
- require_once('skipif.inc');
- require_once('skipifemb.inc');
- require_once('skipifconnectfailure.inc');
- ?>
- --FILE--
- <?php
- require_once("connect.inc");
- $tmp = NULL;
- $link = NULL;
- if (!is_null($tmp = @mysqli_stmt_attr_set()))
- printf("[001] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
- if (!is_null($tmp = @mysqli_stmt_attr_set($link)))
- printf("[002] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
- if (!is_null($tmp = @mysqli_stmt_attr_set($link, $link)))
- printf("[003] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
- if (!is_null($tmp = @mysqli_stmt_attr_set($link, $link, $link)))
- printf("[004] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
- require('table.inc');
- $valid_attr = array(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
- if ((mysqli_get_client_version() > 50003) || $IS_MYSQLND) {
- $valid_attr[] = MYSQLI_STMT_ATTR_CURSOR_TYPE;
- $valid_attr[] = MYSQLI_CURSOR_TYPE_NO_CURSOR;
- $valid_attr[] = MYSQLI_CURSOR_TYPE_READ_ONLY;
- $valid_attr[] = MYSQLI_CURSOR_TYPE_FOR_UPDATE;
- $valid_attr[] = MYSQLI_CURSOR_TYPE_SCROLLABLE;
- }
- if ((mysqli_get_client_version() > 50007) || $IS_MYSQLND)
- $valid_attr[] = MYSQLI_STMT_ATTR_PREFETCH_ROWS;
- $stmt = mysqli_stmt_init($link);
- if (!is_null($tmp = @mysqli_stmt_attr_set($stmt, 0, 0)))
- printf("[005] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
- $stmt->prepare("SELECT * FROM test");
- mt_srand(microtime(true));
- for ($i = -100; $i < 1000; $i++) {
- if (in_array($i, $valid_attr))
- continue;
- $invalid_attr = $i;
- if (false !== ($tmp = @mysqli_stmt_attr_set($stmt, $invalid_attr, 0))) {
- printf("[006a] Expecting boolean/false for attribute %d, got %s/%s\n", $invalid_attr, gettype($tmp), $tmp);
- }
- }
- for ($i = 0; $i < 2; $i++) {
- do {
- $invalid_attr = mt_rand(-1 * (min(4294967296, PHP_INT_MAX) + 1), min(4294967296, PHP_INT_MAX));
- } while (in_array($invalid_attr, $valid_attr));
- if (false !== ($tmp = @mysqli_stmt_attr_set($stmt, $invalid_attr, 0))) {
- printf("[006b] Expecting boolean/false for attribute %d, got %s/%s\n", $invalid_attr, gettype($tmp), $tmp);
- }
- }
- $stmt->close();
- //
- // MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH
- //
- // expecting max_length not to be set and be 0 in all cases
- $stmt = mysqli_stmt_init($link);
- $stmt->prepare("SELECT label FROM test");
- $stmt->execute();
- $stmt->store_result();
- $res = $stmt->result_metadata();
- $fields = $res->fetch_fields();
- $max_lengths = array();
- foreach ($fields as $k => $meta) {
- $max_lengths[$meta->name] = $meta->max_length;
- if ($meta->max_length !== 0)
- printf("[007] max_length should be not set (= 0), got %s for field %s\n", $meta->max_length, $meta->name);
- }
- $res->close();
- $stmt->close();
- // expecting max_length to _be_ set
- $stmt = mysqli_stmt_init($link);
- $stmt->prepare("SELECT label FROM test");
- $stmt->attr_set(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH, 1);
- $res = $stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
- if ($res !== 1)
- printf("[007.1] max_length should be 1, got %s\n", $res);
- $stmt->execute();
- $stmt->store_result();
- $res = $stmt->result_metadata();
- $fields = $res->fetch_fields();
- $max_lengths = array();
- foreach ($fields as $k => $meta) {
- $max_lengths[$meta->name] = $meta->max_length;
- if ($meta->max_length === 0)
- printf("[008] max_length should be set (!= 0), got %s for field %s\n", $meta->max_length, $meta->name);
- }
- $res->close();
- $stmt->close();
- // expecting max_length not to be set
- $stmt = mysqli_stmt_init($link);
- $stmt->prepare("SELECT label FROM test");
- $stmt->attr_set(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH, 0);
- $res = $stmt->attr_get(MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH);
- if ($res !== 0)
- printf("[008.1] max_length should be 0, got %s\n", $res);
- $stmt->execute();
- $stmt->store_result();
- $res = $stmt->result_metadata();
- $fields = $res->fetch_fields();
- $max_lengths = array();
- foreach ($fields as $k => $meta) {
- $max_lengths[$meta->name] = $meta->max_length;
- if ($meta->max_length !== 0)
- printf("[009] max_length should not be set (= 0), got %s for field %s\n", $meta->max_length, $meta->name);
- }
- $res->close();
- $stmt->close();
- //
- // Cursors
- //
- if (mysqli_get_client_version() > 50003) {
- $cursor_types = array(
- MYSQLI_CURSOR_TYPE_NO_CURSOR,
- MYSQLI_CURSOR_TYPE_READ_ONLY,
- MYSQLI_CURSOR_TYPE_FOR_UPDATE,
- MYSQLI_CURSOR_TYPE_SCROLLABLE
- );
- do {
- $invalid_cursor_type = mt_rand(-1000, 1000);
- } while (in_array($invalid_cursor_type, $cursor_types));
- $stmt = mysqli_stmt_init($link);
- $stmt->prepare("SELECT id, label FROM test");
- if (false !== ($tmp = @$stmt->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, $invalid_cursor_type)))
- printf("[010] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
- if (false !== ($tmp = $stmt->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_TYPE_FOR_UPDATE)))
- printf("[011] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
- if (false !== ($tmp = $stmt->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_TYPE_SCROLLABLE)))
- printf("[012] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
- if (true !== ($tmp = $stmt->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_TYPE_NO_CURSOR)))
- printf("[013] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp);
- if (true !== ($tmp = $stmt->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_TYPE_READ_ONLY)))
- printf("[014] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp);
- $stmt->close();
- $stmt = mysqli_stmt_init($link);
- $stmt->prepare("SELECT id, label FROM test");
- $stmt->execute();
- $id = $label = NULL;
- $stmt->bind_result($id, $label);
- $results = array();
- while ($stmt->fetch())
- $results[$id] = $label;
- $stmt->close();
- if (empty($results))
- printf("[015] Results should not be empty, subsequent tests will probably fail!\n");
- $stmt = mysqli_stmt_init($link);
- $stmt->prepare("SELECT id, label FROM test");
- if (true !== ($tmp = $stmt->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_TYPE_NO_CURSOR)))
- printf("[016] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp);
- $stmt->execute();
- $id = $label = NULL;
- $stmt->bind_result($id, $label);
- $results2 = array();
- while ($stmt->fetch())
- $results2[$id] = $label;
- $stmt->close();
- if ($results != $results2) {
- printf("[017] Results should not differ. Dumping both result sets.\n");
- var_dump($results);
- var_dump($results2);
- }
- $stmt = mysqli_stmt_init($link);
- $stmt->prepare("SELECT id, label FROM test");
- if (true !== ($tmp = $stmt->attr_set(MYSQLI_STMT_ATTR_CURSOR_TYPE, MYSQLI_CURSOR_TYPE_READ_ONLY)))
- printf("[018] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp);
- $stmt->execute();
- $id = $label = NULL;
- $stmt->bind_result($id, $label);
- $results2 = array();
- while ($stmt->fetch())
- $results2[$id] = $label;
- $stmt->close();
- if ($results != $results2) {
- printf("[019] Results should not differ. Dumping both result sets.\n");
- var_dump($results);
- var_dump($results2);
- }
- }
- //
- // MYSQLI_STMT_ATTR_PREFETCH_ROWS
- //
- if (mysqli_get_client_version() > 50007) {
- $stmt = mysqli_stmt_init($link);
- $stmt->prepare("SELECT id, label FROM test");
- if (true !== ($tmp = $stmt->attr_set(MYSQLI_STMT_ATTR_PREFETCH_ROWS, 1)))
- printf("[020] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp);
- $stmt->execute();
- $id = $label = NULL;
- $stmt->bind_result($id, $label);
- $results = array();
- while ($stmt->fetch())
- $results[$id] = $label;
- $stmt->close();
- if (empty($results))
- printf("[021] Results should not be empty, subsequent tests will probably fail!\n");
- /* prefetch is not supported
- $stmt = mysqli_stmt_init($link);
- $stmt->prepare("SELECT label FROM test");
- if (false !== ($tmp = $stmt->attr_set(MYSQLI_STMT_ATTR_PREFETCH_ROWS, -1)))
- printf("[022] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
- $stmt->close();
- $stmt = mysqli_stmt_init($link);
- $stmt->prepare("SELECT label FROM test");
- if (true !== ($tmp = $stmt->attr_set(MYSQLI_STMT_ATTR_PREFETCH_ROWS, PHP_INT_MAX)))
- printf("[023] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp);
- $stmt->close();
- $stmt = mysqli_stmt_init($link);
- $stmt->prepare("SELECT id, label FROM test");
- if (true !== ($tmp = $stmt->attr_set(MYSQLI_STMT_ATTR_PREFETCH_ROWS, 2)))
- printf("[024] Expecting boolean/true, got %s/%s\n", gettype($tmp), $tmp);
- $stmt->execute();
- $id = $label = NULL;
- $stmt->bind_result($id, $label);
- $results2 = array();
- while ($stmt->fetch())
- $results2[$id] = $label;
- $stmt->close();
- if ($results != $results2) {
- printf("[025] Results should not differ. Dumping both result sets.\n");
- var_dump($results);
- var_dump($results2);
- }
- */
- }
- mysqli_close($link);
- print "done!";
- ?>
- --CLEAN--
- <?php
- require_once("clean_table.inc");
- ?>
- --EXPECTF--
- done!
|