为什么要调用 call_user_func_array(array($statement, 'bind_param'), $bind_arguments)?因为 $bind_arguments 是一个数组。无论您有多少参数,您都将拥有一个将语句绑定到其查询参数的函数。
好的代码示例...
<?php
# link
$dblink = new mysqli('HOSTNAME','USERNAME','PASSWORD','DATABASENAME');
# example data
$statement = $dblink->prepare("SELECT * from Person WHERE FirstName = ? AND MiddleName = ? AND LastName = ? and Age = ?");
$recordvalues = ['John', 'H.', 'Smith', 25];
$sqlbindstring = "sssi"; # String, String, String, Integer example
# make the references
$bind_arguments = [];
$bind_arguments[] = $sqlbindstring;
foreach ($recordvalues as $recordkey => $recordvalue)
{
$bind_arguments[] = & $recordvalues[$recordkey]; # bind to array ref, not to the temporary $recordvalue
}
# query the db
call_user_func_array(array($statement, 'bind_param'), $bind_arguments); # bind arguments
$statement->execute(); # run statement
$result = $statement->get_result(); # get results
# get the results
if($result) {
while ($row = $result->fetch_assoc()) {
print("\n\nMy row is...");
print_r($row);
}
}
?>
错误代码示例...
<?php
# Same setup as above..
$statement->prepare("SELECT * from Person WHERE FirstName = ? AND MiddleName = ? AND LastName = ? and Age = ?");
$statement->bind('John', 'H.", 'Smith', 25);
?>
在第一个示例中:您可以将尽可能多的或尽可能少的传递给要完成的绑定,以便在整个应用程序中仅在一行中调用 bind()。这可以很好地扩展。
在第二个示例中:您必须为数据库中每个可能的记录的每个可能的插入组编写一个 bind() 语句。这很难扩展。