php-src/ext/mysqli/tests/mysqli_stmt_bind_param_call_user_func.phpt
Ulf Wendel f316766afe MFH
Added:

  mysqli_fetch_assoc_zerofill.phpt
    checks for UNSIGNED ZEROFILL

  mysqli_stmt_bind_result_zerofill.phpt
    checks for UNSIGNED ZEROFILL

  mysqli_stmt_bind_param_call_user_func.phpt
    Needs to be refined once http://bugs.php.net/bug.php?id=43568
    has been closed and a decision has been made on call_user_func_array().
    There seems to be a BC break between 5_2 -> 5_3 .
    Johannes has an eye on it

Modified:

  mysqli_change_user_insert_id.phpt
    skip test for buggy MySQL Server versions

  mysqli_insert_id.phpt
    added additional checks
2008-01-04 18:20:53 +00:00

398 lines
14 KiB
PHP

--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!