--- /dev/null
+--TEST--
+mysqli_stmt_bind_param used with call_user_func_array() (see also bug #43568)
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+require_once('skipifemb.inc');
+require_once('skipifconnectfailure.inc');
+
+// TODO remove once a decision has been made on call_user_func_array()
+if (version_compare(PHP_VERSION, '5.3.0-dev') == -1)
+ die("skip needs PHP 5.3.0-dev+, see http://bugs.php.net/bug.php?id=43568");
+?>
+--FILE--
+<?php
+ require('connect.inc');
+ require('table.inc');
+
+ if (!$stmt = mysqli_stmt_init($link))
+ printf("[001] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+
+ if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
+ printf("[002] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ $id = 1;
+ if (!mysqli_stmt_bind_param($stmt, 'i', $id) ||
+ !mysqli_stmt_execute($stmt))
+ printf("[003] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ $id = $label = null;
+ if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
+ (true !== mysqli_stmt_fetch($stmt)))
+ printf("[004] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ print "Regular, procedural, using variables\n";
+ var_dump($id);
+ var_dump($label);
+
+ mysqli_stmt_close($stmt);
+ if (!$stmt = mysqli_stmt_init($link))
+ printf("[005] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+
+ if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
+ printf("[006] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ $types = 'i';
+ $id = 1;
+ $params = array(
+ 0 => &$stmt,
+ 1 => &$types,
+ 2 => &$id
+ );
+ if (!call_user_func_array('mysqli_stmt_bind_param', $params))
+ printf("[007] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ if (!mysqli_stmt_execute($stmt))
+ printf("[008] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ $id = $label = null;
+ if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
+ (true !== mysqli_stmt_fetch($stmt)))
+ printf("[009] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ print "Call user func, procedural, using references for everything\n";
+ var_dump($id);
+ var_dump($label);
+
+ mysqli_stmt_close($stmt);
+ if (!$stmt = mysqli_stmt_init($link))
+ printf("[010] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+
+ if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
+ printf("[011] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ $types = 'i';
+ $id = 1;
+ $params = array(
+ 0 => &$types,
+ 1 => &$id
+ );
+ if (!call_user_func_array(array($stmt, 'bind_param'), $params))
+ printf("[012] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ if (!mysqli_stmt_execute($stmt))
+ printf("[013] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ $id = $label = null;
+ if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
+ (true !== mysqli_stmt_fetch($stmt)))
+ printf("[014] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ print "Call user func, object oriented, using references for everything\n";
+ var_dump($id);
+ var_dump($label);
+
+ mysqli_stmt_close($stmt);
+ if (!$stmt = mysqli_stmt_init($link))
+ printf("[015] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+
+ if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
+ printf("[016] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ $types = 'i';
+ $id = 1;
+ $params = array(
+ 0 => $types,
+ 1 => &$id
+ );
+ if (!call_user_func_array(array($stmt, 'bind_param'), $params))
+ printf("[017] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ if (!mysqli_stmt_execute($stmt))
+ printf("[018] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ $id = $label = null;
+ if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
+ (true !== mysqli_stmt_fetch($stmt)))
+ printf("[019] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ print "Call user func, object oriented, using variable for types. using references for bound parameter\n";
+ var_dump($id);
+ var_dump($label);
+
+ mysqli_stmt_close($stmt);
+ if (!$stmt = mysqli_stmt_init($link))
+ printf("[020] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+
+ if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
+ printf("[021] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ $id = 1;
+ $params = array(
+ 0 => 'i',
+ 1 => &$id
+ );
+ if (!call_user_func_array(array($stmt, 'bind_param'), $params))
+ printf("[022] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ if (!mysqli_stmt_execute($stmt))
+ printf("[023] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ $id = $label = null;
+ if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
+ (true !== mysqli_stmt_fetch($stmt)))
+ printf("[024] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ print "Call user func, object oriented, using constant for types. using references for bound parameter\n";
+ var_dump($id);
+ var_dump($label);
+
+ mysqli_stmt_close($stmt);
+ if (!$stmt = mysqli_stmt_init($link))
+ printf("[025] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+
+ if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
+ printf("[026] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ $types = 'i';
+ $id = 1;
+ $params = array(
+ 0 => &$stmt,
+ 1 => $types,
+ 2 => &$id
+ );
+ if (!call_user_func_array('mysqli_stmt_bind_param', $params))
+ printf("[027] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ if (!mysqli_stmt_execute($stmt))
+ printf("[028] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ $id = $label = null;
+ if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
+ (true !== mysqli_stmt_fetch($stmt)))
+ printf("[029] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ print "Call user func, procedural, using references for everything but using variable for types\n";
+ var_dump($id);
+ var_dump($label);
+
+ mysqli_stmt_close($stmt);
+ if (!$stmt = mysqli_stmt_init($link))
+ printf("[025] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+
+ if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
+ printf("[026] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ $types = 'i';
+ $id = 1;
+ $params = array(
+ 0 => $stmt,
+ 1 => $types,
+ 2 => &$id
+ );
+ if (!call_user_func_array('mysqli_stmt_bind_param', $params))
+ printf("[027] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ if (!mysqli_stmt_execute($stmt))
+ printf("[028] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ $id = $label = null;
+ if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
+ (true !== mysqli_stmt_fetch($stmt)))
+ printf("[029] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ print "Call user func, procedural, using references for bound parameter, using variables for resource and types\n";
+ var_dump($id);
+ var_dump($label);
+
+ mysqli_stmt_close($stmt);
+ if (!$stmt = mysqli_stmt_init($link))
+ printf("[030] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+
+ if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
+ printf("[031] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ $types = 'i';
+ $id = 1;
+ $params = array(
+ 0 => $stmt,
+ 1 => $types,
+ 2 => &$id
+ );
+ if (!call_user_func_array('mysqli_stmt_bind_param', $params))
+ printf("[032] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ if (!mysqli_stmt_execute($stmt))
+ printf("[033] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ $id = $label = null;
+ if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
+ (true !== mysqli_stmt_fetch($stmt)))
+ printf("[034] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ print "Call user func, procedural, using references for bound parameter, using variables for resource and types\n";
+ var_dump($id);
+ var_dump($label);
+
+ mysqli_stmt_close($stmt);
+ if (!$stmt = mysqli_stmt_init($link))
+ printf("[035] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+
+ if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
+ printf("[036] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ $id = 1;
+ $params = array(
+ 0 => $stmt,
+ 1 => 'i',
+ 2 => &$id
+ );
+ if (!call_user_func_array('mysqli_stmt_bind_param', $params))
+ printf("[037] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ if (!mysqli_stmt_execute($stmt))
+ printf("[038] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ $id = $label = null;
+ if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
+ (true !== mysqli_stmt_fetch($stmt)))
+ printf("[039] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ print "Call user func, procedural, using references for bound parameter, using variable for resource, using constant for types\n";
+ var_dump($id);
+ var_dump($label);
+
+ mysqli_stmt_close($stmt);
+ if (!$stmt = mysqli_stmt_init($link))
+ printf("[040] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+
+ if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
+ printf("[041] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ $id = 1;
+ if (!call_user_func_array('mysqli_stmt_bind_param', array($stmt, 'i', &$id)))
+ printf("[042] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ if (!mysqli_stmt_execute($stmt))
+ printf("[043] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ $id = $label = null;
+ if (!mysqli_stmt_bind_result($stmt, $id, $label) ||
+ (true !== mysqli_stmt_fetch($stmt)))
+ printf("[044] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ print "Call user func, procedural, using references for bound parameter, using variable for resource, using constant for types, array\n";
+ var_dump($id);
+ var_dump($label);
+
+ //
+ // Any of those shall fail - see also bugs.php.net/43568
+ //
+ mysqli_stmt_close($stmt);
+ if (!$stmt = mysqli_stmt_init($link))
+ printf("[045] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+
+ if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
+ printf("[046] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ $id = 1;
+ $params = array(
+ 0 => 'i',
+ 1 => $id
+ );
+ if (call_user_func_array(array($stmt, 'bind_param'), $params))
+ printf("[047] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ if (!mysqli_stmt_execute($stmt))
+ printf("[048] [%d] (Message might vary with MySQL Server version, e.g. No data supplied for parameters in prepared statement)\n", mysqli_stmt_errno($stmt));
+
+ mysqli_stmt_close($stmt);
+ if (!$stmt = mysqli_stmt_init($link))
+ printf("[049] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+
+ if (!mysqli_stmt_prepare($stmt, 'SELECT id, label FROM test WHERE id = ?'))
+ printf("[050] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ $types = 'i';
+ $id = 1;
+ $params = array(
+ 0 => $stmt,
+ 1 => 'i',
+ 2 => $id
+ );
+ if (call_user_func_array('mysqli_stmt_bind_param', $params))
+ printf("[051] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+
+ if (!mysqli_stmt_execute($stmt))
+ printf("[052] [%d] (Message might vary with MySQL Server version, e.g. No data supplied for parameters in prepared statement)\n", mysqli_stmt_errno($stmt));
+
+ print "done!";
+?>
+--EXPECTF--
+Regular, procedural, using variables
+int(1)
+string(1) "a"
+Call user func, procedural, using references for everything
+int(1)
+string(1) "a"
+Call user func, object oriented, using references for everything
+int(1)
+string(1) "a"
+Call user func, object oriented, using variable for types. using references for bound parameter
+int(1)
+string(1) "a"
+Call user func, object oriented, using constant for types. using references for bound parameter
+int(1)
+string(1) "a"
+Call user func, procedural, using references for everything but using variable for types
+int(1)
+string(1) "a"
+Call user func, procedural, using references for bound parameter, using variables for resource and types
+int(1)
+string(1) "a"
+Call user func, procedural, using references for bound parameter, using variables for resource and types
+int(1)
+string(1) "a"
+Call user func, procedural, using references for bound parameter, using variable for resource, using constant for types
+int(1)
+string(1) "a"
+Call user func, procedural, using references for bound parameter, using variable for resource, using constant for types, array
+int(1)
+string(1) "a"
+[048] [2031] (Message might vary with MySQL Server version, e.g. No data supplied for parameters in prepared statement)
+[052] [2031] (Message might vary with MySQL Server version, e.g. No data supplied for parameters in prepared statement)
+done!
+--UEXPECTF--
+Regular, procedural, using variables
+int(1)
+unicode(1) "a"
+Call user func, procedural, using references for everything
+int(1)
+unicode(1) "a"
+Call user func, object oriented, using references for everything
+int(1)
+unicode(1) "a"
+Call user func, object oriented, using variable for types. using references for bound parameter
+int(1)
+unicode(1) "a"
+Call user func, object oriented, using constant for types. using references for bound parameter
+int(1)
+unicode(1) "a"
+Call user func, procedural, using references for everything but using variable for types
+int(1)
+unicode(1) "a"
+Call user func, procedural, using references for bound parameter, using variables for resource and types
+int(1)
+unicode(1) "a"
+Call user func, procedural, using references for bound parameter, using variables for resource and types
+int(1)
+unicode(1) "a"
+Call user func, procedural, using references for bound parameter, using variable for resource, using constant for types
+int(1)
+unicode(1) "a"
+Call user func, procedural, using references for bound parameter, using variable for resource, using constant for types, array
+int(1)
+unicode(1) "a"
+[048] [2031] (Message might vary with MySQL Server version, e.g. No data supplied for parameters in prepared statement)
+[052] [2031] (Message might vary with MySQL Server version, e.g. No data supplied for parameters in prepared statement)
+done!
\ No newline at end of file
--- /dev/null
+--TEST--
+mysqli_stmt_bind_result() - ZEROFILL
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+require_once('skipifemb.inc');
+require_once('skipifconnectfailure.inc');
+?>
+--FILE--
+<?php
+ require_once('connect.inc');
+ require_once('table.inc');
+
+ function zerofill($offset, $link, $datatype, $insert = 1) {
+
+ mysqli_query($link, 'ALTER TABLE test DROP zero');
+ $sql = sprintf('ALTER TABLE test ADD zero %s UNSIGNED ZEROFILL', $datatype);
+ if (!mysqli_query($link, $sql)) {
+ // no worries - server might not support it
+ return true;
+ }
+
+ if (!mysqli_query($link, sprintf('UPDATE test SET zero = %s', $insert))) {
+ printf("[%03d] UPDATE failed, [%d] %s\n",
+ $offset, mysqli_errno($link), mysqli_error($link));
+ return false;
+ }
+
+ if (!($stmt = mysqli_prepare($link, 'SELECT zero FROM test LIMIT 1'))) {
+ printf("[%03d] SELECT failed, [%d] %s\n",
+ $offset, mysqli_errno($link), mysqli_error($link));
+ return false;
+ }
+
+ $result = null;
+ if (!mysqli_stmt_bind_result($stmt, $result)) {
+ printf("[%03d] Bind failed, [%d] %s\n",
+ mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+ return false;
+ }
+
+ if (!mysqli_stmt_execute($stmt) || !mysqli_stmt_fetch($stmt)) {
+ printf("[%03d] Execute or fetch failed, [%d] %s\n",
+ mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+ return false;
+ }
+
+ $res = mysqli_stmt_result_metadata($stmt);
+ $meta = mysqli_fetch_fields($res);
+ mysqli_stmt_free_result($stmt);
+
+ $meta = $meta[0];
+ $length = $meta->length;
+ if ($length > strlen($insert)) {
+
+ $expected = str_repeat('0', $length - strlen($insert));
+ $expected .= $insert;
+ if ($expected !== $result) {
+ printf("[%03d] Expecting '%s' got '%s'\n", $offset, $expected, $result);
+ return false;
+ }
+
+ } else if ($length <= 1) {
+ printf("[%03d] Length reported is too small to run test\n", $offset);
+ return false;
+ }
+
+
+ return true;
+ }
+
+ /*
+ We map those to PHP numeric types -
+ no padding/filling done. Neither with libmysql nor with mysqlnd.
+ zerofill(2, $link, 'TINYINT');
+ zerofill(3, $link, 'SMALLINT');
+ zerofill(4, $link, 'MEDIUMINT');
+ zerofill(5, $link, 'INT');
+ zerofill(6, $link, 'INTEGER');
+ zerofill(7, $link, 'BIGINT');
+ zerofill(8, $link, 'FLOAT');
+ zerofill(9, $link, 'DOUBLE');
+ zerofill(10, $link, 'DOUBLE PRECISION');
+ */
+ zerofill(11, $link, 'DECIMAL');
+ zerofill(12, $link, 'DEC');
+
+ mysqli_close($link);
+
+ print "done!";
+?>
+--EXPECTF--
+done!
\ No newline at end of file