Annotation of embedaddon/php/ext/mysqli/tests/mysqli_stmt_bind_param.phpt, revision 1.1

1.1     ! misho       1: --TEST--
        !             2: mysqli_stmt_bind_param()
        !             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:        /*
        !            12:        The way we test the INSERT and data types overlaps with
        !            13:        the mysqli_stmt_bind_result test in large parts. There is only
        !            14:        one difference. This test uses mysqli_query()/mysqli_fetch_assoc() to
        !            15:        fetch the inserted values. This way we test
        !            16:        mysqli_query()/mysqli_fetch_assoc() for all possible data types
        !            17:        in this file and we test mysqli_stmt_bind_result() in the other
        !            18:        test -- therefore the "duplicate" makes some sense to me.
        !            19:        */
        !            20:        require_once("connect.inc");
        !            21: 
        !            22:        $tmp    = NULL;
        !            23:        $link   = NULL;
        !            24: 
        !            25:        if (!is_null($tmp = @mysqli_stmt_bind_param()))
        !            26:                printf("[001] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
        !            27: 
        !            28:        if (!is_null($tmp = @mysqli_stmt_bind_param($link)))
        !            29:                printf("[002] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
        !            30: 
        !            31:        if (!is_null($tmp = @mysqli_stmt_bind_param($link, $link)))
        !            32:                printf("[002] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
        !            33: 
        !            34:        require('table.inc');
        !            35: 
        !            36:        $stmt = mysqli_stmt_init($link);
        !            37:        if (!mysqli_stmt_prepare($stmt, "INSERT INTO test(id, label) VALUES (?, ?)"))
        !            38:                printf("[003] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
        !            39: 
        !            40:        $id = null;
        !            41:        $label = null;
        !            42: 
        !            43:        /*
        !            44:        libmysql gives a less descriptive error message but mysqlnd,
        !            45:        we did not unify the error messages but ignore this slight difference silently
        !            46:        */
        !            47:        if (!false === ($tmp = @mysqli_stmt_bind_param($stmt, " ", $tmp)))
        !            48:                printf("[003d] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
        !            49: 
        !            50:        if (!false === ($tmp = @mysqli_stmt_bind_param($stmt, "", $id, $label)))
        !            51:                printf("[003a] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
        !            52: 
        !            53:        /* TODO: somehwhat undocumented syntax! */
        !            54:        $param = array($id);
        !            55:        if (!false === ($tmp = mysqli_stmt_bind_param($stmt, "is", $param)))
        !            56:                printf("[003b] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
        !            57: 
        !            58:        $param = array($id, $label, $id);
        !            59:        if (!false === ($tmp = mysqli_stmt_bind_param($stmt, "is", $param)))
        !            60:                printf("[003c] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
        !            61: 
        !            62:        if (!false === ($tmp = mysqli_stmt_bind_param($stmt, "a", $id)))
        !            63:                printf("[004] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
        !            64: 
        !            65:        if (!false === ($tmp = mysqli_stmt_bind_param($stmt, "a", $id, $label)))
        !            66:                printf("[005] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
        !            67: 
        !            68:        if (!false === ($tmp = mysqli_stmt_bind_param($stmt, "aa", $id, $label)))
        !            69:                printf("[006] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
        !            70: 
        !            71:        if (!false === ($tmp = mysqli_stmt_bind_param($stmt, "ia", $id, $label)))
        !            72:                printf("[007] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
        !            73: 
        !            74:        if (!true === ($tmp = mysqli_stmt_bind_param($stmt, "is", $id, $label)))
        !            75:                printf("[008] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
        !            76: 
        !            77:        if (function_exists("memory_get_usage")) {
        !            78:                $mem = memory_get_usage();
        !            79:                for ($i = 0; $i < 20000; $i++) {
        !            80:                        if (!true === ($tmp = mysqli_stmt_bind_param($stmt, "is", $id, $label)))
        !            81:                                printf("[008][$i] Expecting boolean/false, got %s/%s\n", gettype($tmp), $tmp);
        !            82:                }
        !            83:                if (($tmp = (memory_get_usage() - $mem)) > 600)
        !            84:                        printf("[009] Function seems to be leaking, because it used %d bytes. During tests it used only 92 bytes.", $tmp);
        !            85:        }
        !            86: 
        !            87:        $id = 100;
        !            88:        $label = "z";
        !            89:        if (!mysqli_stmt_execute($stmt))
        !            90:                printf("[010] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
        !            91: 
        !            92:        mysqli_stmt_close($stmt);
        !            93: 
        !            94:        if (!($res = mysqli_query($link, "SELECT id, label FROM test WHERE id = " . $id)))
        !            95:                printf("[011] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
        !            96:        $row = mysqli_fetch_assoc($res);
        !            97:        if (($row['id'] != $id) || ($row['label'] != $label))
        !            98:                printf("[012] Expecting '%s'/%s', got '%s'/%s'!\n", $id, $label, $row['id'], $row['label']);
        !            99:        mysqli_free_result($res);
        !           100: 
        !           101:        function func_mysqli_stmt_bind_datatype($link, $engine, $bind_type, $sql_type, $bind_value, $offset, $alternative = null) {
        !           102: 
        !           103:                if (!mysqli_query($link, "DROP TABLE IF EXISTS test")) {
        !           104:                        printf("[%03d] [%d] %s\n", $offset, mysqli_errno($link), mysqli_error($link));
        !           105:                        return false;
        !           106:                }
        !           107: 
        !           108:                if (!mysqli_query($link, sprintf("CREATE TABLE test(id INT NOT NULL, label %s, PRIMARY KEY(id)) ENGINE = %s", $sql_type, $engine))) {
        !           109:                        // don't bail - it might be that the server does not support the data type
        !           110:                        return false;
        !           111:                }
        !           112: 
        !           113:                if (!$stmt = mysqli_stmt_init($link)) {
        !           114:                        printf("[%03d] [%d] %s\n", $offset + 1, mysqli_errno($link), mysqli_error($link));
        !           115:                        return false;
        !           116:                }
        !           117: 
        !           118:                if (!mysqli_stmt_prepare($stmt, "INSERT INTO test(id, label) VALUE (?, ?)")) {
        !           119:                        printf("[%03d] [%d] %s\n", $offset + 2, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
        !           120:                        return false;
        !           121:                }
        !           122: 
        !           123:                $id = 1;
        !           124:                if (!mysqli_stmt_bind_param($stmt, "i" . $bind_type, $id, $bind_value)) {
        !           125:                        printf("[%03d] [%d] %s\n", $offset + 3, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
        !           126:                        return false;
        !           127:                }
        !           128: 
        !           129:                if (!mysqli_stmt_execute($stmt)) {
        !           130:                        printf("[%03d] [%d] %s\n", $offset + 4, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
        !           131:                        return false;
        !           132:                }
        !           133:                mysqli_stmt_close($stmt);
        !           134: 
        !           135:                if (!$res = mysqli_query($link, "SELECT id, label FROM test")) {
        !           136:                        printf("[%03d] [%d] %s\n", $offset + 5, mysqli_errno($link), mysqli_error($link));
        !           137:                        return false;
        !           138:                }
        !           139: 
        !           140:                if (!$row = mysqli_fetch_assoc($res)) {
        !           141:                        printf("[%03d] [%d] %s\n", $offset + 5, mysqli_errno($link), mysqli_error($link));
        !           142:                        return false;
        !           143:                }
        !           144: 
        !           145:                if ($alternative) {
        !           146:                        if (($row['id'] != $id) || (($row['label'] != $bind_value) && ($row['label'] != $alternative))) {
        !           147:                                printf("[%03d] Testing '%s', '%s': expecting '%s'/'%s' (%s), got '%s'/'%s'\n",
        !           148:                                        $offset + 6, $bind_type, $sql_type,
        !           149:                                        $id, $bind_value, gettype($bind_value), $row['id'], $row['label']);
        !           150:                                return false;
        !           151:                        }
        !           152:                } else {
        !           153:                        if (($row['id'] != $id) || ($row['label'] != $bind_value)) {
        !           154:                                printf("[%03d] Testing '%s', '%s': expecting '%s'/'%s', got '%s'/'%s'\n",
        !           155:                                        $offset + 6, $bind_type, $sql_type,
        !           156:                                        $id, $bind_value, $row['id'], $row['label']);
        !           157:                                return false;
        !           158:                        }
        !           159:                }
        !           160: 
        !           161:                mysqli_free_result($res);
        !           162:                return true;
        !           163:        }
        !           164: 
        !           165:        function func_mysqli_stmt_bind_make_string($len) {
        !           166: 
        !           167:                $ret = '';
        !           168:                for ($i = 0; $i < $len; $i++)
        !           169:                        $ret .= chr(mt_rand(65, 90));
        !           170: 
        !           171:                return $ret;
        !           172:        }
        !           173: 
        !           174:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "TINYINT", -11, 20);
        !           175:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "TINYINT", NULL, 30);
        !           176:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "TINYINT UNSIGNED", 1, 40);
        !           177:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "TINYINT UNSIGNED", NULL, 50);
        !           178: 
        !           179:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "BOOL", 1, 60);
        !           180:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "BOOL", NULL, 70);
        !           181:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "BOOLEAN", 0, 80);
        !           182:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "BOOLEAN", NULL, 90);
        !           183: 
        !           184:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "SMALLINT", -32768, 100);
        !           185:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "SMALLINT", 32767, 110);
        !           186:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "SMALLINT", NULL, 120);
        !           187:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "SMALLINT UNSIGNED", 65535, 130);
        !           188:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "SMALLINT UNSIGNED", NULL, 140);
        !           189: 
        !           190:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "MEDIUMINT", -8388608, 150);
        !           191:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "MEDIUMINT", 8388607, 160);
        !           192:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "MEDIUMINT", NULL, 170);
        !           193:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "MEDIUMINT UNSIGNED", 16777215, 180);
        !           194:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "MEDIUMINT UNSIGNED", NULL, 190);
        !           195: 
        !           196:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "INTEGER", -2147483648, 200);
        !           197:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "INTEGER", 2147483647, 210);
        !           198:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "INTEGER", NULL, 220);
        !           199:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "INTEGER UNSIGNED", (defined("PHP_INT_MAX")) ? min(4294967295, PHP_INT_MAX) : 1, 230);
        !           200:        func_mysqli_stmt_bind_datatype($link, $engine, "d", "INTEGER UNSIGNED", 4294967295, 240);
        !           201:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "INTEGER UNSIGNED", NULL, 250);
        !           202: 
        !           203:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "BIGINT", -1 * PHP_INT_MAX + 1, 260);
        !           204:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "BIGINT", NULL, 270);
        !           205:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "BIGINT", PHP_INT_MAX, 280);
        !           206:        func_mysqli_stmt_bind_datatype($link, $engine, "i", "BIGINT UNSIGNED", NULL, 290);
        !           207: 
        !           208:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "BIGINT", "-9223372036854775808", 900);
        !           209:        // ?? func_mysqli_stmt_bind_datatype($link, $engine, "d", "BIGINT", -9223372036854775808, 910);
        !           210:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "BIGINT UNSIGNED", "18446744073709551615", 920);
        !           211: 
        !           212: /*
        !           213:        ??
        !           214:        func_mysqli_stmt_bind_datatype($link, $engine, "d", "FLOAT", -9223372036854775808 - 1.1, 300);
        !           215:        func_mysqli_stmt_bind_datatype($link, $engine, "d", "FLOAT UNSIGNED", 18446744073709551615 + 1.1, 320);
        !           216:        */
        !           217:        func_mysqli_stmt_bind_datatype($link, $engine, "d", "FLOAT", NULL, 310);
        !           218:        func_mysqli_stmt_bind_datatype($link, $engine, "d", "FLOAT UNSIGNED ", NULL, 330);
        !           219:        if (2147483647 == PHP_INT_MAX) {
        !           220:                func_mysqli_stmt_bind_datatype($link, $engine, "d", "FLOAT UNSIGNED", PHP_INT_MAX, 930, '2.14748e+09');
        !           221:                func_mysqli_stmt_bind_datatype($link, $engine, "d", "FLOAT", -1 * PHP_INT_MAX + 1, 940, '-2.14748e+09');
        !           222:        }
        !           223:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "FLOAT", "-9223372036854775808", 300, '-9.22337e+18');
        !           224:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "FLOAT UNSIGNED", "18446744073709551615", 320, '1.84467e+19');
        !           225:        func_mysqli_stmt_bind_datatype($link, $engine, "d", "FLOAT", -10.01, 950);
        !           226:        func_mysqli_stmt_bind_datatype($link, $engine, "d", "FLOAT UNSIGNED", 10.01, 960);
        !           227: 
        !           228:        func_mysqli_stmt_bind_datatype($link, $engine, "d", "DOUBLE(10,2)", NULL, 350);
        !           229:        func_mysqli_stmt_bind_datatype($link, $engine, "d", "DOUBLE(10,2) UNSIGNED", NULL, 370);
        !           230:        func_mysqli_stmt_bind_datatype($link, $engine, "d", "DOUBLE(10,2)", -99999999.99, 340);
        !           231:        func_mysqli_stmt_bind_datatype($link, $engine, "d", "DOUBLE(10,2) UNSIGNED", 99999999.99, 360);
        !           232: 
        !           233:        /*
        !           234:        func_mysqli_stmt_bind_datatype($link, $engine, "d", "DOUBLE(10,2)", -99999999.99, 340);
        !           235:        func_mysqli_stmt_bind_datatype($link, $engine, "d", "DOUBLE(10,2) UNSIGNED", 99999999.99, 360);
        !           236:                */
        !           237:        func_mysqli_stmt_bind_datatype($link, $engine, "d", "DECIMAL(10,2)", -99999999.99, 380);
        !           238:        func_mysqli_stmt_bind_datatype($link, $engine, "d", "DECIMAL(10,2)", NULL, 390);
        !           239:        func_mysqli_stmt_bind_datatype($link, $engine, "d", "DECIMAL(10,2)", 99999999.99, 400);
        !           240:        func_mysqli_stmt_bind_datatype($link, $engine, "d", "DECIMAL(10,2)", NULL, 410);
        !           241: 
        !           242:        // don't care about date() strict TZ warnings...
        !           243:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "DATE", @date('Y-m-d'), 420);
        !           244:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "DATE NOT NULL", @date('Y-m-d'), 430);
        !           245:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "DATE", NULL, 440);
        !           246: 
        !           247:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "DATETIME", @date('Y-m-d H:i:s'), 450);
        !           248:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "DATETIME NOT NULL", @date('Y-m-d H:i:s'), 460);
        !           249:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "DATETIME", NULL, 470);
        !           250: 
        !           251:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "TIMESTAMP", @date('Y-m-d H:i:s'), 480);
        !           252: 
        !           253:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "TIME", @date('H:i:s'), 490);
        !           254:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "TIME NOT NULL", @date('H:i:s'), 500);
        !           255:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "TIME", NULL, 510);
        !           256: 
        !           257:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "YEAR", @date('Y'), 520);
        !           258:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "YEAR NOT NULL", @date('Y'), 530);
        !           259:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "YEAR", NULL, 540);
        !           260: 
        !           261:        $string255 = func_mysqli_stmt_bind_make_string(255);
        !           262:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "CHAR(1)", "a", 550);
        !           263:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "CHAR(255)", $string255, 560);
        !           264:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "CHAR(1) NOT NULL", "a", 570);
        !           265:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "CHAR(1)", NULL, 580);
        !           266: 
        !           267:        $string65k = func_mysqli_stmt_bind_make_string(65535);
        !           268:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "VARCHAR(1)", "a", 590);
        !           269:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "VARCHAR(255)", $string255, 600);
        !           270:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "VARCHAR(65635)", $string65k, 610);
        !           271:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "VARCHAR(1) NOT NULL", "a", 620);
        !           272:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "VARCHAR(1)", NULL, 630);
        !           273: 
        !           274:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "BINARY(1)", "a", 640);
        !           275:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "BINARY(1)", chr(0), 650);
        !           276:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "BINARY(1) NOT NULL", "b", 660);
        !           277:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "BINARY(1)", NULL, 670);
        !           278: 
        !           279:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "VARBINARY(1)", "a", 680);
        !           280:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "VARBINARY(1)", chr(0), 690);
        !           281:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "VARBINARY(1) NOT NULL", "b", 700);
        !           282:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "VARBINARY(1)", NULL, 710);
        !           283: 
        !           284:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "TINYBLOB", "a", 720);
        !           285:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "TINYBLOB", chr(0), 730);
        !           286:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "TINYBLOB NOT NULL", "b", 740);
        !           287:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "TINYBLOB", NULL, 750);
        !           288: 
        !           289:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "TINYTEXT", "a", 760);
        !           290:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "TINYTEXT NOT NULL", "a", 770);
        !           291:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "TINYTEXT", NULL, 780);
        !           292: 
        !           293:        // Note: you cannot insert any blob values this way. But you can check the API at least partly this way
        !           294:        // Extra BLOB tests are in mysqli_stmt_send_long()
        !           295:        func_mysqli_stmt_bind_datatype($link, $engine, "b", "BLOB", "", 790);
        !           296:        func_mysqli_stmt_bind_datatype($link, $engine, "b", "TEXT", "", 800);
        !           297:        func_mysqli_stmt_bind_datatype($link, $engine, "b", "MEDIUMBLOB", "", 810);
        !           298:        func_mysqli_stmt_bind_datatype($link, $engine, "b", "MEDIUMTEXT", "", 820);
        !           299:        func_mysqli_stmt_bind_datatype($link, $engine, "b", "LONGBLOB", "", 830);
        !           300:        func_mysqli_stmt_bind_datatype($link, $engine, "b", "LONGTEXT", "", 840);
        !           301: 
        !           302:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "ENUM('a', 'b')", "a", 850);
        !           303:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "ENUM('a', 'b')", NULL, 860);
        !           304:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "SET('a', 'b')", "a", 870);
        !           305:        func_mysqli_stmt_bind_datatype($link, $engine, "s", "SET('a', 'b')", NULL, 880);
        !           306: 
        !           307:        if (mysqli_get_server_version($link) >= 50600)
        !           308:                func_mysqli_stmt_bind_datatype($link, $engine, "s", "TIME", "13:27:34.123456", 890, "13:27:34");
        !           309: 
        !           310:        $stmt = mysqli_stmt_init($link);
        !           311:        if (!mysqli_stmt_prepare($stmt, "INSERT INTO test(id, label) VALUES (?, ?)"))
        !           312:                printf("[2000] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
        !           313: 
        !           314:        $id = null;
        !           315:        $label = null;
        !           316:        if (true !== ($tmp = mysqli_stmt_bind_param($stmt, "is", $id, $label)))
        !           317:                printf("[2001] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
        !           318: 
        !           319:        mysqli_stmt_execute($stmt);
        !           320: 
        !           321:        if (true !== ($tmp = mysqli_stmt_bind_param($stmt, "is", $id, $label)))
        !           322:                printf("[2002] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
        !           323: 
        !           324:        mysqli_stmt_close($stmt);
        !           325:        include("table.inc");
        !           326: 
        !           327:        if (!$stmt = mysqli_stmt_init($link))
        !           328:                printf("[2003] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
        !           329: 
        !           330:        if (!mysqli_stmt_prepare($stmt, "INSERT INTO test(id, label) VALUES (?, ?)"))
        !           331:                printf("[2004] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
        !           332: 
        !           333:        $id = $label = null;
        !           334:        if (true !== ($tmp = $stmt->bind_param('is', $id, $label)))
        !           335:                printf("[2005] Expecting boolean/true got %s/%s, [%d] %s\n",
        !           336:                        gettype($tmp), $tmp,
        !           337:                        $stmt->errno, $stmt->error);
        !           338: 
        !           339:        $id = 100; $label = 'z';
        !           340:        if (!$stmt->execute())
        !           341:                printf("[2006] [%d] %s\n", $stmt->errno, $stmt->error);
        !           342: 
        !           343:        if (!$res = mysqli_query($link, "SELECT id, label FROM test WHERE id = 100"))
        !           344:                printf("[2007] Expecting record 100/z, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
        !           345: 
        !           346:        if (!$row = mysqli_fetch_assoc($res))
        !           347:                printf("[2008] Expecting row, [%d] %s\n", mysqli_errno($link), mysqli_error($link));
        !           348: 
        !           349:        if ($row['id'] != 100  || $row['label'] != 'z') {
        !           350:                printf("[2009] Row seems wrong, dumping record\n");
        !           351:                var_dump($row);
        !           352:        }
        !           353:        mysqli_free_result($res);
        !           354: 
        !           355:        $value_list = array(array('id' => 101, 'label' => 'a'), array('id' => 102, 'label' => 'b'));
        !           356:        if (!mysqli_stmt_prepare($stmt, "INSERT INTO test(id, label) VALUES (?, ?)"))
        !           357:                printf("[2010] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
        !           358: 
        !           359:         foreach ($value_list as $k => $values) {
        !           360:                if (!mysqli_stmt_bind_param($stmt, 'is', $values['id'], $values['label'])) {
        !           361:                        printf("[2011] bind_param() failed for id = %d, [%d] %s\n",
        !           362:                                $values['id'], mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
        !           363:                        continue;
        !           364:                }
        !           365:                if (!$stmt->execute())
        !           366:                        printf("[2012] [%d] execute() failed for id = %d, [%d] %s\n",
        !           367:                                $values['id'], mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
        !           368: 
        !           369:                if (!$res = mysqli_query($link, sprintf("SELECT label FROM test WHERE id = %d", $values['id'])))
        !           370:                        printf("[2013] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
        !           371:                if (!$row = mysqli_fetch_assoc($res))
        !           372:                        printf("[2014] Cannot find row id = %d\n", $values['id']);
        !           373:                else if (isset($row['label']) && ($values['label'] != $row['label']))
        !           374:                        printf("[2015] Expecting label = %s, got label = %s\n", $values['label'], $row['label']);
        !           375: 
        !           376:                mysqli_free_result($res);
        !           377:        }
        !           378: 
        !           379:        mysqli_stmt_close($stmt);
        !           380:        mysqli_close($link);
        !           381: 
        !           382:        /* Check that the function alias exists. It's a deprecated function,
        !           383:        but we have not announce the removal so far, therefore we need to check for it */
        !           384:        if (!is_null($tmp = @mysqli_stmt_bind_param()))
        !           385:                        printf("[021] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
        !           386:        print "done!";
        !           387: ?>
        !           388: --CLEAN--
        !           389: <?php
        !           390:        require_once("clean_table.inc");
        !           391: ?>
        !           392: --EXPECTF--
        !           393: Warning: mysqli_stmt_bind_param(): Number of elements in type definition string doesn't match number of bind variables in %s on line %d
        !           394: 
        !           395: Warning: mysqli_stmt_bind_param(): Number of elements in type definition string doesn't match number of bind variables in %s on line %d
        !           396: 
        !           397: Warning: mysqli_stmt_bind_param(): Number of variables doesn't match number of parameters in prepared statement in %s on line %d
        !           398: 
        !           399: Warning: mysqli_stmt_bind_param(): Number of elements in type definition string doesn't match number of bind variables in %s on line %d
        !           400: 
        !           401: Warning: mysqli_stmt_bind_param(): Undefined fieldtype a (parameter 3) in %s on line %d
        !           402: 
        !           403: Warning: mysqli_stmt_bind_param(): Undefined fieldtype a (parameter 4) in %s on line %d
        !           404: done!

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>